2016-12-21 37 views
1

Antlr4在extends Parser內部創建了名稱與規則相同的方法。例如,如果我在我的語法中有名爲「程序」的規則,它將創建方法program()。我可以調用這個方法來做解析。如何在運行時選擇Antlr4啓動規則?

但是如果我希望在運行時選擇啓動規則呢?

我看着落實,發現開始

public final ProgramContext program() throws RecognitionException { 
    ProgramContext _localctx = new ProgramContext(_ctx, getState()); 
    enterRule(_localctx, 0, RULE_program); 

它意味着,我不能選擇按名稱或索引規則,因爲我需要同時兩件事情:ProgramContext類和RULE_program不變。

事實上有可能嗎?

我可以定義一些默認規則並自動調用它嗎?

回答

1

所有解析器語法規則都是由生成的解析器中的方法實現的。如果你的語法定義

program : .... ; 
statemt : .... ; 

語法會有方法

public final ProgramContext program() throws RecognitionException .... 
public final StatemtContext statemt() throws RecognitionException .... 

要麼可以被稱爲評估令牌流的開始規則。

請參閱此answer建議一種以編程方式標識解析器規則的方法。

0

不,這不適用於生成的解析器。但是,請查看ParserInterpreter類(它允許指定啓動規則索引)。這個類模擬真正的解析器,但工作方式不同於此,可能不是你想要的,但也許它給你一個想法。

0

據我所知,你可以通過反射選擇任何起始規則。我建議在Java中下面的代碼爲例:

Method startMethod = parser.getClass().getMethod("customStartRule", new Class[] {}); 
ParserRuleContext ast = (ParserRuleContext)startMethod.invoke(parser, new Object[] {}); 

所有啓動規則,你可以在生成的解析器ruleNames陣列找到。