编写简单的解析器很简单,多年来我已经实现了几个。在大学里,我们也不得不写一个。但是我们不必使用这种方法生成有意义的输出; 我们从未学习过如何创建后端。
如果我有一个适用于简化的 Pascal 的递归下降解析器,并且我想将代码转换为 C++,我将如何着手做这件事?我认为不需要中间步骤,例如生成抽象语法树。
那么我该如何输出编译或翻译后的代码呢?我发现的唯一有用的例子是在 Jack Crenshaw 的教程中,但它更侧重于前端,就像大多数其他教程一样资源。我的解析器代码和语法之间的关系非常明显。解析器方法和输出之间的关系如何?我的函数声明解析器方法可以与一个 EmitLn(此处为 C++ 代码) 调用相关。但是那些不那么简单的解析器方法呢,比如表达式。表达式被分解为可能更多的调用,因此暗示需要一个 Emit() 函数,它允许我逐个分解表达式的输出代码。 是否有用于输出代码的样板代码,例如 Jack Crenshaw 的 Lets Build a Compiler 中的 EmitLn 函数?这也表明我需要维护一个基本的符号表,这是大多数示例中经常省略的另一件事。
我说的对吗?我还应该知道什么?任何提示/建议或资源?我的大问题是,编译器前端有那么多教程,但是后端的一些解释怎么样?我可以解析语言,现在我想将其发展为能够将它们翻译和编译成其他语言。
最佳答案
有一些简单的编译器使用“即时”代码生成器吐出代码 正如他们解析的那样,正如您似乎正在尝试做的那样。好消息是他们看起来 很简单。
问题是编译从根本上讲是关于从 代码的一部分到另一部分,以实现良好的代码生成。为了那个原因, 编译器人员很久以前就决定将解析与代码生成分开。 解析器解析代码并构建另一个中间数据结构(通常是 表示程序的抽象语法树或三元组。
通常,对中间结构进行非常深入的分析 确定如何生成好的代码,其次是适当的好 代码生成。做到这一点的技术很复杂, 但出于对产生良好(和正确)代码的需求的强烈动机。
尝试检查标准编译器资源。 Learning to write a compiler
值得拥有 是时候详细阅读其中一些引用资料而不是 hacking 了。 如果你坚持只看一本,Aho and Ullman 就是经典之作。
如果你想看看如何动态生成代码 可以很好地工作,请查看 metacompilers .
关于parsing - 与递归下降解析器一起生成输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7831334/