版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
语法制导翻译和中间代码生成演示文稿第一页,共五十页。优选语法制导翻译和中间代码生成第二页,共五十页。目标程序源程序词法分析语法分析语义分析中间代码生成代码优化目标代码生成表格管理出错处理第三页,共五十页。语义分析基础语义分析的内容主要是类型相容检查,有以下几种:各种条件表达式的类型是不是boolean型?运算符的分量类型是否相容?赋值语句的左右部的类型是否相容?形参和实参的类型是否相容?下标表达式的类型是否为所允许的类型?函数说明中的函数类型和返回值的类型是否一致?第四页,共五十页。语义分析基础-语义分析的内容(续)其它语义检查:V[E]中的V是不是变量,而且是数组类型?V.i中的V是不是变量,而且是记录类型?i是不是该记录的域名?x+f(…)中的f是不是函数名?形参个数和实参个数是否一致?每个使用性标识符是否都有声明?有无标识符的重复声明?第五页,共五十页。语义分析基础在语义分析同时产生中间代码,在这种模式下,语义分析的主要功能如下:语义审查在扫描声明部分时构造标识符的符号表在扫描语句部分时产生中间代码中间代码:独立于机器,复杂性介于源语言和机器语言之间,十分接近目标机器指令的一种表示形式。对于中间代码的产生,是很困难的,因为语义形式化比语法形式化难得多。目前普遍采用的语义分析方法——语法制导翻译方法 使用属性文法为工具来说明程序设计语言的语义。第六页,共五十页。6.1属性文法(AttributeGrammar)属性 对文法的每一个符号,引进一些属性,这些属性代表与文法符号相关的信息,如类型、值、存储位置等。语义规则 为文法的每一个产生式配备的计算属性的计算规则,称为语义规则。属性文法是带属性的一种文法 它的主要思想:首先对于每个文法符号引进相关的属性符号;其次对于每个产生式写出计算属性值的语义规则第七页,共五十页。6.1属性文法(续)属性文法的形式定义 一个属性文法是一个三元组,A=(G,V,F)G是一个上下文无关文法;V是属性的有穷集;F是关于属性的断言的有穷集。说明: 每个属性与文法符号相联,N.t表示文法符号N的属性t。属性值又称语义值。存储属性值的变量又称语义变量。每个断言与文法的某个产生式相联,写在{}内。属性的断言又称语义规则,它所描述的工作可以包括属性计算、静态语义检查、符号表的操作、代码生成等,有时写成函数或过程段。第八页,共五十页。6.1属性文法(续)例完成类型检查的属性文法E→T1+T2 {T1.t=intANDT2.t=int}E→T1orT2 {T1.t=boolANDT2.t=bool}T→num {T.t:=int}T→true {T.t:=bool}T→false {T.t:=bool}
第九页,共五十页。6.1属性文法(续)属性的分类:综合属性:从语法树的角度来看,如果一个结点的某一属性值是由该结点的子结点的属性值计算来的,则称该属性为综合属性。内在属性是综合属性。用于“自下而上”传递信息第十页,共五十页。6.1属性文法(续)继承属性从语法树的角度来看,若一个结点的某一属性值是由该结点的兄弟结点和(或)父结点的属性值计算来的,则称该属性为继承属性。用于“自上而下”传递信息特别说明:终结符只有综合属性,它们由词法分析器提供非终结符既有综合属性也有继承属性,但文法开始符没有继承属性第十一页,共五十页。6.1属性文法(续)例简单算术表达式求值的属性文法L→E {Print(E.val)}E→E1+T {E.val:=E1.val+T.val}E→T {E.val:=T.val}T→T1*F {T.val:=T1.val*F.val}T→F {T.val:=F.val}F→(E) {F.val:=E.val}F→digit {F.val:=digit.lexval}
E.val、T.val、F.val都是综合属性终结符digit只有综合属性lexval
,它的值由词法分析器提供第十二页,共五十页。6.2语法制导翻译概论语法制导翻译基本思想:
在语法分析过程中,随着分析的步步进展,每当使用一条产生式进行推导(对于自上而下分析)或归约(对于自下而上分析),就执行该产生式所对应的语义动作(语义子程序),完成相应的翻译工作(产生中间代码)。语法制导翻译法不论对自上而下分析或自下而上分析都适用。第十三页,共五十页。例简单算术表达式求值的属性文法E→E1+T {E.val:=E1.val+T.val}E→T {E.val:=T.val}T→T1*digit{T.val:=T1.val*digit.lexval}T→digit {T.val:=digit.lexval}
2+3*5的语法树:EE1+TT1*5T23T.val=2T.val=3T.val=15E.val=2E.val=17自下而上语法制导翻译过程:一旦语法分析确认输入符号串是一个句子,它的值也同时由语义规则计算出来第十四页,共五十页。6.3中间代码的形式定义: 中间代码是独立于机器,复杂性介于源语言和机器语言之间,十分接近目标机器指令的一种表示形式。使用中间代码的好处:中间代码与具体机器无关,便于编译程序改变目标机便于对中间代码进行与机器无关的优化表示形式: 逆波兰式、四元式、三元式、间接三元式和树形表示第十五页,共五十页。6.3.1逆波兰表示法(后缀式)
逆波兰表示法 将运算对象写在前面,把运算符写在后面,因而也称后缀式。 例如:程序设计语言中的表示逆波兰表示a+bab+a+b*cabc*+(a+b)*cab+c*第十六页,共五十页。bt1dct1t2t1t3t1=-bt2=c*dt3=t1+t2例:表达式-b+c*d的后缀式b@cd*+的计值过程后缀式的计算机处理后缀式的最大优点是易于计算机处理处理过程: 从左到右扫描后缀式,每碰到运算对象就推进栈;碰到运算符就从栈顶弹出相应目数的运算对象施加运算,并把结果推进栈。最后的结果留在栈顶。第十七页,共五十页。逆波兰表示法的扩充 逆波兰表示法很容易扩充到表达式以外的范围 例如:语句逆波兰表示备注a:=b+cabc+:=:=看作二目运算符GOTOLLjumpjump看成一目运算符,表示GOTOIfEthenS1elseS2ES1S2¥把¥看成三目运算符,表示if–then–else第十八页,共五十页。6.3.2三元式三元式
(算符op,第一个运算对象ARG1,第二个运算对象ARG2)说明:三元式的某些运算对象是另一个三元式的编号(代表其结果)一目算符只需选用一个运算对象(ARG1)多目算符可用连续几个三元式表示 例:
a:=b*c+b*d表示为(1)(*, b, c )(2)(*, b, d )(3)(+, (1), (2) )(4)(:=, (3), a )第十九页,共五十页。6.3.3树形表示树形表示 二目运算对应二叉子树,多目运算对应多叉子树,但通常通过引入新结点表示成二叉子树。
例如:a:=b*c+b*d表示成:=a+**bcbd叶子结点代表运算量,非叶子结点代表运算符第二十页,共五十页。6.3.4四元式四元式 四元式是一种比较普遍采用的中间代码形式
(算符op,ARG1,ARG2,运算结果RESULT)例如:a:=b*c+b*d的四元式表示如下:(*, b, c, t1)(*, b, d, t2)(+, t1, t2, t3)(:=, t3, -, a)其中ti(i=1,2,3)是编译程序引入的临时变量第二十一页,共五十页。6.3.4四元式(续)四元式的优点:四元式比三元式更便于优化 优化要求改变运算顺序或删除某些运算,引起编号的变化。 三元式通过编号引用中间结果,编号的变化引起麻烦;四元式通过临时变量引用中间结果,编号变化无影响。四元式对生成目标代码有利 四元式表示很类似于三地址指令,很容易转换成机器代码。第二十二页,共五十页。6.3.4四元式(续)四元式的另一种表示 有时为了更直观,把四元式写成简单赋值形式或更易理解的形式(三地址码)四元式直观形式(1)(*,b,c,t1)(1)t1:=b*c(2)(*,b,d,t2)(2)t2:=b*d(3)(+,t1,t2,t3)(3)t3:=t1+t2(4)(:=,t3,-,a)(4)a:=t3第二十三页,共五十页。6.3.5间接三元式为了便于优化处理,不直接使用三元式,而是另设一张指示器表(称为间接码表),它按照运算的先后顺序列出有关三元式在三元式表中的位置。即:用一张间接码表辅以三元式表的方法来表示中间代码。四元式、间接三元式的优化同样方便,三元式的优化十分困难。第二十四页,共五十页。举例:给出A+B*(C-D)+E/(C-D)^N的逆波兰式、四元式、三元式、间接三元式的表示1、逆波兰式:ABCD-*+ECD-N^/+2、四元式:(-,C,D,T1)(*,B,T1,T2)(+,A,T2,T3)(-,C,D,T4)(^,T4,N,T5)(/,E,T5,T6)(+,T3,T6,T7)第二十五页,共五十页。举例:给出A+B*(C-D)+E/(C-D)^N的逆波兰式、四元式、三元式、间接三元式的表示3、三元式:(-,C,D)(*,B,1))(+,A,2))(-,C,D)(^,4),N)(/,E,5))(+,3),6))4、间接三元式:(-,C,D)(*,B,1))(+,A,2))(^,1),N)(/,E,4))(+,3),5))间接码表1)2)3)1)4)5)6)第二十六页,共五十页。6.4语法制导翻译主要讨论自下而上的语法制导翻译在一个产生式进行归约时,执行相应的语义动作进行翻译(产生中间代码)第二十七页,共五十页。简单赋值语句到四元式的翻译简单赋值语句 是指不含复杂数据类型(如数组,记录等)的赋值语句。赋值语句的语义检查包括:每个使用性标识符是否都有声明?运算符的分量类型是否相容?赋值语句的左右部的类型是否相容?赋值语句的翻译目标: 在赋值语句右部表达式产生的四元式序列后加一条赋值四元式第二十八页,共五十页。简单赋值语句到四元式的翻译考虑如下文法描述的简单赋值句的翻译:A→i:=EE→E+E|E*E|-E|(E)|i(6.1)A代表赋值语句,设只含整型变量的运算1、需要定义一系列的语义变量和语义过程:NEWTEMP:函数,生成临时变量,每次调用生成一个新的临时变量,如t1,t2,…返回一个整数码作为函数值。ENTRY(i):函数过程,查找并取得与i相对应的标识符在符号表中的位置(入口),简称i值。E.PLACE:与E相联系的语义变量,表示存放E值的变量名在符号表的入口。GEN(OP,ARG1,ARG1,RESULT):语义过程,将四元式(OP,ARG1,ARG1,RESULT)填进四元式表中。第二十九页,共五十页。使用上述变量和过程,对文法6.1所定义的赋值语句的翻译算法可由下述语义动作予以描述简单赋值语句到四元式的翻译产生式语义动作A→i:=E{GEN(:=,E.PLACE,-,ENTRY(i))}E→E(1)+E(2){E.PLACE:=NEWTEMP;GEN(+,E(1).PLACE,E(2).PLACE,E.PLACE)}E→E(1)*E(2){E.PLACE:=NEWTEMP;GEN(*,E(1).PLACE,E(2).PLACE,E.PLACE)}E→-E(1){E.PLACE:=NEWTEMP;GEN(@,E(1).PLACE,-,E.PLACE)}E→(E(1)){E.PLACE:=E(1).PLACE}E→i{E.PLACE:=ENTRY(i)}第三十页,共五十页。输入串栈PLACE四元式A:=-B*(C+D):=-B*(C+D)iA-B*(C+D)i:=A_B*(C+D)i:=-A__*(C+D)i:=-iA__B*(C+D)i:=-EA__B(@,B,-,T1)*(C+D)i:=EA_T1(C+D)i:=E*A_T1_C+D)i:=E*(A_T1__+D)i:=E*(iA_T1__C+D)i:=E*(EA_T1__CD)i:=E*(E+A_T1__C_)i:=E*(E+iA_T1__C_D)i:=E*(E+EA_T1__C_D(+,C,D,T2))i:=E*(EA_T1__T2i:=E*(E)A_T1__T2_i:=E*EA_T1_T2(*,T1,T2,T3)i:=EA_T3(:=,T3,-,A)A2例:写出下面赋值语句A:=-B*(C+D)的自下而上语法制导翻译的过程,及生成的四元式。A→i:=EE→E+E|E*E|
-E|(E)|i四元式为:(1)(@,B,-,T1)(2)(+,C,D,T2)(3)(*,T1,T2,T3)(4)(:=,T3,-,A)第三十一页,共五十页。3、类型转换表达式中可能出现不同类型的变量和常量若不接受不同类型的运算对象混合运算,则应指出错误;若接受混合运算则要进行类型转换处理。例:假定表达式可以有混合运算,变量可以是整型和实型,且当两个不同类型的变量进行运算时先把整型变量转换成实型,再进行运算。用+i,*i,
@i表示整型运算,用+r,*r,@r表示实型运算,用一目算符itr表示将整型量转换成实型量的运算令文法6.1中的i既可以是整型也可以是实型用E.MODE表示E的类型信息,其值为int或r,则产生式E→E(1)opE(2)的语义动作中,关于E.MODE的语义规则可定义为:{ifE1.MODE=intANDE2.MODE=intthenE.MODE:=intelseE.MODE:=r}第三十二页,共五十页。3、类型转换(续)E→E(1)opE(2)
的语义程序应该修改,必要时产生对运算量进行类型转换的四元式:(itr,A,-,T),表示把整型A转换成实型量,结果存于T中。例:假定输入串为X:=Y+I*J,其中X,Y为实型,I,J为整型,则其产生的四元式为:
(1)(*i,I,J,T1)(2)(itr,T1,-,T2)(3)(+r,Y,T2,T3)(4)(:=,T3,-,X)例:关于产生式E→E(1)opE(2)
的语义子程序更为具体的描述为:第三十三页,共五十页。T:=NEWTEMP;IFE1.MODE=intANDE2.MODE=intTHENBEGINGEN(opi,E1.PLACE,E2.PLACE,T);E.MODE:=intENDELSEIFE1.MODE=rANDE2.MODE=rTHENBEGINGEN(opr,E1.PLACE,E2.PLACE,T);E.MODE:=rENDELSEIFE1.MODE=int/*ANDE2.MODE=r*/THENBEGIN U:=NEWTEMP;GEN(itr,E1.PLACE,-,U); GEN(opr,U,E2.PLACE,T);E.MODE:=rENDELSE/*E1.MODE=rANDE2.MODE=int*/
BEGIN U:=NEWTEMP;GEN(itr,E2.PLACE,-,U); GEN(opr,E2.PLACE,U,T);E.MODE:=rENDE.PLACE:=TE→E(1)opE(2)第三十四页,共五十页。布尔表达式的两个作用:用于逻辑运算,计算逻辑值作为控制语句(如if-then,while)的条件表达式布尔表达式由布尔算符(not,and,or)作用于布尔变量(或常数)或关系表达式而形成的。关系表达式的形式:E1ropE2,rop是关系算符(如<=,<,=,≠,>,>=)布尔表达式到四元式的翻译第三十五页,共五十页。为简单起见,只考虑如下形式的布尔表达式的翻译,文法(6.2) E→EorE|EandE|notE|(E)|idropid|id布尔算符的优先顺序(从高到低)为:not,and,or,且and和or都服从左结合,not服从右结合关系算符的优先级都相同,而且高于任何布尔算符,低于任何算术算符布尔表达式到四元式的翻译-续第三十六页,共五十页。1.布尔表达式的计算方法:
采用两种方法:数值表示的直接计算与逻辑表示的短路计算直接计算与算术表达式计算方法基本相同 如:1or0and1=1or0的结果为:1短路计算即布尔表达式计算到某一部分就可以得到结果,而无需对布尔表达式进行完全计算。可以用if-then-else来解释
AorB ifAthentrueelseB AandB ifAthenBelsefalse notA ifAthenfalseelsetrue第三十七页,共五十页。2、直接计算的语法制导翻译布尔表达式有两种翻译方法。(视计算机硬件条件来确定,如果执行条件转移效率较低,就用第一种方法)直接计算的语法制导翻译如同翻译算术表达式一样来翻译布尔表达式如:AorBandnotC被翻译成:
(1)(not, C, -, T1) (2)(and, B, T1, T2) (3)(or, A, T2, T3)第三十八页,共五十页。3.作为条件控制的布尔式翻译基本翻译方法 当布尔表达式用于控制条件时,并不需要计算表达式的值,而是一旦确定了表达式为真或为假,就将控制转向相应的代码序列。S2的代码S1的代码E的代码E.falseE.trueifEthenS1elseS2为布尔表达式E引入两个新的属性:E.true:表达式的真出口,它指向表达式为真时的转向E.false:表达式的假出口,它指向表达式为假时的转向第三十九页,共五十页。把布尔表达式E翻译成下述形式的条件转移和无条件转移的四元式序列:(jnz,A,-,p)
若A为真,则转向四元式p(jrop,A,B,p)
若AropB为真,则转向四元式p(j,-,-,p)
无条件转向四元式p3.作为条件控制的布尔式翻译-续第四十页,共五十页。(1) (jnz,A,-,5) A的真出口为5(2) (j,-,-,3) A的假出口为3(3) (j<,B,D,5) B<D的真出口为5(4) (j,-,-,p+1) B<D的假出口为(p+1)(5) (关于S1的四元式序列)(p) (j,-,-,q) 跳过S2的代码段(p+1) (关于S2的四元式序列)(q)(1)-(4)是布尔式AorB<D
翻译产生的代码,全部是条 件转移和无条件转移四元式,没有布尔运算。例:ifAorB<DthenS1elseS2翻译成如下四元式序列第四十一页,共五十页。具体说明如下:
用E.true和E.false分别表示E的“真”和“假”出口转移目标,在翻译E时并未能确定。对于E为aropb
形式,生成代码如下:
(jrop,a,b,E.true) (j,-,-,E.false)
以结构图表示:E的代码E.falseE.true第四十二页,共五十页。对于E为E1orE2的形式,生成代码结构如下:E1.的代码E2.的代码E1.falseE2.falseE.falseE1.trueE2.trueE.true若E1为真,则可知E为真,即E1的真出口和E的真出口一样;若E1为假,则必须计算E2,因此E1的假出口应是E2代码的第一个四元式序号;E2的真出口和假出口分别与E的真出口和假出口一样第四十三页,共五十页。E1.的代码E2.的代码E1.falseE2.falseE.falseE1.trueE2.trueE.true对于E为E1andE2的形式,生成代码结构如下:对于E为notE1形式,只需调换E1的真假出口,即可得到E的真假出口。第四十四页,共五十页。例:E为a<borc<dande>f
,翻译为四元式序列:(1)
( j<, a, b, E.true)(2)
( j, -, -, (3))(3)
( j<, c, d, (5))(4)
( j, -, -, E.false)(5)
( j>, e, f, E.true)(6)
( j, -, -, E.false)举例真假出口的拉链与回填在把布尔式翻译成一串条件转和无条件转四元式时,真假出口未能在生成四元式时确定;而且多个四元式可能有相同的出口第四十五页,共五十页。说明:E.true和E.false不能在产生四元式的同时确定,要等将来目标明确时再回填,为此要记录这些要回填的四元式。通常采用“拉链”的办法,把需要回填E.true的四元式拉成一条“真”链,把需要回填E.false的四元式拉成一条“假”链。ifa<borc<dande>fthenS1elseS2翻译为四元式序列:(1)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度公益岗位用工合作协议3篇
- 2025年度电商平台会员消费返利协议3篇
- 2025年度废塑料瓶回收与环保瓶盖生产合同样板3篇
- 二零二五年度农机智能化作业合同书3篇
- 二零二五年度电子信息产品开发合作协议书2篇
- 二零二五年度消防安全风险评估与整改方案协议3篇
- 农村土地经营权抵押贷款担保合同
- 2025年度医药研发人员竞业禁止劳动合同书3篇
- 2025年度餐饮业食品安全责任书3篇
- 二零二五年度历史文化名城拆迁房产分割与文物保护合同3篇
- 手术室发生地震应急预案演练
- 配合、协调、服务方案
- 市政工程监理大纲
- 2023-2024学年广东省广州市黄埔区六年级(上)期末数学试卷(A卷)
- 初中数学新课程标准(2024年版)
- 2024年北京市学业水平合格性地理试卷(第一次)
- 黑龙江哈尔滨六中2025届高三第六次模拟考试数学试卷含解析
- GB/T 36547-2024电化学储能电站接入电网技术规定
- 会议记录培训教材课件幻灯片
- 期末测试卷(一)2024-2025学年 人教版PEP英语五年级上册(含答案含听力原文无听力音频)
- 2024-2030年中国薯条行业发展趋势及投资盈利预测报告
评论
0/150
提交评论