ANTLR:从AST生成反向源文件

时间:2014-06-05 11:19:09

标签: parsing plsql antlr antlr3 abstract-syntax-tree

我修改了[Porcelli](https://github.com/porcelli/plsql-parser)给出的PLSQL解析器。我正在使用此解析器来解析PlSql文件。解析成功后,我正在打印AST。现在,我想编辑AST并使用已编辑的信息打印原始的plsql源代码。我怎样才能做到这一点?如何从AST获取带有注释,换行符和空格的源文件。此外,格式也应保留为原始文件。 对此有任何指导都会有所帮助。

2 个答案:

答案 0 :(得分:1)

简单的答案是"走树,吐出与节点相对应的文字"。 ANTLR提供" StringTemplates"作为一种基本的帮助,但实际上还有很多 需要解决的细节:缩进,文字及其格式,注释......

Compiling an AST back to source code上查看我的答案,了解更多细节。

有一点没有解决,一般需要重现文件的原始字符编码(如果可以的话,有时你可以,例如,你有一个ASCII文件,但插入了一个包含Unicode字符的字符串)

答案 1 :(得分:1)

AST中的每个节点都带有一个索引成员,该成员为您提供输入流中的令牌位置(实际上是令牌流)。当您检查AST中的索引时,您将看到并非所有索引都出现在那里(出现的索引中存在漏洞)。这些是已过滤掉的位置(通常是空格和注释)。

然而,您的输入流能够在给定索引处为您提供令牌,而且重要的是,无论其所在的频道如何,都能为您提供所有找到的令牌。因此,您的策略可能是迭代来自您的令牌令牌流并在它们出现时将它们打印出来。此外,您可以检查AST以获取当前索引,并查看是否必须生成不同的输出或必须附加其他输出。