我的问题和标题一样。我只是想知道有没有其他翻译技术可以得到不依赖于将动作嵌入到解析器中的中间代码(即解析器会严格创建抽象语法树,它不会生成任何代码) . 感谢您的任何回答。
2 回答
如果您有解析器,那么解析器必须做的不仅仅是将输入流“识别”为语言的有效实例。如果您希望编译器生成任何内容,则必须将某种操作附加到匹配语言片段的活动。从某种意义上说,它只能是“语法指导”;在解析阶段,您所拥有的只是语法。
从根本上说,解析动作必须构建“更可编译”的程序表示。我只知道一些基本的方法:
- 生成一组虚拟机指令
- 构建抽象语法树以传递给编译器的其余部分
- 构建代码的某种控制/数据流表示(例如,“三元组”)
这些在抽象上实际上几乎相同,因为解析器生成的表示包含链接结构,其元素具有一些直接的语义解释。这些具有隐含语义的结构位是编译器其余部分的关键。
现在,文本是程序的表示。如果您决定将编译器实现为 Post 系统(一组重写字符串的规则),则可以完全避免“解析”过程(某种程度上)。这些是“如果你看到这个字符串,用这个另一个字符串替换它”的形式。Post 系统具有图灵能力,因此从技术上讲,您可以使用一组足够聪明的字符串重写规则将源代码转换为代表目标程序的字符串。我认识的没有人以这种方式构建真正的编译器。我敢肯定,如果您足够努力地挖掘,您会找到一篇不为人知的技术论文来做到这一点。
有人可以合理地争辩说,按照 Post 系统的要求,匹配字符串是一种解析(例如,识别有趣的结构),让您回到最初的问题。
有趣的是,程序转换系统(我在商业上构建了其中一个)通常使用编译器前端来构建 AST,然后应用 AST 树到树的重写来实现其目的。以这种方式构建它们的原因是因为它们实际上是伪装的 Post 系统。您程序的任何 AST 都可以简单地转换为字符串(例如,S 表达式),并且可以将树重写转换为等效的字符串重写。所以树重写系统只是一个 Post 系统,但这使它非常强大。当然,可以将此功能与其他更传统的编译器方法相结合,这就是我们对产品所做的。这使它更方便;您没有像 Post 系统那样做所有事情。
您描述的实际上是标准编译器设计。可以编写一次性编译器,实际上我已经这样做了,它在解析期间生成目标代码,但规范是解析器生成 AST 并随后遍历 AST 以生成输出或在许多情况下,还有进一步的中间形式,例如三元组、RTL 等。