ANTLR:无法链接子规则方法调用

时间:2019-03-01 04:51:09

标签: antlr antlr4

我正在尝试使用ANTLR访问者找到某个令牌的第一个字符的列位置。这是我的规则(为演示而简化):

expExpr : PLUS expExprTail ;
expExprTail : EXP expExpr       #expExprTailOpLabel
  | /* epsilon */               #expExprTailEpsLabel
  ;

(请注意,我在expExprTail中使用了两个规则的标签)

我要找到给定令牌的位置当我处于expExpr规则中(那是我确定发生错误的时间)。但是令牌是expExpr规则中通过expExprTail规则访问的第一个令牌。

我的想法是(在访问者中)可以这样访问:

  @Override public void visitExpExpr(LangParser.ExpExprContext ctx) { 
    ExpExprContext expExprContext = ctx.expExprTail().expExpr();
  }

但是,该代码无法编译,并且ANTLR报告它无法在expExpr()类上找到ExpExprTailContext方法。当expExpr规则中引用了expExprTail时,怎么可能?

1 个答案:

答案 0 :(得分:1)

给出解析器规则foo

foo
 : A
 | B
 ;

生成以下方法:

T visitFoo(TParser.FooContext ctx)

但是在向该解析器规则添加带标签的替代项时:

foo
 : A  #altFooA
 | B  #altFooB
 ;

visitFoo将不再可用(TParser.FooContext也将不再可用!),并将由以下规则代替:

T visitAltFooA(TParser.AltFooAContext ctx)

T visitAltFooB(TParser.AltFooBContext ctx) 

如果您想直接访问exprExpr之类的ctx.expExprTail().expExpr()规则,则必须删除alt标签:

expExpr : PLUS expExprTail ;
expExprTail : EXP expExpr
  | /* epsilon */
  ;