2016-09-04 12 views
0

でルールをトリガするトークンを検出:私はこの非常に単純な文法を持ってANTLR4

public class DLRBaseListener implements DLRListener { 

@Override public void enterDlr(DLRParser.DlrContext ctx) { } 

@Override public void exitDlr(DLRParser.DlrContext ctx) { } 

@Override public void enterC(DLRParser.CContext ctx) { } 

@Override public void exitC(DLRParser.CContext ctx) { } 

@Override public void enterEveryRule(ParserRuleContext ctx) { } 

@Override public void exitEveryRule(ParserRuleContext ctx) { } 

@Override public void visitTerminal(TerminalNode node) { } 

@Override public void visitErrorNode(ErrorNode node) { } 

}

:私はantlr4コマンドを使用して、Javaコードを生成すると、私はJavaのインタフェースDLRBaseListenerを得た
grammar DLR; 
dlr : c 'sub' c ; 
c : CN | 'not' c | c 'and' c | c 'or' c ; 
CN : [A-Z]+ ; 
WS : [ \t\r\n]+ -> skip ; // skip spaces, tabs, newlines 

特に、ルールがトリガーされたときに検出する場合は、このインターフェイスを拡張することができます。したがって、enterDlr、exitDlr、enterC、exitCなどのメソッドは非常に便利です。 私の目標はより具体的です。そのルールをトリガーするトークンを検出したいと思います。私の例では、 'c、c'、 'c、c'または 'c'ではありません。 ご覧のとおり、これらのメソッドはインターフェイスにありません。 文法のそれらの部分を検出する方法はありますか?

+0

文法を制御できますか? –

答えて

1

ANTLR4この機能を達成するために、「代替標識」(TDARのPG 117、261)を提供する:

c : CN   # justCN 
    | 'not' c  # notC 
    | c 'and' c # andC 
    | c 'or' c # orC 
    ; 

ツールは、標識の各々について別個のパーサコンテキスト(Javaでのルールのコンテキストのサブクラス)を生成しますラベル名に基づいた名前の代替案そして、対応する入力/出力リスナメソッド。

関連する問題