是否可以在没有实际匹配令牌的情况下在ANTLR4中进行预测?

时间:2013-06-11 21:38:34

标签: antlr4

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

对于规则'term',我必须执行以下操作:

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中我可以使用=&gt;我的问题会解决,但我在ANTLR4做什么?

1 个答案:

答案 0 :(得分:5)

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

  • ANTLR 4不支持语法谓词​​,因为它的前瞻算法完全支持无限前瞻。如果您之前使用过表单(x) => y,则可以在ANTLR 4中使用y
  • 仍然支持语义谓词,但在ANTLR 4中,所有语义谓词都像ANTLR 3中的门控语义谓词一样工作。如果您之前使用过表单{x}? => y,那么在ANTLR 4中您只需使用{x}? y