私はコンパイルされた文法を持っており、それを使って入力シーケンスをXMLに変換したいと思っています。私のケースでは、非常に大きな文法を持っていますが、私のコードで各文法ルールを上書きしないようにしたいと思います。XMLを構文解析ツリーに変換する
混乱を避けるために例を使用します。私たちは、次の文法出力
解析ツリー に対応<prog>
<stat>
A =
<expr> 10
</expr>
\r\n
</stat>
<stat>
B =
<expr>
<expr>A</expr>
*
<expr> A</expr>
</expr>
\r\n
</stat>
</prog>
期待
grammar expr;
prog: stat+ ;
stat: expr NEWLINE
| ID '=' expr NEWLINE
| NEWLINE
;
expr: expr ('*'|'/') expr
| INT
| ID
| '(' expr ')'
;
ID : [a-zA-Z]+ ; // match identifiers
INT : [0-9]+ ; // match integers
NEWLINE:'\r'? '\n' ; // return newlines to parser (is end-statement signal)
WS : [ \t]+ -> skip ; // toss out whitespace
入力シーケンス
A = 10
B = A * A
てみましょう
現在、私は私がParseTree
を作成するアプローチを使用して、私は次の文字列私はその後、上記のようなXMLに変換する
(prog (stat A = (expr 10) \r\n) (stat B = (expr (expr A) * (expr A)) \r\n))
(私が働いてシンプルな汎用コードを使用を生成toStringTree
方法を使用してどんな文法でも)。私はこのアプローチがダミーだと思う。 toStringTree
なしでそれを解決することは可能ですか?私は訪問者の各文法規則を無効にする必要性を避けたいと思います。 (私は何百もある)。
EDIT
私は基本的にXML形式に汎用的な解析ツリーのシリアル化のいくつかの種類が必要です。主な目標は、ルールごとにJavaで特別なシリアライズメソッドを書く必要がないことです。
静的メソッド 'printXml(ParseTree tree)' 'を使用して、ParseTreeを再帰的に下ろして印刷することはどうですか? –
@StefanHaustein私はそれを確認します、ありがとう。私はAntlrに多くの経験がありません。 –
XMLを作成するのは良い考えではありません。それをどうやって操作しますか? XSLTは大きな木ではあまり効果がありません。そして、あなたはJavaのプログラムを適度に小さくするために巨大な木を得るでしょう。さらに悪いことに、XSLTは文脈依存型のチェックには向いていません。すべてのJava構文はコンテキスト感応型です(変数は宣言によって変数が異なります)。とにかくAST以上のものを望む理由は、解析後の人生を参照してください。http://www.semdesigns.com/Products/DMS/LifeAfterParsing.html –