我有一个编译语法,我想用它将输入序列转换为XML。请注意,在我的情况下,我有一个非常大的语法和许多规则,我想避免覆盖我的代码中的每个语法规则。将解析树转换为XML
我会用一个例子来避免混淆。让我们有以下语法
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
预计输出
<prog>
<stat>
A =
<expr> 10
</expr>
\r\n
</stat>
<stat>
B =
<expr>
<expr>A</expr>
*
<expr> A</expr>
</expr>
\r\n
</stat>
</prog>
相当于解析树
目前我使用其中I创建ParseTree
的方法以及使用该toStringTree
方法我生成下面的字符串
(prog (stat A = (expr 10) \r\n) (stat B = (expr (expr A) * (expr A)) \r\n))
我随后转化为上面所示的XML(I使用简单的通用代码工作对于任何语法)。我发现这种方法是虚拟的。没有toStringTree
可以解决吗?我想避免重写我的访客中的每个语法规则。 (我有数百个)。
编辑
基本上,我需要某种通用的分析树序列化的XML格式。主要目标是我不必为每个规则编写Java特殊的序列化方法。
如何使用静态方法''printXml(ParseTree树)''在ParseTree上执行递归下降? –
@StefanHaustein我会检查它,谢谢。我对Antlr没有太多经验。 –
生成XML并不是一个好主意。你将如何操纵它? XSLT在大型树上并不是很出色,并且您会为大小适中的Java程序获得巨大的树。更糟糕的是,XSLT不擅长上下文敏感检查,所有java构造都是上下文敏感的(变量意味着不同的事情取决于它们的声明)。解析后的生活为什么你想要的不仅仅是AST:http://www.semdesigns.com/Products/DMS/LifeAfterParsing.html –