语法制导翻译和中间代码生成.ppt
第1页,共27页,星期日,2025年,2月5日使用中间语言的好处:复杂性界于源语言和目标语言之间便于进行与机器无关的代码优化工作易于移植使编译程序的结构在逻辑上更为简单明确源语言程序目标语言程序中间语言程序CompilerFrontEndCompilerBackEnd----编译程序----输入输出第2页,共27页,星期日,2025年,2月5日语法制导翻译和中间代码生成文法的语法制导定义(语义规则)和翻译方案--语法制导定义--语义分析?做什么--翻译方案--中间代码生成?怎么做第3页,共27页,星期日,2025年,2月5日中间语言高级的:接近源语言。语法树,适合完成静态类型检查。低级的:接近目标语言。适合完成依赖于机器的任务。常用的中间语言:后缀式:逆波兰表示图表示:DAG、抽象语法树三地址代码三元式、四元式中间代码的选择可以是一种实际的语言也可以是编译各阶段共享的内部数据结构7.1中间语言第4页,共27页,星期日,2025年,2月5日P200后缀式定义写出3+4*5的后缀式写出b*(-c)+b*(-c)的后缀式后缀式表示:算术表达式、赋值语句、控制语句后缀式的计算用一个栈实现一般的计算过程是:自左至右扫描后缀式,每碰到运算量(操作量)就把它推进栈。每碰到k目运算符就把它作用于栈顶的k个项,并用运算结果代替这k个项。7.1.1后缀式第5页,共27页,星期日,2025年,2月5日7.1.2图表示法图表示法DAG-无循环有向图抽象语法树第6页,共27页,星期日,2025年,2月5日7.1.2图表示法无循环有向图(简称DAG)对表达式中的每个子表达式,DAG中都有一个结点一个内部结点代表一个操作符,它的孩子代表操作数在一个DAG中代表公共子表达式的结点具有多个父结点第7页,共27页,星期日,2025年,2月5日7.1.3三地址代码三地址代码x=yopz三地址代码可以看成是抽象语法树或DAG的一种线性表示树与其他中间代码的关系第8页,共27页,星期日,2025年,2月5日a:=b*(-c)+b*(-c)的图表示法
请画出语法树和DAG:=a+*b-cDAG:=a+*b-c抽象语法树*b-c第9页,共27页,星期日,2025年,2月5日抽象语法树对应的代码:t1=-c t2=b*t1 t3=-c t4=b*t3 t5=t2+t4 a=t5assigna+*buminusc抽象语法树*buminusc第10页,共27页,星期日,2025年,2月5日DAG对应的代码:t1=-ct2=b*t1t5=t2+t2a=t5assigna+*buminuscDAG抽象语法树对应的代码:t1=-c t2=b*t1 t3=-c t4=b*t3 t5=t2+t4 a=t5第11页,共27页,星期日,2025年,2月5日作业:P2217.1第12页,共27页,星期日,2025年,2月5日7.3中间代码生成
----赋值语句翻译成三地址代码产生三地址代码赋值语句翻译方案填查符号表词法分析发布出错信息第13页,共27页,星期日,2025年,2月5日语法制导翻译第14页,共27页,星期日,2025年,2月5日三地址代码的形式:
1.三元式、2.四元式、3.间接三元式1、三元式三元式:(i)(op,arg1,arg2)三地址码:(i):=arg1oparg2例4.5表达式x:=a+b*c的三元式: (1)(*,b,c) (2)(+,a,(1)) (3)(:=,x,(2))标识符a,b,c,x分别表示它们的存储位置,序号(1)、(2)、(3)分别是它们在三元式表中的位置。 ■第15页,共27页,星期日,2025年,2月5日三地址代码的形式:
三元式、四元式、间接三元式2、四元式四元式:(i)(op,arg1,arg2,result)四地址码:result:=arg1oparg2例4.5表达式x:=a+b*c的四元式: (1)