在ANTLR4中是否可以在不实际匹配令牌的情况下进行前瞻?

在ANTLR4中是否可以在不实际匹配令牌的情况下进行前瞻?,antlr4,Antlr4,我正在编写一个编译器,将JavaCC转换为ANTLR4,其中一个规则涉及传递参数并从中获取返回值 对于规则“术语”,我必须执行以下操作: Term term(ReadOptions options, int priority): { int p = options.operatorSet.getNextLevel(priority); Term t; } { ( LOOKAHEAD({p==0}) t = simpleTerm(options) | LOO

我正在编写一个编译器,将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;}
}
术语(ReadOptions选项,int优先级):
{
int p=options.operatorSet.getNextLevel(优先级);
术语t;
}
{
(
前瞻({p==0})
t=简单表(选项)
|
前瞻(,{priority==1201&&is1201Separator(2)})
t=名称()
|
t=操作员终端(选项,p)
)
{返回t;}
}

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

在ANTLR的早期版本中,不再需要使用
=>
操作符

  • ANTLR 4不支持语法谓词,因为其前瞻算法完全支持无限前瞻。如果您以前使用了
    (x)=>y
    ,那么在ANTLR 4中,您只需使用
    y
  • 语义谓词仍然受支持,但在ANTLR4中,所有语义谓词的工作方式与ANTLR3中的门控语义谓词类似。如果您使用的是
    {x}?=>y
    之前,那么在ANTLR 4中,您可以简单地使用
    {x}?y