有没有办法编写编译器前端而不使用语法导向的转换?

时间:2011-07-10 18:00:14

标签: parsing compiler-construction code-translation intermediate-code

我的问题与标题相同。我只是想知道是否有任何其他翻译技术来获取不依赖于将操作嵌入到解析器中的中间代码(也就是说,解析器将严格创建抽象语法树,它不会生成任何代码) 。谢谢你的回答。

2 个答案:

答案 0 :(得分:7)

如果拥有解析器,那么解析器必须做的不仅仅是“识别”输入流作为语言的有效实例。如果您希望编译器生成任何内容,则必须将某种操作附加到与langauge片段匹配的活动。从某种意义上说,除了“语法导向”之外,它不能是任何东西;在解析阶段,你所拥有的就是语法。

从根本上说,解析操作必须构建一个“更易于编译”的程序表示。我只知道一些基本方法:

  • 生成一组虚拟机指令
  • 构建一个抽象语法树,传递给编译器的其余部分
  • 构建代码的某种控制/数据流表示(例如,“三元组”)

这些都是抽象的,实际上几乎相同,因为解析器生成的表示包含链接结构,其元素具有一些直接的语义解释。 具有隐含语义的这些结构位是编译器的其余部分关闭的。

现在,文本程序的表示。如果您决定将编译器实现为Post系统,一组对字符串的重写规则,则可以完全避免“解析”过程(某种类型)。这些是“如果你看到这个字符串,用另一个字符串替换它”的形式。 Post系统可以提供Turing功能,因此从技术上讲,您可以使用足够聪明的字符串重写规则将源代码转换为表示目标程序的字符串。我不认识任何人以这种方式构建真正的编译器;我敢肯定,如果你足够努力,你可以找到一本不起作用的技术论文。

有人可以合理地争辩说,Post系统所要求的匹配字符串是一种解析(例如,识别有趣的结构),让你回到最初的问题。

值得注意的是,程序转换系统(我在商业上构建其中之一)通常使用编译器前端来构建AST,然后应用AST树到树的重写来实现其目的。它们以这种方式构造的原因是因为它们实际上是后期系统的数字化;您的程序的任何AST都可以简单地转换为字符串(例如,S表达式),并且树重写可以转换为等效的字符串重写。因此,树重写系统只是一个Post系统,但这使得非常功能强大。当然,可以将此功能与其他更传统的编译器方法相结合,这就是我们对产品的处理方式。这样更方便;你没有像Post系统那样做任何事情。

答案 1 :(得分:0)

您所描述的实际上是标准编译器设计。可以编写一次性编译器,实际上我已经这样做了,它在解析期间生成了目标代码,但是规范是解析器生成AST并随后遍历AST以生成输出或在许多情况下,还有一个中间形式,如三元组,RTL等。