50k*_*0k4 5 antlr stringtemplate antlr4
如果我有一个AST并对其进行修改,是否可以使用StringTemplates生成经修改的AST的源代码?
我已经成功实现了Antlr4的语法。它生成源代码的AST,我使用Visitor类执行所需的操作。然后,我修改AST中的某些内容,并希望为修改后的AST生成源代码。(我认为这称为漂亮打印?)。
Antlr的内置StringTemplates是否具有执行此操作的所有功能?应该从哪里开始(非常欢迎提供实用建议)?
您可以遍历树并使用字符串模板(甚至纯字符串打印)来吐出在某种程度上重现源文本的文本等效项。
但您会发现以现实的方式复制源文本比这建议的更难。如果你想要原始程序员不会拒绝的后台代码,你需要:
做好这一切是很棘手的。有关更多详细信息,请参阅我的 SO 答案如何将 AST 编译回源代码。(奇怪的是,ANTLR 的人建议根本不使用 AST;我猜这是因为字符串模板只适用于 ANTLR解析树,其结构 ANTLR 可以理解,而 AST 则可以是你自己制作的。)
如果你把所有这些都做对了,你可能会发现修改解析树/AST 比看起来更难。对于复杂语言上的几乎任何有趣的任务,您都需要从树中提取不简单的信息(例如,这个标识符的含义是什么?,这个变量在哪里使用?,...)我称之为问题解析后的生活。我的主要观点是,修改 AST 和重新生成代码需要大量的机器;了解您的项目的规模。