antlr - ANTLR:不能链接子规则方法调用
问题描述
我试图在使用 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
规则?
解决方案
给定解析器规则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 */
;
推荐阅读
- java - 我的 alpha-beta 修剪算法有问题吗?
- python - 在 colab 中运行 jupyter 笔记本
- android - com.android.builder.internal.aapt.v2.Aapt2Exception:Android 资源链接失败
- python-2.7 - Python 2.7 导入 libsoundtouch
- mysql - 有任何 SQL GROUP_CONCAT 替代函数吗?
- intellij-idea - 使用 intellij 时 url 未标准化错误,但使用 STS 时没有
- vuejs2 - 基于数组列出无线电输入的问题
- javascript - TypeScript 中的类字典对象使用什么类型?
- haskell - 在haskell中一般遍历树的最简单方法
- javascript - 从客户端脚本获取价值并覆盖服务器端脚本