【发布时间】:2018-03-20 18:24:34
【问题描述】:
我有一个已编译的语法,我想用它来将输入序列转换为 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>
对应一个解析树
目前我使用一种方法来创建ParseTree 并使用toStringTree 方法生成以下字符串
(prog (stat A = (expr 10) \r\n) (stat B = (expr (expr A) * (expr A)) \r\n))
我随后将其转换为上面显示的 XML(我使用适用于任何语法的简单通用代码)。我觉得这种方法很愚蠢。没有toStringTree可以解决吗?我想避免覆盖我的访客中的每个语法规则。 (我有数百个)。
编辑
我基本上需要某种通用的 ParseTree 序列化为 XML 格式。主要目标是我不必在 Java 中为每个规则编写特殊的序列化方法。
【问题讨论】:
-
使用静态方法
printXml(ParseTree tree)在 ParseTree 上进行递归下降打印怎么样? -
@StefanHaustein 我会检查一下,谢谢。我对 Antlr 没有太多经验。
-
生成 XML 并不是一个好主意。你将如何操纵它? XSLT 在大型树上并不是很好,对于中等大小的 Java 程序,您会得到巨大的树。更糟糕的是,XSLT 不擅长上下文相关检查,并且所有的 java 构造都是上下文相关的(变量的含义取决于它们的声明)。查看解析后的生活,了解为什么您想要的不仅仅是 AST:semdesigns.com/Products/DMS/LifeAfterParsing.html
-
@IraBaxter 我的树将很小(几十到几百个元素),我计划使用 XQuery 引擎进行搜索和操作。
-
@RadimBača:好的,小树......也许 XML 本身不会淹没你。但是根据语言的上下文敏感性质对这些树进行认真的操作...... XQuery 不会很好地工作。解析后阅读生活点滴。
标签: java xml parsing tree antlr4