用Antlr4和StringTemplates从AST生成源代码

7
如果我有一个AST并对其进行修改,我是否可以使用StringTemplates来生成修改后的AST的源代码?
我已经成功地为Antlr4实现了我的语法。它生成源代码的AST,并且我使用访问者类来执行所需的操作。然后我会在AST中进行一些修改,我想为修改后的AST生成源代码(我认为这被称为漂亮打印?)。
Antlr内置的StringTemplates是否具有执行此操作的所有功能?应该从哪里开始(非常欢迎实用建议)?
1个回答

4
你可以遍历树并使用字符串模板(甚至是纯文本字符串)来输出在某种程度上复制源文本的文本等效物。
但你会发现以逼真的方式复制源文本比这暗示的更难。如果你想要得到原始程序员不会拒绝的代码,你需要:
- 保留注释。我认为ANTLR ASTs没有这样做。 - 生成保留原始缩进的布局。 - 保留文字值的基数,前导零计数和其他“格式”属性 - 使用合理的转义重新生成字符串
做到这一切都很棘手。请参见我的SO答案如何将AST编译回源代码以获取更多详细信息。(奇怪的是,ANTLR的那个家伙建议根本不使用AST;我猜这是因为字符串模板仅适用于ANTLR 解析树,其结构ANTLR理解,而不是您自己设计的ASTs)。
如果您能正确地完成所有这些,您可能会发现修改解析树/AST比看起来要困难得多。对于复杂语言上的任何有趣任务,您需要从树中提取非平凡信息(例如,“这个标识符的含义是什么?”,“这个变量在哪里使用?”等)。我称之为解析后的生活问题。我的主要观点是,修改AST并重新生成代码需要大量机械装置;请注意您的项目规模。

谢谢您的回答。我知道这不是一项容易的任务。您是否还有一些实用的建议可以告诉我如何开始? - 50k4
如果你坚持要自己做,我提供的代码美化页面是一个不错的起点,考虑到你已经有了解析器。如果你不想自己做这些工作,你应该使用程序转换系统(PTS),其中所有基本工作都已经为你完成,让你专注于你的变更任务,而不是建立所有的基础设施。请参阅http://en.wikipedia.org/wiki/Program_transformation以获取一些可能的选择。 - Ira Baxter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接