对于一元运算符,运算符优先级或最大蒙克规则首先出现
在这里,我有以下代码:
int a,b,x; a=b=1; x=a+++b;
现在x
的值将是2,因为a
首先是后递增 ,然后它被添加到b
。
以下是编译的字节代码:
0 iconst_1 1 dup 2 istore_2 [b] 3 istore_1 [a] 4 iload_1 [a] 5 iinc 1 1 [a] 8 iload_2 [b] 9 iadd 10 istore_3 [x]
所以表达式将等于x = (a++) + b
。
现在另一个表达式x=a++++b
,由于最大的munch规则而无法编译。 它将成为x = (a++) ++ b
,因此编译错误。
上述x=a+++b
行为是因为运算符 ++的优先级还是因为最大的munch规则 ?
引用词汇翻译 :
在每一步都使用尽可能长的翻译,即使结果最终没有形成正确的程序,而另一个词汇翻译也是如此。
因此,输入字符a-b被标记化( §3.5 )为a , – , b ,它不是任何语法正确程序的一部分,即使标记化a , – , – , b可能是语法的一部分正确的程序。
这可以解释原因
x=a+++b
被解析为
x=(a++)+b
另一方面, a++++b
被标记为++ , ++ , b ,这会导致错误。
最大munch是在词法分析器中使用的规则,解析器中的运算符优先级,并且词法分析器在解析器之前在概念上运行。 因此, x=a+++b
变成x=(a++)+b
因为最大的munch规则,而不是运算符优先级:
当词法分析器看到a+++b
会将其转换为标记[标识符a
] [双加] [加号] [标识符b
]。 [double plus]令牌是由于最大的munch(采用最长匹配,而++
长于+
)。 然后,无论运算符优先级如何,解析器都只能将其转换为(a ++)+ b。
仅当“++”左侧有变量时,才会识别一元运算符“++”。 当你写一个+++ b时,第三个加号是二进制运算符“add”,而第一个运算符(++)是“递增变量1”。 当你写“a ++++”时,事情会失败,因为这就像写a
并且第一个运算符缺少一个参数。 第二对加号不被识别为“增量变量”,因为(a ++)不是变量。
现在有趣的是,Java编译器目前需要空格才能正确识别
z = a++ + ++b; // this works z = a+++++b; // this fails
作为一个旧的编译器编写器,我希望这两个结构应该在语法上被评估为相同(识别两个一元运算符++和++