antlr4在 extends Parser
中创建方法,该方法的名称与规则相同。例如,如果我的语法中有规则名为"程序",则它将创建方法program()
。我可以称呼此方法进行解析。
但是,如果我想在运行时选择起始规则怎么办?
我研究了实施,并找到了开始
public final ProgramContext program() throws RecognitionException {
ProgramContext _localctx = new ProgramContext(_ctx, getState());
enterRule(_localctx, 0, RULE_program);
这意味着,我不能按名称或索引选择规则,因为我同时需要两件事: ProgramContext
class和 RULE_program
constant。
实际上有可能?
我可以定义一些默认规则并自动称其为?
所有解析器语法规则均由生成的解析器中的方法实现。如果您的语法定义
program : .... ;
statemt : .... ;
语法将具有方法
public final ProgramContext program() throws RecognitionException ....
public final StatemtContext statemt() throws RecognitionException ....
可以称为评估令牌流的开始规则。
请参阅此答案,建议一种编程方式识别解析器规则的方法。
否,生成的解析器是不可能的。但是,在ParserInterPreter类中查看(允许指定起始规则索引)。此类模仿真正的解析器,但其工作方式与此不同,可能不是您想要的,但也许它给了您一个想法。
,据我了解,您可以通过反射选择任何起始规则。我建议在Java上使用以下代码为例:
Method startMethod = parser.getClass().getMethod("customStartRule", new Class[] {});
ParserRuleContext ast = (ParserRuleContext)startMethod.invoke(parser, new Object[] {});
您可以在生成解析器中的ruleNames
数组中找到所有启动规则。