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

标签 antlr antlr4 stringtemplate

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

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

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

最佳答案

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

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

  • 保留评论。我认为 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 比看起来更难。对于复杂语言的几乎所有有趣的任务,您需要从树中提取的重要信息(例如,这个标识符的含义是什么?这个变量在哪里使用?,...)我称之为问题Life After Parsing .我的主要观点是修改 AST 和重新生成代码需要大量机器;注意你的项目的规模。

    关于antlr - 使用 Antlr4 和 StringTemplates 从 AST 生成源代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38242492/

    相关文章:

    antlr - 获取 ParserRuleContext 的所有预期标记

    java - 如何在 Antlr 分词器中进行 Unicode 转义解码

    listener - ANTLR 4 : How get correct order arguments in Listeners

    java - 带美元符号的字符串模板

    java - StringTemplate 缩进在 String 中添加空格

    java - Antlr token 优先级

    python - 使用 ANTLR 用 Python 解析一些 Java 代码

    python - antlr4 python目标无法识别unicode

    python - 获取字符串模板中所有标识符列表的函数(Python)

    java - 有没有办法在antlr语法文件中指定java注释?