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

Parsing 与递归下降解析器一起生成输出,parsing,compilation,recursive-descent,compiler-construction,Parsing,Compilation,Recursive Descent,Compiler Construction,编写简单的解析器很简单,我已经实现了好几年了。在大学里,我们还得写一本。但我们从来不用用这种方法产生有意义的输出我们从未学会如何创建后端。

编写简单的解析器很简单,我已经实现了好几年了。在大学里,我们还得写一本。但我们从来不用用这种方法产生有意义的输出我们从未学会如何创建后端。

<如果我有一个工作递归递归分析器,用于简化Pascal和我想把代码翻译成C++,我会怎么做?我认为不需要中间步骤,例如生成抽象语法树

那么如何输出编译或翻译后的代码呢?我在Jack Crenshaw的教程中找到了唯一有用的例子,但它与大多数其他资源一样,更侧重于前端。我的解析器代码和语法之间的关系非常明显。解析器方法和输出之间的关系如何?我的函数声明解析器方法可以只与一个EmitLn(这里是C++代码)调用相关。但是对于不那么容易的解析器方法,比如表达式,又如何呢。表达式被分解为可能更多的调用,因此暗示需要一个Emit()函数,该函数允许我逐个分解表达式的输出代码是否有任何锅炉板代码用于输出代码,如Jack Crenshaw的Lets Build a Compiler中的EmitLn函数?这也说明了我需要维护一个基本的符号表,这在大多数示例中经常被忽略


我说得对吗?我还应该知道什么?有任何提示/建议或资源吗?我的大问题是,编译器前端的教程太多了,但是后端的解释怎么样?我可以解析语言,现在我想把它发展成能够将它们翻译并编译成其他语言。

有一些简单的编译器使用“动态”代码生成器来生成代码 当它们解析时,就像你试图做的那样。好消息是它们看起来 简单

问题在于,汇编从根本上讲是为了传播来自世界各地的信息 将代码的一部分转换为另一部分,以实现良好的代码生成。为此,, 编译器人员很久以前就决定将解析和代码生成分开。 解析器解析代码并构建另一个中间数据结构(通常是 表示程序的抽象语法树(或三元组)

通常,对中间结构进行非常深入的分析 确定如何生成好的代码,然后是适当的好代码 代码生成。做好这件事的技术很复杂, 但是由于需要生成好的(正确的)代码而受到良好的激励

请尝试签出标准编译器资源。

这很值得你的夸奖 是时候详细阅读这些参考资料了,而不是黑客攻击。 如果你坚持只写一本,那么《阿霍与厄尔曼》就是经典之作

如果您想了解如何动态生成代码 要使其工作正常,请检查
.

简短回答在匹配语法中的规则后,调用基于输入执行操作的函数

详细回答:来自Terence Parr讨论语法指导口译员的语言实现模式:

语法定向解释器不会创建AST或将源代码转换为字节码。。。解释器直接从语法中获取信息来执行语句

这正是我在最初的问题中的想法。继续在书中,他描述了这项技术,它是如何工作的,它由什么组成,以及它的局限性。它适用于DSL和小型语言,而不是通用语言

他指出,像IFs和循环这样的构造很难实现。虽然这可能是真的,但我在用自己的语言实现这些特性时没有遇到任何问题。指令序列或简单语句的语言非常适合这种模式;他以文本处理语言为例

语法扩展为“匹配这个,调用那个”对。因此,语法中的必要规则应该有一个与之相关的动作。赋值语句示例:

assignment : ID '=' expr {interp.assign($ID, $expr.value);};
expr returns [Object value] : ... ;

您没有真正回答我的问题,也没有向我提供任何关于如何在解析过程中生成代码的具体想法,但您提供了很好的信息,元编译器的建议非常有趣,谢谢。@Azh:对,我没有,因为我想强调另一点。通过简单地在递归下降解析器代码的识别部分插入print语句,很容易“生成(坏)代码”。问题是,如何做到这一点,以及打印什么?元编译器(MetaII,参考)通过让您指定与语法交错打印的内容,将这一点发挥到了极致;它们都被编译成一个递归下降编译器,可以在运行中抛出代码。但是,要生成好的代码,您需要上下文,例如程序其他部分的内存,而这正是失败的地方。Parr的描述显然是关于语法导向的解释器,但您特别询问了编译或翻译的代码。一个明显的区别是,语法导向编译器可以很容易地发出“goto”语句以供以后执行,而Parr(正确地说)解释器也不能处理这些。。。因为它不知道目标在哪里。我想你误解了帕尔说的话。我不知道你是如何实现你的Basic的,但是如果你能执行gotos,你就不会像语法指导的翻译人员那样动态地生成代码。我为什么还要问你呢?哦,是的,因为我每次都学到很多。。。我将留下我的答案,但再次接受你的答案。前几天,当我读到这一章时,我有一种似曾相识的感觉,我忍不住认为它适用于这个问题。