关于Oracle Java规范中数组初始化语法规则的疑问
先明确你提到的Java语法规则及符号约定:
ArrayInitializer:
{[VariableInitializerList] [,]}VariableInitializerList:
VariableInitializer {, VariableInitializer}
规则中的符号约定:[x]表示x出现0次或1次,{x}表示x出现0次或多次。
针对你的疑问逐一解答:
疑问1:ArrayInitializer中的第一个
{是终结符还是语法含义?
这里的{是终结符大括号,也就是Java代码中实际需要编写的字符。语法规则里,只有被[x]或{x}包裹的部分才表示语法重复/可选约定,单独的{}就是代码里的实际符号。疑问2:VariableInitializerList的语法是否会接受不符合标准的字符串?
VariableInitializer {, VariableInitializer}等价于正则表达式VariableInitializer (, VariableInitializer)*,意思是必须以一个VariableInitializer开头,后面可以跟任意多组, VariableInitializer。这个规则只会接受合法的数组元素列表,比如a、a,b、a,b,c这类,不会出现,a(前置逗号)、a,,b(连续逗号)这类不符合Java规范的格式,完全匹配Java数组初始化的合法写法。疑问3:第一条产生式中的方括号是正则含义还是普通终结符?
这里的方括号是语法约定的含义,表示括号内的内容可选(出现0次或1次),不是Java代码里要写的方括号。比如以下几种写法都是合法的数组初始化器:{}(空数组)、{a}、{a,}、{a,b}、{a,b,},对应了不同的可选组合情况。
内容的提问来源于stack exchange,提问作者Deepak Sangle

