Antlr4在extends Parser
内创建方法,其名称与规则相同。例如,如果我的语法中有一个名为“program”的规则,它将创建方法program()
。我可以调用这个方法来进行解析。
但是如果我希望在运行时选择启动规则呢?
我查看了实现并找到了开头
public final ProgramContext program() throws RecognitionException {
ProgramContext _localctx = new ProgramContext(_ctx, getState());
enterRule(_localctx, 0, RULE_program);
它暗示,我无法按名称或索引选择规则,因为我需要同时处理两件事:ProgramContext
类和RULE_program
常量。
事实上可能吗?
我可以定义一些默认规则并自动调用吗?
答案 0 :(得分:1)
所有解析器语法规则都是由生成的解析器中的方法实现的。如果您的语法定义
program : .... ;
statemt : .... ;
语法将有方法
public final ProgramContext program() throws RecognitionException ....
public final StatemtContext statemt() throws RecognitionException ....
可以将其中任何一个称为评估令牌流的开始规则。
请参阅此answer,建议以编程方式识别解析器规则的方法。
答案 1 :(得分:0)
不,生成的解析器无法实现这一点。但是,请查看ParserInterpreter类(允许指定起始规则索引)。这个类模拟真正的解析器,但工作方式与此不同,可能不是你想要的,但也许它会给你一个想法。
答案 2 :(得分:0)
据我了解,您可以通过反思选择任何起始规则。我建议在Java上使用以下代码作为示例:
Method startMethod = parser.getClass().getMethod("customStartRule", new Class[] {});
ParserRuleContext ast = (ParserRuleContext)startMethod.invoke(parser, new Object[] {});
您可以在生成的解析器中的ruleNames
数组中找到所有启动规则。