




已阅读5页,还剩35页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第七章 语义分析和 中间代码产生,概述,静态语义检查 类型检查 控制流检查 一致性检查 相关名字检查 名字的作用域分析,语法分 析器,中间代码 产生器,静态检 查器,中间代码,优化器,中间语言(复杂性界于源语言和目标语言之间)的好处: 便于进行与机器无关的代码优化工作 易于移植 使编译程序的结构在逻辑上更为简单明确,源语言 程序,目标语 言程序,中间语 言程序,内容线索,中间语言 说明语句 赋值语句的翻译 布尔表达式的翻译 控制语句的翻译 过程调用的处理,中间语言,常用的中间语言 后缀式,逆波兰表示 图表示 DAG 抽象语法树 三地址代码 三元式 四元式 间接三元式,后缀式,后缀式表示法:Lukasiewicz发明的一种表示表达式的方法,又称逆波兰表示法。 一个表达式E的后缀形式可以如下定义: 1. 如果E是一个变量或常量,则E的后缀式是E自身。 2. 如果E是E1 op E2形式的表达式,其中op是任何二元操作符,则E的后缀式为E1 E2 op,其中E1 和E2 分别为E1 和E2的后缀式。 3. 如果E是(E1)形式的表达式,则E1的后缀式就是E的后缀式。,逆波兰表示法不用括号。只要知道每个算符的目数,对于后缀式,不论从哪一端进行扫描,都能对它进行唯一分解。 后缀式的计算 用一个栈实现。 一般的计算过程是:自左至右扫描后缀式,每碰到运算量就把它推进栈。每碰到k目运算符就把它作用于栈顶的k个项,并用运算结果代替这k个项。,把表达式翻译成后缀式的语义规则描述,E.code表示E后缀形式 op表示任意二元操作符 “|”表示后缀形式的连接,数组POST存放后缀式:k为下标,初值为1 上述语义动作可实现为: 产生式 程序段 EE(1)op E(2) POSTk:=op;k:=k+1 E (E(1) Ei POSTk:=i;k:=k+1 例:输入串a+b+c的分析和翻译 POST: 1 2 3 4 5,EE(1)op E(2) E.code:= E(1).code | E(2).code |op E (E(1) E.code:= E(1).code Eid E.code:=id,a,b,+,c,+,图表示法,DAG 抽象语法树,DAG,有向无循环图(Directed Acyclic Graph,简称DAG) 对表达式中的每个子表达式,DAG中都有一个结点 一个内部结点代表一个操作符,它的孩子代表操作数 在一个DAG中代表公共子表达式的结点具有多个父结点,a+a*(b-c)+(b-c)*d的图表示法,+,a,*,-,b,d,c,*,+,后缀表达式:aabc-*+bc- d *+,抽象语法树,在语法树中去掉那些对翻译不必要的信息,从而获得更有效的源程序中间表示。这种经变换后的语法树称之为抽象语法树(Abstract Syntax Tree),Sif B then S1 else S2,3*5+4,建立表达式的抽象语法树,mknode (op,left,right) 建立一个运算符号结点,标号是op,两个域left和right分别指向左子树和右子树。 mkleaf (id,entry) 建立一个标识符结点,标号为id,一个域entry指向标识符在符号表中的入口。 mkleaf (num,val) 建立一个数结点,标号为num,一个域val用于存放数的值。,建立抽象语法树的语义规则,产 生 式 语 义 规 则 EE1+T E.nptr := mknode ( +, E1.nptr, T.nptr ) EE1-T E.nptr := mknode ( -, E1.nptr, T.nptr ) ET E.nptr := T.nptr T (E) T.nptr := E.nptr Tid T.nptr := mkleaf ( id, id.entry ) Tnum T.nptr := mkleaf ( num, num.val ),a4c的抽象语法树,E nptr,T nptr,E nptr,To entry for a,E,T nptr,id,-,T nptr,id,To entry for c,num,a:=b*(-c)+b*(-c)的图表示法,产生赋值语句抽象语法树的属性文法,产 生 式 语义规则 Sid:=E S.nptr:=mknode(assign, mkleaf(id,id.place),E.nptr) EE1+E2 E.nptr:=mknode(+,E1.nptr,E2.nptr) EE1*E2 E.nptr:=mknode(*,E1.nptr,E2.nptr) E-E1 E.nptr:=mknode(uminus,E1.nptr) E (E1) E.nptr:=E1.nptr Eid E.nptr:=mkleaf(id,id.place),三地址代码,三地址代码 x:=y op z 三地址代码可以看成是抽象语法树或DAG的一种线性表示,DAG对应的代码: T1:=-c T2:=b*T1 T5:=T2+T2 a:=T5,抽象语法树对应的代码: T1:=-c T2:=b*T1 T3:=-c T4:=b*T3 T5:=T2+T4 a:=T5,a:=b*(-c)+b*(-c)的图表示法,三地址语句的种类,x:=y op z x:=op y x:=y goto L if x relop y goto L或if a goto L param x和call p,n,以及返回语句return y x:=yi及xi:=y的索引赋值 x:=&y, x:=*y和*x:=y的地址和指针赋值,x:=&y 把y的地址赋给x,其中y是一个名字,或者是一个临时变量,代表一个具有左值的表达式 x:=*y 把y所指示的地址单元里存放的内容赋给x,其中y是一个指针或者是一个其右值为地址的临时变量。 *x:=y 把y的右值赋给x所指向的对象的右值,生成三地址代码时,临时变量的名字对应抽象语法树的内部结点 id:=E 对表达式E求值并置于变量T中 id.place:=T,从赋值语句生成三地址代码的S-属性文法,非终结符号S有综合属性S.code,它代表赋值语句S的三地址代码。 非终结符号E有如下两个属性: E.place表示存放E值的名字。 E.code表示对E求值的三地址语句序列。 函数newtemp的功能是,每次调用它时,将返回一个不同临时变量名字,如T1,T2,。 gen表示生成三地址语句,为赋值语句生成三地址代码的S-属性文法定义,产生式 语义规则 Sid:=E S.code:=E.code | gen(id.place := E.place) EE1+E2 E.place:=newtemp; E.code:=E1.code | E2.code | gen(E.place := E1.place + E2.place) EE1*E2 E.place:=newtemp; E.code:=E1.code | E2.code | gen(E.place := E1.place * E2.place) E-E1 E.place:=newtemp; E.code:=E1.code | gen(E.place := uminus E1.place) E (E1) E.place:=E1.place; E.code:=E1.code Eid E.place:=id.place; E.code= ,三地址语句,四元式 一个带有四个域的记录结构,这四个域分别称为op, arg1, arg2及result op arg1 arg2 result (0) uminus c T1 (1) * b T1 T2 (2) uminus c T3 (3) * b T3 T4 (4) + T2 T4 T5 (5) := T5 a,三地址语句,三元式 通过计算临时变量值的语句的位置来引用这个临时变量 三个域:op、arg1和arg2 op arg1 arg2 (0) uminus c (1) * b (0) (2) uminus c (3) * b (2) (4) + (1) (3) (5) assign a (4),三地址语句,xi:=y op arg1 arg2 (0) = x i (1) assign (0) y x:=yi op arg1 arg2 (0) = y i (1) assign x (0),三地址语句,间接三元式 为了便于优化,用 三元式表+间接码表 表示中间代码 间接码表:一张指示器表,按运算的先后次序列出有关三元式在三元式表中的位置。 优点: 方便优化,节省空间,例如,语句 X:=(A+B)*C; Y:=D(A+B) 的间接三元式表示如下表所示。,四元式、三元式和间接三元式比较,三元式中使用了指向三元式的指针,优化时修改较难。 间接三元式优化只需要更改间接码表,并节省三元式表存储空间。 修改四元式表也较容易,只是临时变量要填入符号表,占据一定存储空间。,三元式中使用了指向三元式的指针,优化时修改较难。 间接三元式优化只需要更改间接码表,并节省三元式表存储空间。 修改四元式表也较容易,只是临时变量要填入符号表,占据一定存储空间。,四元式、三元式和间接三元式比较,1. 后缀式 后缀式表示法又称逆波兰表示法,是一种表示表达式的方法,它把运算量(操作数)写在前面,算符写在后面 例:中缀表示: a+b,a+b*c,m=1,(a+b)*c, (a+b)*(c-d) 后缀表示: ab+, abc*+, m1=,ab+c*, ab+cd-* 特点: 运算分量的个数与先后次序不变; 运算符的个数不变, 但其出现顺序即为执行顺序 无括号;,7. 2 中间语言,一个表达式E的后缀式可如下定义:,(1)如果E是一个变量或常数,则E的后缀式是E自身; (2)如果E是E1opE2形式的表达式,op是二元操作符,则E的后缀式为E1E2op, E1和E2分别为E1和E2的后缀式; (3)如果E是(E1)形式的表达式,则E1的后缀式就是E的后缀式,二叉树遍历法即后序遍历二叉树 例如:(a+b) / (c-d)) e,/,+,-,e,a b c d,中序遍历( 左 中 右 ): (a+b) / (c-d) e 后序遍历( 左 右 中): ab+cd- / e ,中缀到后缀的转换,后缀式的推广 例 条件算术表达式: if e then X else Y 三目运算 if - then - else : ¥,eXY ¥=,X e0 即e为. T. Y e =0 即e为. F.,转移指令: 无条件转: p jump 小于转: e1 e2 p jlt 为零转: e p jez e p1 jez X p2 jump p1: Y P2:,p1 p2 POST: e p1 jez X p2 jump Y,. . .,例 if (x+y)*z = 0 then (a+b)c else abc 后缀式: (1) xy+z*0 = ab+c abc ¥ (2) xy+z*0 = p1 jez ab+c p2 jump p1: abc p2:,2、树: 也可以用树型结构表示表达式或语句。对表达式中的每个子表达式表式为一棵子树,即简单变量或常数的树就是该变量或常数自身。如果表示e1和e2的树为T1和T2,那么,e1+e2,e1*e2,-e1的树分别为:,+ * _(uminus),T1 T2 T1 T2 T1,e1 + e2 e1 * e2 - e1,+,* *,A B C D A*B+C*D的树,双目运算对应二叉子树,多目运算对应多叉子树。 后缀式是树的后序遍历序列。,3、三地址代码 一般形式:x:=y op z 如: x:=y op z 二元赋值 x:= op y 一元赋值 x:=y 复制赋值 goto L 无条件转移 if x relop y goto L 条件转移 if a goto L 条件转移 三地址代码在具体实现时常表示为记录结构,如四元式、三元式、间接三元式。,四元式 一个四元式是一个带有四个域的记录结构 ( op, arg1, arg2, result ) op 运算符,arg1,arg2 运算数,result 运算结果,例 a:= b*-c+b*-c 的四元式序列: op arg1 arg2 result (1) ( c _ T1 ) (2) ( * b T1 T2 ) (3) ( c _ T3 ) (4) ( * b T3 T4 ) (5) (+ T2 T4 T5) (6) (:= T5 _ a),四元式之间的联系通过临时变量实现。 单目运算只用arg1域,转移语句将目标标号放入 result域。 arg1,arg2,result通常为指针,指向有关名字的符号 表入口,且临时变量填入符号表。,三元式 一个三元式有三个域 ( op, arg1, arg2 ),其中:arg1,arg2为指向符号表的指针(对程序中的名字或常量)或者是指向三元式表的指针(取代临时变量)。,例:a:= b*-c+b*-c 的三元式序列: op arg1 arg2
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年黑龙江伊春森工集团有限责任公司招聘51人笔试参考题库附带答案详解
- 研究生复试常见试题解析
- 2025年儿科常见疾病药物治疗考试答案及解析
- 金属首饰保养方法
- 奋发向上共创未来致辞
- 传染病医院感染监测规定
- 识字教学经验总结与改进建议
- 简单步骤助你打造室内中空花园
- 大数据存储架构规划
- 2025年病理学病理标本切片观察评估模拟考试答案及解析
- DBJT15-147-2018 建筑智能工程施工、检测与验收规范
- 华为鸿蒙课件
- 全站仪使用课件
- 中国心房颤动管理指南(2025)解读
- 2025年成人高考专升本民法真题及答案
- 2024年云南省公务员考试行测真题参考答案详解
- 初中普法主题教育
- 多发骨折病人疑难病例讨论
- 草果种植技术课件大全
- 2025年水利A证考试题及答案
- 新疆就业政策课件
评论
0/150
提交评论