ANTLR4 ParserInterpreter解析树如何获取规则及对应备选分支号
ANTLR4无生成库场景下获取ParseTree规则及备选分支号解决方案
配置不生效的核心原因
你在语法文件中添加的options {contextSuperClass=org.antlr.v4.runtime.RuleContextWithAltNum;}配置仅对ANTLR生成的Parser代码生效,解释器模式下走的是通用解析逻辑,不会读取语法文件的配置项,因此需要手动在解释器初始化阶段显式开启相关能力。
具体实现步骤
- 初始化
ParserInterpreter时,手动指定RuleContext工厂为RuleContextWithAltNum的构造逻辑,示例代码如下:
interpreter.setRuleContextFactory((ruleIndex, parent, invokingState) -> { RuleContextWithAltNum ctx = new RuleContextWithAltNum(parent, invokingState); ctx.ruleIndex = ruleIndex; return ctx; });
- 开启解析阶段的备选分支号记录,调用
interpreter.getInterpreter().setForceAltNum(true)(ANTLR 4.9.2及以上版本支持该配置),确保分支匹配时会把编号写入上下文实例。 - 解析完成后从ParseTree节点提取信息:
- 调用
RuleContext.getRuleIndex()获取规则索引,和你提前从ATN中提取的规则名列表匹配即可得到节点对应的规则名称 - 将RuleContext强转为
RuleContextWithAltNum后调用getAltNumber()即可获取对应备选分支号,编号从1开始,和你语法文件中规则的备选分支定义顺序一一对应
- 调用
注意事项
如果使用的ANTLR版本低于4.9.2,没有
setForceAltNum接口,可以自定义ParserATNSimulator的子类,在匹配到备选分支后手动调用setAltNumber方法写入上下文实例,不需要修改核心逻辑。
内容的提问来源于stack exchange,提问作者Jack Roper
相关产品推荐
相关产品推荐

