是否使用特殊规则标记了类型参数中的">>"?

Mat*_*ick 12 java parsing token

我对Java规范应该如何标记这个代码感到困惑:

ArrayList<ArrayList<Integer>> i;
Run Code Online (Sandbox Code Playgroud)

规范说:

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

据我了解,应用"最长匹配"规则会产生令牌:

  • 数组列表
  • <
  • 数组列表
  • <
  • 整数
  • >>
  • 一世
  • ;

哪个不会解析.但当然这个代码解析得很好.

这种情况的正确规范是什么?

这是否意味着正确的词法分析器必须无上下文?使用常规词法分析器似乎不可能.

Mat*_*ick 4

根据阅读@sm4 链接的代码,策略看起来是:

  • 正常地标记输入。因此A<B<C>> i;将被标记为A, <, B, <, C, >>, i, ;——8 个标记,而不是 9 个。

  • 在分层解析期间,当解析泛型并且>需要 a 时,如果下一个标记以>-- >>>>>>=>>=>>>=-- 开头,只需>将缩短的标记推回标记流即可。示例:当解析器>>, i, ;在处理 typeArguments 规则时到达,它成功解析了 typeArguments,并且剩余的令牌流现在略有不同>, i, ;,因为第一个>被拉>>下来以匹配 typeArguments。

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