资源描述:
《第七章 语义分析和中间代码生成》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第七章语义分析和中间代码的产生紧接在词法分析和语法分析之后,编译程序要做的工作是进行静态语义检查和翻译。静态语义检查通常包括:类型检查。操作数和操作符类型一致控制流检查。控制转移到合理的位置一致性检查。变量只能被声明一次,同一case语句的标号不能相同,枚举类型的元素不能相同相关名字检查。同一名字必须出现两次以上翻译为中间语言的好处(1)便于进行与机器无关的代码优化;(2)使编译程序改变目标机更容易;易于编译器的移植(3)使编译程序的结构在逻辑上更为简单明确,以中间语言为界面,编译前端和后端的接口更清晰。主要内容中间语言的形式
2、后缀式,图表方法,三元式编译过程中不同语言的翻译或处理方法说明语句的翻译赋值语句的翻译布尔表达式的翻译控制语句的翻译7.1中间语言中间语言的形式:逆波兰表示:后缀式图表示法:DAG和AST三地址代码:四元式、三元式、间接三元式7.1.1后缀式后缀式表示法又称逆波兰表示法。这种方法是,把运算量(操作数)写在前面,把算符写在后面(后缀)。一个表达式的后缀式可以如下定义:(1)如果E是一个变量或常量,则E的后缀式是E自身。(2)如果E是E1opE2形式的表达式,这里op是任何二元操作符,则E的后缀式为E1’E2’op,这里E1’和E
3、2’分别为E1和E2的后缀式。(3)如果E是(E1)形式的表达式,则E1的后缀式就是E的后缀式。后缀式的优点便于计算机处理,因为在后缀式中,表达式的求值顺序与运算符出现的顺序一致,这样只要用一个栈就可以实现表达式的求值。实现过程:自左向右扫描后缀表达式;遇到运算对象入栈,遇到N元运算符,就从栈顶取出N个运算对象进行计算,再将结果入栈;当全部后缀表达式扫描结束,则栈顶的值即为表达式结果。后缀式特点:无括号运算对象的顺序与中缀式一致根据操作符(运算符)的优先级和结合性进行相关的处理例:5+4*6546*+7.1.2图表示法图表示法
4、包括DAG与AST(抽象语法树)。有向无环图(DirectedAcyclicGraph,简称DAG).与抽象语法树一样,对于表达式中的每个子表达式,DAG图中都有一个结点。一个内部结点代表一个操作符,它的孩子代表操作数。两者不同的是,在DAG图中代表公共子表达式的结点具有多个父结点,而在一棵抽象语法树中公共子表达式被表示为重复的子树。例:5+4*6的DAG图5+64*5+4*6+4*6的DAG图5+64*+5+4*6+4*6的AST图5+64*+64*后缀式与抽象语法树的关系后缀式是抽象语法树的线性表示:每个结点都是在它的所有
5、子节点之后立即出现的。通过对抽象语法树的不同形式的遍历可以形成不同形式的缀式表达式前序遍历:前缀式中序遍历:中缀式后序遍历:后缀式5+64*+64*产生赋值语句抽象语法树的属性文法S.nptr:=mknode('assign',mkleaf(id,id.place),E.nptr)E.nptr:=mknode('+',E1.nptr,E2.nptr)E.nptr:=mknode('*',E1.nptr,E2.nptr)mkleaf(id,id.place)S→id:=EE→E1+E2E→E1*E2E->id产生式语义规则S.n
6、ptr:=mknode('assign',mkleaf(id,id.place),E.nptr)E.nptr:=mknode('+',E1.nptr,E2.nptr)E.nptr:=mknode('*',E1.nptr,E2.nptr)E.nptr:=mkleaf(id,id.place)mkleaf(id,id.place)S→id:=EE→E1+E2E→E1*E2E->ida:=b+cabc+:=抽象语法树的存储表示二叉树的形式:算术运算通常都是二元运算树中每个节点包含三个域:数组的形式表示:每一个数组元素形式如下:节点类
7、型
8、操作数1
9、操作数2节点类型
10、操作数1
11、操作数2*uminusidcidb赋值语句:a:=b*-c+b*-c后缀式:abcuminus*bcuminus*+assignassign+*uminusidaidcidbidbidcunimus1*02idbidcunimus5*46+37idaassign98...7.1.3三地址代码三地址代码是由下面一般形式的语句构成的序列:X:=yopz其中,x、y、z为名字、常数或编译时产生的临时变量(存放中间结果,对应于语法树的内部节点);op代表运算符号如定点运算符、浮点运算符、逻辑运
12、算符等。每个语句的右边只能有一个运算符。每条语句通常包含三个地址:两个操作数地址,一个操作结果地址三地址码示例t1:=-ct2:=b*t1t3:=-ct4:=b*t3t5:=t2+t4a:=t5assigna+*bcuminus*uminuscba:=b*-c+b*-c三地址