编写简单的解析器是微不足道的,多年来我已经实现了几个。在大学里,我们也不得不写一篇。但是我们不必使用这种方法生成有意义的输出;我们从未学会如何创建后端。
如果我有一个用于简化 Pascal 的递归下降解析器,并且我想将代码转换为 C++,我将如何去做呢?我认为不需要中间步骤,例如生成抽象语法树。
那么我该如何输出编译或翻译的代码呢?我发现的唯一有用的例子是在 Jack Crenshaw 的教程中,但它更多地关注前端,就像大多数其他资源一样。我的解析器代码和我的语法之间的关系非常明显。解析器方法和输出之间的关系如何?我的函数声明解析器方法可以与一个 EmitLn( C++ code here ) 调用完全相关。但是那些不那么容易的解析器方法呢,比如表达式。表达式被分解为可能更多的调用,因此暗示需要一个 Emit() 函数,它允许我逐段分解表达式的输出代码。是否有任何用于输出代码的样板代码,例如 Jack Crenshaw 的 Lets Build a Compiler 中的 EmitLn 函数?这也表明我需要维护一个基本的符号表,这是大多数示例中经常省略的另一件事。
我对吗?我还应该知道什么?任何提示/建议或资源?我的大问题是,编译器前端的教程太多了,但是后端的一些解释怎么样?我可以解析语言,现在我想将其发展为能够将它们翻译和编译成其他语言。