3

我正在通过将 JavaCC 转换为 ANTLR4 来编写编译器,其中一条规则涉及传递参数并从中获取返回值。

对于规则“术语”,我必须执行以下操作:

Term term(ReadOptions options, int priority):
{
  int p = options.operatorSet.getNextLevel(priority);
  Term t;
}
{
  (
    LOOKAHEAD({p==0})
    t = simpleTerm(options)
  |
    LOOKAHEAD(<NAME_TOKEN>,{priority==1201 && is1201Separator(2)})
    t = name()
  |
    t = operatorTerm(options, p)
  )
  {return t;}
}

问题是我如何根据'p'的值匹配子规则。在以前的 ANTLR 版本中,我可以使用 => 并且我的问题已经解决了,但是在 ANTLR4 中我该怎么办?

4

1 回答 1

5

=>ANTLR 4 中不再需要以前版本的 ANTLR 中的运算符。

  • ANTLR 4 不支持语法谓词​​,因为它的前瞻算法完全支持无限前瞻。如果您(x) => y以前使用过该表格,那么在 ANTLR 4 中您可以简单地使用y.
  • 语义谓词仍受支持,但在 ANTLR 4 中,所有语义谓词的工作方式与 ANTLR 3 中的门控语义谓词类似。如果您{x}? => y以前使用过这种形式,那么在 ANTLR 4 中您可以简单地使用{x}? y.
于 2013-06-11T22:32:25.067 回答