2016-07-28 1 views
0

現在、私はANTLR4のための私の木のリスナーの実装では、メイン・コンテキストの私のサブコンテキストにアクセスするには、このようなコードを使用しています:ANTLR4ツリー・リスナーでメイン・コンテキストのアクセスサブコンテキスト

ctx.children.forEach(function(child) { 
    if (child.ITALIC != undefined) { 
     var text = child.ITALIC().getText(); 

     ... 
    } else if (child.LABELREF != undefined) { 
     var text = child.LABELREF().getText(); 

     ... 
    } 

    ... 

JavaScript ANTLR4ターゲットを使用しているため、これがこのような情報にアクセスする正しい方法であるかどうかはわかりません。

これがC#またはJavaターゲットである場合、私は最良の方法を見つけるだろうと思っています。または、この結果は

child.ITALIC != null 

となるでしょうか?

私が得た結果は問題なく、すべてが機能しています。しかし、もっと良い解決策があれば私は興味があります。

答えて

1

はい、これは個々のサブパートにアクセスする方法です。また、ParseTreeインスタンス(実際にはターミナルかどうかに応じて、TerminalNodeまたはRuleContextインスタンスのいずれか)を含むメインコンテキストのchildrensプロパティを使用できます。このようにして、個々のサブコンテキスト(いずれにしてもchildrensリストの別のビュー)を確認する必要はありません。

サイドノート:サブコンテキストの代わりに、文法の変数を使用することもできます。

expr: 
    left = INT op = ('+' | '-') right = INT 
    | left = INT op = ('*' | '/') right = INT 
; 

これはサブコンテキストに行かずに直接アクセスできる変数leftrightを作成します。

+0

ありがとうございます。私はchildrensプロパティと、その中の異なるContextまたはTerminalNodeインスタンスを見ました。しかし、私はJavaScriptの型をチェックする必要があり、個々のサブコンテキストメソッドが少し使いやすくなっていると思ったのですか? – FDeitelhoff

+0

はい、使用するのが簡単で、個々のアクセス機能を使用するコードは自己説明的です。しかし、特別なアクセス関数のどれかが期待値を返さないかどうかをチェックするために、子配列がすべての究極のソースであり、最適な点です。 –

+0

それは理にかなっている。ありがとう! – FDeitelhoff