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

时间:2016-07-07 09:53:54

标签: antlr antlr4 stringtemplate

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

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

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

1 个答案:

答案 0 :(得分:1)

你可以走树并使用字符串模板(甚至是普通的字符串打印)来吐出在某种程度上重现源文本的文本等价物。

但是你会发现以一种比现实更难以实现的方式复制源文本。如果您想要原始程序员不会拒绝的代码,您需要:

  • 保留评论。我不认为ANTLR AST会这样做。
  • 生成保留原始缩进的布局。
  • 保留基数,前导零计数和其他格式"文字值的属性
  • 用合理的逃脱来修复字符串

做好这一切很棘手。有关详细信息,请参阅我的回答How to compile an AST back to source code。 (奇怪的是,the ANTLR guy suggests not using an AST at all;我猜这是因为字符串模板只适用于ANTLR理解结构的ANTLR 解析树,而不是你在家中滚动的AST。)

如果你能做到这一切,你可能会发现修改解析树/ AST比看起来更难。对于复杂语言中几乎任何有趣的任务,您需要从树中提取的信息并不简单(例如,此标识符的含义是什么?这个变量在哪里使用?< / em>,...)我称之为Life After Parsing的问题。我的主要观点是修改AST并重新生成代码需要很多机器;注意项目的大小。