8

从编译器理论的角度来看,为什么 javac 编译器不接受形式的语句x = x+++++y而是接受x = x+++ ++y

4

1 回答 1

8

因为++是 Java 词法分析器的有效标记,所以该语句x+++ ++y将被解析为标记为:

(x)(++)(+)( )(++)(y)

x+++++y将被标记为无效:

(x)(++)(++)(+)(y)

以上是无效的java,因为++运算符只能应用于数字变量的东西,结果(x++)不是。这种类型的标记是被称为最大咀嚼概念的一个很好的例子。

来自JLS 第 3.2 节

每一步都使用尽可能长的翻译,即使结果最终不会产生正确的程序,而另一个词汇翻译会。

因此,输入字符 a--b 被标记化(第 3.5 节)为 a、-、b,这不是任何语法正确程序的一部分,即使标记化 a、-、-、b 在语法上可能是 a 的一部分正确的程序。

于 2013-05-10T08:59:48.663 回答