我正在开发一个编译器,并且已经使用 ANTLR4 实现了词法分析器、解析器和语义分析器(使用侦听器和访问者)。对于代码生成,我计划使用 StringTemplate(ST) 生成 LLVM IR。为此,我正在考虑首先构建一个 AST,然后生成代码。
我的问题是我需要构建 AST 吗?或者我可以使用解析树吗?如果我需要使用 AST,我找不到任何使用访问者或侦听器手动构建 AST 的示例。即使是一个小的语法示例也会很有帮助。
谢谢你。
我正在开发一个编译器,并且已经使用 ANTLR4 实现了词法分析器、解析器和语义分析器(使用侦听器和访问者)。对于代码生成,我计划使用 StringTemplate(ST) 生成 LLVM IR。为此,我正在考虑首先构建一个 AST,然后生成代码。
我的问题是我需要构建 AST 吗?或者我可以使用解析树吗?如果我需要使用 AST,我找不到任何使用访问者或侦听器手动构建 AST 的示例。即使是一个小的语法示例也会很有帮助。
谢谢你。
不,根本不需要构建 AST。在最简单的情况下,您可以直接或使用 ST 遍历解析树并输出 IR。
当输出为 IR 需要转换时,两种基本方法是:(1)分析和注释描述必要变化的分析树;或 (2) 遍历解析树,构造一个单独的 AST,然后遍历并转换 AST。
对于注释策略,扩展ParseTreeProperty以创建上下文节点类型特定的属性类。有关如何使用,请参阅该类中的注释。
AST 策略并不气馁——它是 Antlr3 中使用的主要策略——但在 Antlr4 中基本上不受支持。至于为什么 Antlr4 偏爱注解策略,请看这个答案的最后几段。