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

时间:2013-09-05 18:59:29

标签: java syntax tokenize

在Java中,表达式为:

n+++n

似乎评估为等同于:

n++ + n

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

然而,表达式:

n++++n

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

n++ + +n

++n+n被指定为具有相同的优先级,那么为什么编译器会解决n+++n中的看似歧义,而不是算术+,而不是使用n++++n执行此操作?

1 个答案:

答案 0 :(得分:17)

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

n ++ ++ n

这不是有效的表达方式。

来自JLS §3.2

  

3.2。词汇翻译

     

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

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

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

  4.   
  5. 将步骤2产生的输入字符和行终止符流转换为输入元素序列   (§3.5),在空格(§3.6)和评论(§3.7)之后   丢弃,包括作为终端符号的令牌(§3.5)   句法语法(§2.3)。

  6.         

    每个步骤都使用尽可能长的翻译,即使结果最终没有制作出正确的节目而另一个   词汇翻译会。

         

    (因此,输入字符a--b被标记化(§3.5)为a, --, b,   这虽然不是任何语法正确的程序的一部分   标记化a, -, -, b可以是语法正确的一部分   程序。)