如何在运行时选择Antlr4启动规则?

时间:2016-12-21 13:58:30

标签: java antlr4

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常量。

事实上可能吗?

我可以定义一些默认规则并自动调用吗?

3 个答案:

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