【问题标题】:Generate source code from AST with Antlr4 and StringTemplates使用 Antlr4 和 StringTemplates 从 AST 生成源代码
【发布时间】:2016-07-07 09:53:54
【问题描述】:

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

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

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

【问题讨论】:

    标签: antlr antlr4 stringtemplate


    【解决方案1】:

    您可以遍历树并使用字符串模板(甚至是纯字符串打印)来吐出在某种程度上再现源文本的文本等价物。

    但是您会发现以实际的方式复制源文本比这暗示的要难。如果您想要原始程序员不会拒绝的返回代码,您需要:

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

    做好这一切是很棘手的。有关更多详细信息,请参阅我的 SO 回答 How to compile an AST back to source code。 (奇怪的是,the ANTLR guy suggests not using an AST at all;我猜这是因为字符串模板仅适用于 ANTLR parse 树,其结构 ANTLR 可以理解,而 AST 是你自己推出的。)

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

    【讨论】:

    • 感谢您的回答。我知道这不是一件容易的事。 zou 是否也有一些关于如何开始的实用建议?
    • 如果你坚持自己做,考虑到你已经有一个解析器,我链接到的漂亮打印页面是一个很好的开始。如果您不想自己完成所有这些工作,您应该获得一个程序转换系统 (PTS),其中已经为您完成了所有基本工作,让您可以专注于您的变更任务,而不是构建所有基础设施。请参阅en.wikipedia.org/wiki/Program_transformation 了解一些可能的选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多