parsing - 与递归下降解析器一起生成输出

标签 parsing compilation recursive-descent compiler-construction

编写简单的解析器很简单,多年来我已经实现了几个。在大学里,我们也不得不写一个。但是我们不必使用这种方法生成有意义的输出; 我们从未学习过如何创建后端。

如果我有一个适用于简化的 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/

相关文章:

c++ - 促进规则的精神转变

scala - 动态组合 Scala 的解析器组合子的函数是什么?

java - 使用Java发送POST数据

c# - 从哪儿开始? .net 应用程序的美学更改(无源代码)

python - 使用 Python 和 PLY 的递归下降解析器

php - swift 错误 : Error Domain=NSCocoaErrorDomain Code=3840 "Problems with my Login Controller "

android - 无法编译 Vitamio demo

linux - 编译期间未使用对 GCC 规范文件的编辑

scala - 使用类型别名描述递归语法

ocaml - Camlp5(原Camlp4)如何解析表达式