如何在运行时选择ANTLR4起始规则



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数组中找到所有启动规则。

相关内容

  • 没有找到相关文章

最新更新