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

Ris*_*arg 3 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;}
}
Run Code Online (Sandbox Code Playgroud)

问题是我如何根据'p'的值匹配子规则.在以前版本的ANTLR中我可以使用=>而我的问题会解决,但我在ANTLR4中做什么?

Sam*_*ell 5

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

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