Parsing ANTLR:从AST生成回源文件

Parsing ANTLR:从AST生成回源文件,parsing,plsql,antlr,antlr3,abstract-syntax-tree,Parsing,Plsql,Antlr,Antlr3,Abstract Syntax Tree,我已经修改了[Porcelli]给出的PLSQL解析器。我使用这个解析器来解析PlSql文件。成功解析后,我将打印AST。现在,我想编辑AST并用编辑过的信息打印回原始plsql源代码。我怎样才能做到这一点?如何从AST中获取带有注释、换行符和空格的源文件。此外,格式也应保留为原始文件。 这方面的任何线索都会很有帮助。简单的答案是遍历树,并吐出与节点对应的文本。 ANTLR提供了StringTemplates作为一种基本的帮助,但实际上有很多 需要解决的细节:缩进、文字及其格式、注释 更多细节请

我已经修改了[Porcelli]给出的PLSQL解析器。我使用这个解析器来解析PlSql文件。成功解析后,我将打印AST。现在,我想编辑AST并用编辑过的信息打印回原始plsql源代码。我怎样才能做到这一点?如何从AST中获取带有注释、换行符和空格的源文件。此外,格式也应保留为原始文件。
这方面的任何线索都会很有帮助。

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

更多细节请参见我的SO答案


有一件事没有解决:如果可以,通常需要复制文件的原始字符编码,有时不能,例如,您有一个ASCII文件,但插入了一个包含Unicode字符的字符串。

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

更多细节请参见我的SO答案


有一件事没有解决,那就是通常需要复制文件的原始字符编码,如果可以,有时不能,例如。,您有一个ASCII文件,但插入了一个包含Unicode字符的字符串。

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


然而,您的输入流能够在给定的索引处给您一个令牌,并且,重要的是,能够给您找到的每个令牌,而不管它位于哪个通道中。因此,您的策略可以是迭代令牌流中的令牌,并在它们出现时打印出来。此外,您可以检查AST中的当前索引,查看是否必须生成不同的输出或附加额外的输出。

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


然而,您的输入流能够在给定的索引处给您一个令牌,并且,重要的是,能够给您找到的每个令牌,而不管它位于哪个通道中。因此,您的策略可以是迭代令牌流中的令牌,并在它们出现时打印出来。此外,您可以检查AST中的当前索引,看看是否必须生成不同的输出或附加额外的输出。

新的行/空格和注释将在解析中丢失;你无法仅从AST中获得这些。@Xophmeister:有许多东西是绝对纯AST无法获得的。如果您想取回它,AST必须携带一些附加信息,这些信息可以在解析时收集。请看我的答案。新的行/空格和注释将在解析中丢失;你无法仅从AST中获得这些。@Xophmeister:有许多东西是绝对纯AST无法获得的。如果您想取回它,AST必须携带一些附加信息,这些信息可以在解析时收集。看我的答案。问题是如何从AST打印源代码。你说,迭代标记。。。;OP合理地假设这些都消失了。@IraBaxter OP希望重新生成原始源代码+添加到AST中的一些更改。领会言外之意很明显,你不需要在字里行间阅读…问题是如何从AST打印源代码。你说,迭代标记。。。;OP合理地假设这些都消失了。@IraBaxter OP希望重新生成原始源代码+添加到AST中的一些更改。领会言外之意很明显,你不需要在字里行间阅读。。。