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字符流转换为一系列标记,这些步骤依次应用:
将Unicode字符的原始流中的Unicode转义(第3.3节)转换为相应的Unicode字符.形式为\ uxxxx的Unicode转义,其中xxxx是十六进制值,表示编码为xxxx的UTF-16代码单元.此转换步骤允许使用仅ASCII字符表示任何程序.
将步骤1生成的Unicode流转换为输入字符和行终止符流(§3.4).
将步骤2产生的输入字符和行终止符流转换为输入元素序列(第3.5节),在输出元素(第3.6节)和注释(第3.7节)之后,它们包含令牌(§3.5)这是句法语法的终点符号(§2.3).
每个步骤都使用尽可能长的翻译,即使结果最终没有形成正确的程序而另一个词汇翻译也会如此.
(因此,输入字符
a--b被标记化(§3.5)asa, --, b,这不是任何语法正确的程序的一部分,即使标记化a, -, -, b可能是语法正确的程序的一部分.)
| 归档时间: |
|
| 查看次数: |
462 次 |
| 最近记录: |