Java 是"&燃气轮机&燃气轮机&引用;使用特殊规则标记的类型参数中的?

Java 是"&燃气轮机&燃气轮机&引用;使用特殊规则标记的类型参数中的?,java,parsing,token,Java,Parsing,Token,我对如何标记此代码感到困惑: ArrayList<ArrayList<Integer>> i; ArrayList lexer.基于阅读,策略似乎是: 正常地标记输入。Soai将被标记为A,i--8个令牌,而不是9个 在分层解析过程中,在解析泛型和需要使用时,如果下一个令牌以-->,>,=,=,>=,或>=开头,只需将敲掉并将缩短的令牌推回到令牌流中即可。示例:当解析器到达>时,i在处理typeArguments规则时,它成功地解析了typeArguments,剩下的

我对如何标记此代码感到困惑:

ArrayList<ArrayList<Integer>> i;
ArrayList lexer.

基于阅读,策略似乎是:

  • 正常地标记输入。So
    ai将被标记为
    A,i--8个令牌,而不是9个

  • 在分层解析过程中,在解析泛型和需要使用
    时,如果下一个令牌以
    -->
>
=
=
>=
,或
>=
开头,只需将
敲掉并将缩短的令牌推回到令牌流中即可。示例:当解析器到达
>时,i在处理typeArguments规则时,它成功地解析了typeArguments,剩下的令牌流现在是稍微不同的
>,i,因为
>
的第一个
被删除以匹配类型参数


因此,尽管标记化确实正常发生,但如有必要,在分层解析阶段会发生一些重新标记化。

Java 10语言规范(3.2词汇翻译)指出:

每一步都使用尽可能长的翻译,即使结果最终不能生成正确的程序,而另一个词汇翻译可能会生成正确的程序。有一个例外:如果在类型上下文(§4.11)中发生词法转换,并且输入流有两个或多个连续的>字符,后跟一个非->字符,则每个>字符必须转换为数值比较运算符的标记>
输入字符a--b被标记化(§3.5)为a,--,b,这不是任何语法正确程序的一部分,即使标记化a,--,b可能是语法正确程序的一部分。
如果没有>字符规则,类型(如
List
中的两个连续>括号将标记为有符号右移运算符>>,而类型(如
List
中的三个连续>括号将标记为无符号右移运算符>>)。更糟糕的是,类型(如
列表
)中四个或更多连续的>括号的标记化将是不明确的,因为>>、>>和>>>标记的各种组合可能表示>>>>字符


< >早期的C++版本显然也受到了影响,因此在两个相邻的(小于)代码(如代码>矢量< /代码>之间至少需要一个空白。幸运的是,不再是了。

相关:我想你的意思是
I
,而不是你的令牌列表中的
1
。也许你可以提交一个bug。@johnchen902是bug吗?我没有考虑过这种可能性。不过,我真的不这么认为。我不认为这是一只虫子。可能是文档中的错误。您可以从下面的代码中看出泛型是如何解析的:为什么编译器不重新标记诸如
a--b
?@johnchen902为什么应该?Retokenization不是拯救失败解析的一般策略,它只在一种特殊情况下使用,这样您就不必编写
a