为什么n +++ n有效而n ++++ n不是?

Tre*_*man 15 java syntax tokenize

在Java中,表达式:

n+++n
Run Code Online (Sandbox Code Playgroud)

似乎评估为等同于:

n++ + n
Run Code Online (Sandbox Code Playgroud)

尽管这+n是一个有效的一元运算符,其优先级高于算术运算+n + n.因此编译器似乎假设运算符不能是一元运算符并解析表达式.

但是,表达式:

n++++n
Run Code Online (Sandbox Code Playgroud)

不编译,即使有一个有效的可能性,它可以解决为:

n++ + +n
Run Code Online (Sandbox Code Playgroud)

++n并且+n被指定为具有相同的优先级,那么为什么编译器会解决看似模糊的问题而不n+++n支持算术,+但是不会这样做n++++n

zch*_*zch 18

首先使用最大munch规则将文件标记化(转换为标记序列) - 始终获得尽可能长的有效标记.您的文本将转换为以下序列:

n ++ ++ n
Run Code Online (Sandbox Code Playgroud)

这不是有效的表达方式.

来自JLS§3.2:

3.2.词汇翻译

使用以下三个词汇翻译步骤将原始Unicode字符流转换为一系列标记,这些步骤依次应用:

  1. 将Unicode字符的原始流中的Unicode转义(第3.3节)转换为相应的Unicode字符.形式为\ uxxxx的Unicode转义,其中xxxx是十六进制值,表示编码为xxxx的UTF-16代码单元.此转换步骤允许使用仅ASCII字符表示任何程序.

  2. 将步骤1生成的Unicode流转换为输入字符和行终止符流(§3.4).

  3. 将步骤2产生的输入字符和行终止符流转换为输入元素序列(第3.5节),在输出元素(第3.6节)和注释(第3.7节)之后,它们包含令牌(§3.5)这是句法语法的终点符号(§2.3).

每个步骤都使用尽可能长的翻译,即使结果最终没有形成正确的程序而另一个词汇翻译也会如此.

(因此,输入字符a--b被标记化(§3.5)as a, --, b,这不是任何语法正确的程序的一部分,即使标记化a, -, -, b可能是语法正确的程序的一部分.)