15

解析ツリーを一般的にトラバースしながら、ANTLR4 の代替ラベルにアクセスするにはどうすればよいですか? ^または、代わりに、 ANTLR3のオペレーターの機能を複製する方法はありますか?

私は、単純な方法論 (別のラベルでプロダクションに名前を付けるなど) に準拠した ANTLR4 文法用の AST プリティ プリンターを作成しようとしています。次のような文法が与えられた場合、3 + 5asなどの用語をきれいに印刷できるようにしたいと思います。(int_expression (plus (int_literal 3) (int_literal 5)))

int_expression 
    : int_expression '+' int_expression # plus
    | int_expression '-' int_expression # minus
    | raw_int                           # int_literal
    ;
raw_int
    : Int
    ;
Int : [0-9]+ ;

plusおよびプロダクションに効果的に名前を付けることができません。minusそれらを独自のプロダクションに引き出すと、ルールが相互に左再帰的であるとツールが文句を言うからです。引き出せない場合、これらの作品に名前を付けるにはどうすればよいですか?

+注 1: 「良い」端末 (Int上記など) を特別なプロダクション (特別なプレフィックスで始まるプロダクション) に配置することで、方法論的に議論を取り除くことができましたraw_。次に、親プロダクションの名前が「raw_...」である端末のみを印刷し、他のすべてを除外することができました。これは、出力を保持し+ながら、を取り除くのに最適でした。これは、ANTLR3 で実行できます。35!

注 2: 特殊なプリティ プリンターを作成したり、特定の言語の各プロダクションに対してアクションを使用したりできることは理解していますが、ANTLR4 を使用して、さまざまな言語の AST を解析および生成したいと考えています。このような単純できれいなプリンターを一般的に書くことができます。別の言い方をすれば、私は AST を取得することだけに関心があり、AST を取得するためだけに調整されたきれいなプリンターで各文法を邪魔する必要はありません。おそらく、ANTLR3に戻るべきですか?

4

2 に答える 2