第六章 属性文法和语法制导翻译
语法制导翻译:一个上下文无关文法和属性及规则的结合。
继承属性和综合属性:语法制导的定义可以使用两种属性。一棵语法分析树结点上的综合属性根据该结点的子结点的属性计算得到。一个结点上的继承属性根据他的父节点和、或兄弟节点的属性计算得到。终结符只有综合属性,它由词法分析器提供;非终结符既可以有综合属性也可以有继承属性,文法开始符号的所有继承属性作为属性计算前的初始值。
依赖图:给定一棵语法分析树和一个SDD,我们各个语法分析树结点所关联的属性实例之间画上边,以指明位于边的头部的属性值要根据位于边的尾部的属性值计算得到。
抽象语法树:一棵抽象语法树中的每个结点代表一个构造;某个构造结点的子结点表示该结点所对应的构造的有意义的组成部分。在抽象语法树中,操作符和关键字都不作为叶结点出现,而是把它们作为内部结点,即这些叶结点的父结点。
S属性:在一个S属性的SDD中,所有属性都是综合的。
S-属性文法的自下而上计算:
综合属性可以在分析符号串的同时由自上而下的分析器来构造
分析器可以保存与栈中文法符号有关的综合属性值
每当进行归约时,新的属性值就由栈中正在归约的产生式右边符号的属性值来计算
可以通过扩充分析器中的栈来存放这些综合属性值
S-属性文法的翻译器通常可借助于LR分析器实现
L属性:在一个L属性的SDD中,属性可能是继承的,也可能是综合的。然而,一个语法分析树结点上的继承属性只能依赖于他的父结点的继承属性和位于他昨天的兄弟结点的(任意)属性。
翻译模式:
翻译模式是语法制导定义的一种便于翻译的书写形式。其中属性与文法符号相对应,语义规则或语义动作用花括号{ }括起来,可被插入到产生式右部的任何合适的位置上。
这是一种语法分析和语义动作交错的表示法,他表达在按深度优先遍历分析树的过程中何时执行语义动作。
翻译模式给出了使用语义规则进行计算的顺序。可看成是分析过程中翻译的注释。
第七章 中间代码生成
中间代码生成:把经过语法分析和语义分析而获得的源程序中间表示翻译为中间代码表示。
方法:语法制导翻译
好处:1. 便于编译系统建立和编译系统的移植;2. 便于进行独立于机器的代码优化工作。
中间表示形式:中间表示形式通常是一个图形表示方法和三地址代码的组合。比如在语法树中,图中的结点表示一个程序的构造;而各个子结点表示其子构造。三地址代码每条指令之多有一个运算符。另外还有一些用于控制流的三地址指令。
三地址语句的种类:
(1) 赋值语句 x:=y op z,op为二目算术算符或逻辑算符;
(2) 赋值语句 x:=op y ,op为一目算符,如一目减uminus、逻辑非not、移位算符及转换算符;
(3) 无条件转移语句goto L;
(4) 条件转移语句 if x relop y goto L,关系运算符号relop(< ,=,>= 等等);
(5) 复制语句 x:=y;
(6) 过程调用语句 param x 和 call p, n ;
过程返回语句 returny;
(7) 索引赋值 x:=y[i] 及 x[i] :=y ;
(8) 地址和指针赋值 x=&y,x=* y
和 * x=y。
1.四元式 op, arg1, arg2, result
2.三元式 op, arg1, arg2
3.间接三元式 间接码表+三元式表
章节感受:
前面的词法分析、语法分析都属于对输入正确性的分析,以及语法树的构造,这两张就是根据正确的语法树翻译成中间代码,以方便进一步的工作,后面还有与机器有关的目标代码生成以及目标代码优化,代码优化涉及到了硬件、以及操作系统的相关特性,如果真的能写出一个编译程序我觉得本科期间学习到的专业知识都会有所涉及,感觉会是一个不错的时间项目。