当前位置:
文档之家› 第四章 语义分析和中间代码生成
第四章 语义分析和中间代码生成
4.1.3 抽象 语法)树(图表示)对语法树稍加修改,即可以 作为中间代码的一种形式。 例 :赋值语句x=a-b*c的树的中间代码表示如下页图所示。 在抽象语法树表示中,每个叶结点都表示诸如常量或变量 这样的运算对象,而其它内部结点则表示运算符。
图: x=a-b*c的抽象语法树表示
树与其他三种中间代码的关系。对树进行深度优先的
后序遍历,得到的线性序列就是后缀式,或者说后缀式是 树的一个线性化序列;而对于每棵父子关系的子树,父亲 节点作为操作符,两个孩子节点作为操作数,恰好组成一 个三元式,且父亲节点的序号成为三元式的序号。为每个 三元式序号赋一个临时变量,就不难将三元式转换为四元 式。
二、四元式
四元式格式:(op,arg1,arg2,result) 例:x=a+b*c 表示为:
① (*, b, c ,T1) ② (+, a,T1,T2) ③ (:=,x,T2,T3) 练习:写出下列两式的三元式、四元式表达。 1、(a+b*c)/(a+b)-d 2、(a+b)*(c+d)+(a+b-c)
1、a+b*(c+d/e) 2 、-a+b*(-c+d) 3、-(a+b)*(c+d)-(a+b*c)
返回目录
4.1 中间代码简介
中间代码起到了前端后端分水岭的作用。应该 具有以下作用: 1.便于语法制导翻译 2.即与机器指令的结构相近,又与具体的机 器无关。 中间代码主要有如下几种: 逆波兰表示法、抽象语法树、三地址代码。
4.1.1逆波兰式(后缀式、无括号示) 逆波兰式 后缀式、无括号示)
特征:操作数在前,操作符在后。 (二叉树的后续遍历) 例:a+b*c abc*+ 练习: 1.(a*b+c) / 2
1. ab*c+2/
2. X:=A-B/(C+D)
2. XABCD+/- :=
4.1.2 三地址代码
三地址码是由不超过三个地址组成的一个运算。 三地址码与汇编指令在结构上十分接近,从三地址 码生成目标代码比较容易。 三地址码的实现:三元式和四元式。
一、三元式
表示形式:(i)(op,arg1,arg2) 例:x:=a+b*c 表示为: (1) (*, b, c ) (2) (+, a,(1)) (3) (:=,x,(2))