从编译器理论的角度来看,为什么javac编译器不接受x = x+++++y
形式的声明但接受x = x+++ ++y
?
答案 0 :(得分:8)
因为++
是java词法分析器的有效标记,所以语句x+++ ++y
将被解析为标记:
(x)(++)(+)( )(++)(y)
x+++++y
将被标记为无效:
(x)(++)(++)(+)(y)
以上是无效的java,因为++
运算符只能应用于数值变量,(x++)
的结果不是。这种类型的标记化是一个很好的例子,称为maximal munch。
每个步骤都使用尽可能长的翻译,即使结果最终没有形成正确的程序,而另一个词汇翻译也是如此。
因此,输入字符a-b被标记化(§3.5)为a, - ,b,它不是任何语法正确程序的一部分,即使标记化a, - , - ,b可能是其中的一部分一个语法正确的程序。