使用 Antlr4 和 StringTemplates 从 AST 生成源代码

Generate source code from AST with Antlr4 and StringTemplates

如果我有一个 AST 并修改它,我可以使用 StringTemplates 为修改后的 AST 生成源代码吗?

我已经成功实现了 Antlr4 语法。它生成源代码的 AST,我使用 Visitor Class 来执行所需的操作。然后我修改了 AST 中的某些内容,我想为修改后的 AST 生成源代码。 (我相信它被称为漂亮印刷?)。

Antlr 的内置 StringTemplates 是否具备执行此操作的所有功能?应该从哪里开始(非常欢迎实用的建议)?

您可以遍历树并使用字符串模板(或什至简单的字符串打印)吐出在某种程度上重现源文本的文本等价物。

但是您会发现以逼真的方式复制源文本比这建议的要难。如果你想要原程序员不会拒绝的回码,你需要:

  • 保留评论。我认为 ANTLR AST 不会这样做。
  • 生成保留原始缩进的布局。
  • 保留字面值的基数、前导零计数和其他 "format" 属性
  • 用合理的转义重新生成字符串

做好这一切是很棘手的。请参阅我的 SO 答案 How to compile an AST back to source code for more details. (Weirdly, the ANTLR guy suggests not using an AST at all;我猜这是因为字符串模板只适用于 ANTLR parse 树,其结构 ANTLR 理解,而 ASTs 是你自己做的。)

如果您做对了所有这些,您可能会发现修改解析 tree/AST 比看起来更难。对于几乎所有关于复杂语言的有趣任务,您都需要从树中提取不重要的信息(例如,这个标识符的含义是什么?哪里是this variable used?,...) 我称之为Life After Parsing的问题。我的主要观点是修改 AST 和重新生成代码需要大量的机器;请注意项目的大小。