我很困惑Java规范 http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html关于如何将此代码标记化:
ArrayList<ArrayList<Integer>> i;
规范说:
每一步都会使用尽可能长的翻译,即使结果最终没有生成正确的程序,而另一个词法翻译却可以。
据我了解,应用“最长匹配”规则将产生令牌:
- 数组列表
- <
- 数组列表
- <
- Integer
- >>
- i
- ;
这不会解析。当然,这段代码解析得很好。
对于这种情况,正确的规格是什么?
这是否意味着正确的词法分析器必须是上下文无关的?似乎不可能regular http://en.wikipedia.org/wiki/Regular_grammar lexer.
基于阅读@sm4 链接的代码 http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/com/sun/tools/javac/parser/JavacParser.java#JavacParser.typeArguments%28boolean%29,看起来策略是:
正常地标记输入。所以A<B<C>> i;
将被标记为A, <, B, <, C, >>, i, ;
-- 8 个代币,而不是 9 个。
在分层解析期间,当解析泛型和>
需要,如果下一个标记以>
-- >>
, >>>
, >=
, >>=
, or >>>=
——只需敲击>
关闭并将缩短的令牌推回令牌流。示例:当解析器到达>>, i, ;
在处理 typeArguments 规则时,它成功解析了 typeArguments,并且剩余的令牌流现在略有不同>, i, ;
,从第一个>
of >>
被拉下来以匹配 typeArguments。
因此,尽管标记化确实正常发生,但如有必要,在分层解析阶段会发生一些重新标记化。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)