我正在尝试使用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
时,怎么可能?
答案 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 */
;