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

问题描述:

如果我有AST并对其进行修改,我可以使用StringTemplates生成修改的AST的源代码吗?使用Antlr4和StringTemplates从AST生成源代码

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

建立在StringTemplates中的Antlr是否具有完成此功能的所有功能?应该从哪里开始(实用建议非常受欢迎)?

你可以走树并使用字符串模板(或者甚至是平淡的字符串打印)来吐出相当于文本的文本,以在一定程度上再现源文本。

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

  • 保留注释。我不认为ANTLR AST会这样做。
  • 生成保留原始缩进的布局。
  • 保留基数,前导零计数和文字值的其他的“格式”属性
  • Renerate字符串以合理的越狱

做这一切也都是棘手。看到我的回答How to compile an AST back to source code了解更多详情。 (古怪,the ANTLR guy suggests not using an AST at all;我猜这是因为字符串模板只对ANTLR 工作分析树,其结构ANTLR了解到,与AST的这是什么你回家轧)

如果你得到这一切的权利,你可能会发现修改parse tree/AST比看起来更难。对于复杂语言中几乎任何有趣的任务,您需要从树中提取的不重要的信息(例如,这个标识符的含义是什么?,这个变量在哪里使用?,...)我打电话给这个问题Life After Parsing。我的主要观点是,需要很多机器来修改AST并重新生成代码;了解你的项目的规模。

+0

感谢您的回答。我知道这不是一件容易的事。邹还有一些关于如何开始的实用建议? – 50k4

+0

如果你坚持自己做,那么考虑到你已经有了一个解析器,我为链接打印的页面非常好。如果你不想自己完成所有这些工作,你应该得到一个程序转换系统(PTS),其中所有的基本工作已经完成,让你专注于你的变更任务,而不是建立所有的基础设施。有关可能的选择,请参阅http://en.wikipedia.org/wiki/Program_transformation。 –