版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Compiler Construction Principles语义分析的任务:语义分析的任务:静态语义审查静态语义审查 审查每个语法结构的静态语义审查每个语法结构的静态语义,即验证语法结构合法的程序即验证语法结构合法的程序,是否是否真正有意义。真正有意义。第第8 8章章 语法制导翻译技术和中间代码生成语法制导翻译技术和中间代码生成Compiler Construction Principles例如例如: 赋值语句赋值语句 X:=A+B* *C对运算对象进行类型检查对运算对象进行类型检查, 对变对变量进行先定义后使用检查量进行先定义后使用检查 如果静态语义正确如果静态语义正确, 语义处理则要语
2、义处理则要执行真正的翻译执行真正的翻译, 即生成程序的某种中即生成程序的某种中间代码的形式或直接生成目标代码。间代码的形式或直接生成目标代码。执行真正的翻译执行真正的翻译第第8 8章章 语法制导翻译技术和中间代码生成语法制导翻译技术和中间代码生成Compiler Construction Principles 且采用语法制导翻译法且采用语法制导翻译法 完成对语法成完成对语法成分的翻译工作分的翻译工作。它不是一种形式系统它不是一种形式系统, 但它比较接近形式化。但它比较接近形式化。 目前多数编译程序使用目前多数编译程序使用属性文法为工具属性文法为工具来描述程序设计语言的语义。来描述程序设计语言的
3、语义。第第8 8章章 语法制导翻译技术和中间代码生成语法制导翻译技术和中间代码生成Compiler Construction Principles(1) 属性属性 对文法的每一个符号对文法的每一个符号, 引进一些属引进一些属性性, 这些属性代表与文法符号相关的信这些属性代表与文法符号相关的信息息, 如类型、值、存储位置等。与属性如类型、值、存储位置等。与属性相关的信息相关的信息, 即属性值即属性值,可以在语法分析可以在语法分析过程中计算和传递。过程中计算和传递。1. 属性文法属性文法第第8 8章章 语法制导翻译技术和中间代码生成语法制导翻译技术和中间代码生成Compiler Construct
4、ion Principles属性分为两类属性分为两类:综合属性综合属性其计算规则按其计算规则按“自下而上自下而上”方方式进行式进行, 即规则左部符号的某些属性根即规则左部符号的某些属性根据其右部符号的属性和据其右部符号的属性和(或或)自己的其他自己的其他属性计算而得。属性计算而得。属性加工的过程即是语义的处理过程。属性加工的过程即是语义的处理过程。综合属性和继承属性综合属性和继承属性。第第8 8章章 语法制导翻译技术和中间代码生成语法制导翻译技术和中间代码生成Compiler Construction Principles继承属性继承属性其计算规则按其计算规则按“自上而下自上而下”方方式进行式
5、进行, 即规则右部符号的某些属性根即规则右部符号的某些属性根据其左部符号的属性和据其左部符号的属性和(或或)右部其他符右部其他符号的某些属性计算而得。号的某些属性计算而得。第第8 8章章 语法制导翻译技术和中间代码生成语法制导翻译技术和中间代码生成Compiler Construction Principles(2) 属性文法属性文法AG=(G,V,E) 为文法的每一个产生式配备的计算属为文法的每一个产生式配备的计算属性的计算规则性的计算规则, 称为称为语义规则语义规则(描述语义描述语义处理的加工动作处理的加工动作) 。 属性文法包含一个上下文无关文法属性文法包含一个上下文无关文法G和一系列和
6、一系列语义规则语义规则E。语义规则语义规则:第第8 8章章 语法制导翻译技术和中间代码生成语法制导翻译技术和中间代码生成Compiler Construction Principles 这些语义规则附在文法的每个产生这些语义规则附在文法的每个产生式上式上,在语法分析过程中在语法分析过程中, 执行语义规则执行语义规则描述的动作描述的动作, 从而实现语义处理。也就从而实现语义处理。也就是说是说, 附在文法的每个产生式上语义规附在文法的每个产生式上语义规则描述了语义处理的加工动作。则描述了语义处理的加工动作。 目前流行的语义描述和语义处理的目前流行的语义描述和语义处理的方法主要是属性文法和语法制导翻
7、译方方法主要是属性文法和语法制导翻译方法。法。第第8 8章章 语法制导翻译技术和中间代码生成语法制导翻译技术和中间代码生成Compiler Construction PrinciplesS Axy 语义处理的语义处理的加工动作加工动作 语法制导翻译法使用属性文法为工具语法制导翻译法使用属性文法为工具来说明程序设计语言的语义来说明程序设计语言的语义。Compiler Construction Principles为文法每一产生式设计相应的求值的语义为文法每一产生式设计相应的求值的语义描述描述(语义动作语义动作): 例如,设有简单算术表达式的文法:例如,设有简单算术表达式的文法: EEE | E*
8、 *E | (E) | digit1.E E(1)E(2) E.val E(1).val E(2).val 2.E E(1)* *E(2) E.val E(1).val* *E(2).val 3.E (E(1) E.val E(1).val 4.E digit E.val Lex.digit 7+8* *8,3+8,6* *8,Compiler Construction PrinciplesE.val = 47E.val = 8E.val = 40E.val = 7E.val = 8+8*871.E E(1)E(2) E.val E(1).val E(2).val 2.E E(1)* *E(2
9、) E.val E(1).val*E(2).val 3.E (E(1) E.val E(1).val 4.E digit E.val Lex.digit 句子句子 7+8* *8 EEEEECompiler Construction Principles2. 语法制导翻译法语法制导翻译法 为文法的每个产生式都配备一个语义为文法的每个产生式都配备一个语义动作或语义子程序。动作或语义子程序。 在语法分析的过程中,每当使用一条在语法分析的过程中,每当使用一条产生式进行推导或归约时,就执行相应产生式进行推导或归约时,就执行相应产生式的语义动作产生式的语义动作, 从而实现语义处理。从而实现语义处理。第第
10、8 8章章 语法制导翻译技术和中间代码生成语法制导翻译技术和中间代码生成(1) 语法制导翻译法语法制导翻译法 的基本思想的基本思想Compiler Construction Principles(2) 语法制导翻译法语法制导翻译法 在语法分析过程中,依随分析的过程,在语法分析过程中,依随分析的过程,根据每个产生式所对应的语义子程序根据每个产生式所对应的语义子程序(或或语义规则描述的语义处理的加工动作语义规则描述的语义处理的加工动作)进进行翻译的方法。行翻译的方法。 第第8 8章章 语法制导翻译技术和中间代码生成语法制导翻译技术和中间代码生成自底向上分析法自底向上分析法自顶向下分析法自顶向下分析
11、法 Compiler Construction PrinciplesLR分析法语法制导分析实现方法分析法语法制导分析实现方法l1 为产生式设计语义动作为产生式设计语义动作l2 建立分析表建立分析表l3 扩充扩充LR分析栈分析栈l4 修改总控程序修改总控程序Compiler Construction Principles3. 编译中常用的中间代码编译中常用的中间代码:逆波兰式逆波兰式四元式四元式三元式三元式树形表示树形表示第第8 8章章 语法制导翻译技术和中间代码生成语法制导翻译技术和中间代码生成Compiler Construction Principles逆波兰式逆波兰式 逆波兰式除去了原表
12、达式中的括号,逆波兰式除去了原表达式中的括号,并将运算对象写在前面,运算符写在后并将运算对象写在前面,运算符写在后面,因而又称为后缀式。面,因而又称为后缀式。 例如:例如:逆波兰式逆波兰式a* *bab* *(a+b)* *( (c+d)ab+cd+* *中缀表达式中缀表达式第第8 8章章 语法制导翻译技术和中间代码生成语法制导翻译技术和中间代码生成Compiler Construction Principles 逆波兰式表示法同中缀表示法相比其逆波兰式表示法同中缀表示法相比其优点是优点是:1. 不再有括号不再有括号,且运算符出现的顺序体且运算符出现的顺序体 现了中缀表达式现了中缀表达式 的运
13、算顺序的运算顺序2. 易于计算机处理易于计算机处理第第8 8章章 语法制导翻译技术和中间代码生成语法制导翻译技术和中间代码生成Compiler Construction Principles 一般表达式计值时,要处理两类符一般表达式计值时,要处理两类符号,一类是运算对象,另一类是运算符,号,一类是运算对象,另一类是运算符,通常用两个工作栈分别处理。但处理用通常用两个工作栈分别处理。但处理用逆波兰式表示的表达式却只用一个工作逆波兰式表示的表达式却只用一个工作栈。栈。 第第8 8章章 语法制导翻译技术和中间代码生成语法制导翻译技术和中间代码生成Compiler Construction Princ
14、iples 当计算机自左到右顺序扫描逆兰波当计算机自左到右顺序扫描逆兰波式时,若当前符号是运算对象则进栈,式时,若当前符号是运算对象则进栈,若当前符号是运算符,设为若当前符号是运算符,设为K元运算符,元运算符,则将栈顶的则将栈顶的K个元素依次取出,同时进个元素依次取出,同时进行行K元运算,并将运算结果置于栈顶,元运算,并将运算结果置于栈顶,表达式处理完毕时,其计算结果自然呈表达式处理完毕时,其计算结果自然呈现在栈顶。现在栈顶。 第第8 8章章 语法制导翻译技术和中间代码生成语法制导翻译技术和中间代码生成Compiler Construction Principles逆波兰式逆波兰式ab+cab
15、+c* *的处理过程如下图:的处理过程如下图: baT1cT1T2第第8 8章章 语法制导翻译技术和中间代码生成语法制导翻译技术和中间代码生成Compiler Construction Principles逆波兰形式可以推广到其他语法结构:逆波兰形式可以推广到其他语法结构: 赋值语句赋值语句V=E逆波兰式逆波兰式VE=条件语句条件语句逆波兰式逆波兰式if E S1 ; else S2ES1S2¥第第8 8章章 语法制导翻译技术和中间代码生成语法制导翻译技术和中间代码生成Compiler Construction Principles三元式和树形表示三元式和树形表示三元式主要由三部分组成:三元式
16、主要由三部分组成: (OP,arg1, arg2) 其中其中OP是运算符,是运算符, arg1,arg2分别是第一和第二两个运算对象。分别是第一和第二两个运算对象。 当当OP是一目运算时,常常将运算对象定是一目运算时,常常将运算对象定义为义为arg1。 第第8 8章章 语法制导翻译技术和中间代语法制导翻译技术和中间代码生成码生成Compiler Construction Principles例如例如 a+ +b* *c 的的 三元式序列:三元式序列: (1) ( * * , b , , b , c ) (2) ( + , a , + , a , (1) )运算对象是指向符号表的某一项或指向运算
17、对象是指向符号表的某一项或指向三元式表的某一项三元式表的某一项。 第第8 8章章 语法制导翻译技术和中间代码生成语法制导翻译技术和中间代码生成Compiler Construction Principles 1. 三元式出现的顺序和语法成份的三元式出现的顺序和语法成份的 计值顺序相一致。计值顺序相一致。 三元式的特点:三元式的特点:2. 三元式之间的联系是通过指示器三元式之间的联系是通过指示器 实现的。实现的。 第第8 8章章 语法制导翻译技术和中间代码生成语法制导翻译技术和中间代码生成Compiler Construction Principles 树形表示树形表示 A * * B + C*
18、 *D +C*A*BD 末端结点表示一个运算对象末端结点表示一个运算对象, 每一个内每一个内结点表示一个一元或二元运算符。结点表示一个一元或二元运算符。树形表示是三元式的翻版树形表示是三元式的翻版(3)+(1)*(2)*CABD第第8 8章章 语法制导翻译技术和中间代码生成语法制导翻译技术和中间代码生成Compiler Construction Principles四元式主要由四部分组成:四元式主要由四部分组成: (OP,arg1, arg2, result) 其中其中OP是运算符,是运算符, arg1,arg2分别是第一和第二两个运算对象。分别是第一和第二两个运算对象。 当当OP是一目运算时
19、,常常将运算对象定义是一目运算时,常常将运算对象定义为为arg1。 第第8 8章章 语法制导翻译技术和中间代码生成语法制导翻译技术和中间代码生成Compiler Construction Principles 四元式的第四个分量四元式的第四个分量result是编译程序是编译程序为存放中间运算结果而临时引进的变量,为存放中间运算结果而临时引进的变量,常称为临时变量,如常称为临时变量,如Ti,也可以是用户,也可以是用户自定义变量,如自定义变量,如X。 例如例如 X a* *bc/d 的的 四元式序列:四元式序列:(1) ( * *, a, b, T1 )(2) ( / /, c, d, T2 )(
20、3) ( + +, T1, T2, T3 )(4) ( = =, T3, - -, X )第第8 8章章 语法制导翻译技术和中间代码生成语法制导翻译技术和中间代码生成Compiler Construction Principles2. 四元式之间的联系是通过临时变量实四元式之间的联系是通过临时变量实 现的,这样易于调整和变动四元式。现的,这样易于调整和变动四元式。 1. 四元式出现的顺序和语法成份的计值四元式出现的顺序和语法成份的计值 顺序相一致。顺序相一致。 四元式的特点:四元式的特点:3. 便于优化处理。便于优化处理。 第第8 8章章 语法制导翻译技术和中间代码生成语法制导翻译技术和中间代
21、码生成Compiler Construction Principles 编译系统中,有时将四元式表示成另一编译系统中,有时将四元式表示成另一种更直观,更易理解的形式种更直观,更易理解的形式三地址代三地址代码或三地址语句。码或三地址语句。result : arg1 OP arg2 三地址语句三地址语句:语句中是三个量的赋值语句语句中是三个量的赋值语句, 每个量占一个地址。每个量占一个地址。 三地址代码形式定义为:三地址代码形式定义为:第第8 8章章 语法制导翻译技术和中间代码生成语法制导翻译技术和中间代码生成Compiler Construction Principles例如例如 X a* *b
22、c/d 的的 四元式序列:四元式序列:(1) ( * *, a, b, T1 )(2) ( / /, c, d, T2 )(3) ( + +, T1, T2, T3 )(4) ( = =, T3, - -, X )相应的三地址语句序列为:相应的三地址语句序列为: (1)T1a* *b (2)T2c/d (3)T3T1T2 (4)XT3 第第8 8章章 语法制导翻译技术和中间代码生成语法制导翻译技术和中间代码生成Compiler Construction Principles例例1. a + b * * ( c + d )的逆波兰式的逆波兰式 a bc d + * * +第第8 8章章 语法制导
23、翻译技术和中间代码生成语法制导翻译技术和中间代码生成Compiler Construction Principlest1= a t2= c t3= t2 + dt8= t1+ t4 a + b * * ( c + d )的四元式表示的四元式表示 t4= b* * t3 第第8 8章章 语法制导翻译技术和中间代码生成语法制导翻译技术和中间代码生成Compiler Construction Principlesi( i /( /( i i ) )的逆波兰式的逆波兰式 i( i /( /( i i ) )的四元式的四元式 t1= i i t2= i / / t1t3= i t2i i i i /例例
24、2. 第第8 8章章 语法制导翻译技术和中间代码生成语法制导翻译技术和中间代码生成Compiler Construction Principles4. 采用自下而上的语法制导翻译法语义采用自下而上的语法制导翻译法语义 动作的设计动作的设计(1)搞清楚)搞清楚源结构和目标结构源结构和目标结构(2)自下而上的语法制导翻译特点:)自下而上的语法制导翻译特点: 栈顶形成句柄,栈顶形成句柄,归约时执行相应语义归约时执行相应语义 动作动作(3)给出从源结构到目标结构的)给出从源结构到目标结构的变换变换 方法方法第第8 8章章 语法制导翻译技术和中间代语法制导翻译技术和中间代码生成码生成Compiler C
25、onstruction Principles例1. 设文法及其相应的语义动作如下: SbTc print “1” Sa print “2” TR print “3” RR/S print “4” RS print “8” 采用自下而上语法制导翻译,给出输入串bR / bTc / bSc / ac的翻译结果 第8章 语法制导翻译技术和中间代码生成Compiler Construction Principles分析: 首先对输入串 bR / bTc / bSc /ac画出语法树:ScTbRS/R/RS/RcTbaScTbRS再考虑归约时执行相应语义动作第8章 语法制导翻译技术和中间代码生成Comp
26、iler Construction PrinciplesScTbRS/R/RS/RcTbaScTbRS SbTc print “1” Sa print “2” TR print “3” RR/S print “4” RS print “8” 14翻译结果为:83142431第8章 语法制导翻译技术和中间代码生成Compiler Construction PrinciplesScTbRS/R/RS/RcTbaScTbRS RR/S SbTc Sa TR RS 输出为: 1483142431输入是bR / bTc / bSc /ac给出相应语义动作(翻译方案) print “1” print “2
27、” print “3” print “4” print “8”第8章 语法制导翻译技术和中间代码生成Compiler Construction Principles例2 简单算术表达式求值的语义描述例如,设有简单算术表达式的文法: EEE | E*E | (E) | digit1.E E(1)E(2) E.val E(1).val E(2).val 2.E E(1)*E(2) E.val E(1).val*E(2).val 3.E (E(1) E.val E(1).val 4.E digit E.val Lex.digit 第8章 语法制导翻译技术和中间代码生成Compiler Constru
28、ction Principles例3 简单算术表达式翻译到四元式的 语义描述例如,设有简单算术表达式的文法: EEE | E*E | (E) | i第8章 语法制导翻译技术和中间代码生成Compiler Construction PrinciplesE EE E*E (E) | i 源结构目标结构(1)T1a*b (2)T2c*d (3)T3T1T2 a*bc*d 第8章 语法制导翻译技术和中间代码生成Compiler Construction Principles语义函数 emit(Targ1 OP arg2) 功能是生成一个三地址语句,并送到输出文件中。 语义函数 newtemp( ) 功
29、能是产生一个新的临时变量名字,并回送新的临时变量名的整数码。如T1,T2等。 第8章 语法制导翻译技术和中间代码生成Compiler Construction Principles (2) 不进符号表,临时变量单词值部 分用整数码表示。 (1) 送到符号表。 对临时变量有两种不同的处理方法: 第8章 语法制导翻译技术和中间代码生成Compiler Construction Principles语义过程 Lookup() 功能是审查是否出现在符号表中,在则返回其指针,否则返回NULL。 语义变量 E.place 表示存放非终结符E值的变量名在符号表中的入口地址或临时变量名
30、的整数码。 第8章 语法制导翻译技术和中间代码生成Compiler Construction Principles 1. E E(1) E(2) 2. E E(1) * E(2) E.place newtemp( ); emit(E.placeE(1).placeE(2).place ) E.place newtemp( ); emit(E.placeE(1).place*E(2).place ) 第8章 语法制导翻译技术和中间代码生成Compiler Construction Principles3. E (E(1)) E.place E(1).place; 4. E i p Lookup
31、(); if (p != NULL) E.place p; else error( ); 第8章 语法制导翻译技术和中间代码生成Compiler Construction Principles3. 算术表达式a+b*c翻译到三地址语句的过程: 030$a01$E014$E+0143$E+baaa状态栈符号栈语义栈输入串a+b*c$+b*c$+b*c$b*c$*c$ 变量在符号表的入口用变量本身表示第8章 语法制导翻译技术和中间代码生成EEE | E*E | (E) | iCompiler Construction Principles90状态ACTIONGOTO+ i*()$ES3
32、S9S8S4S2S3S2S3S8S4S2S8S2S3r4r4r4r4r1r1r1r2r3r2r3r3r2r2r3123486781678acc2.为文法构造LR分析表如下图: 第8章 语法制导翻译技术和中间代码生成Compiler Construction Principles*c$c$t1=b*c t2=a+t1 状态栈符号栈语义栈输入串014780147$E+E$E+E*014783$E+E*c014788$E+E*E0147$E+E01$Eab abcat1ababt2acc第8章 语法制导翻译技术和中间代码生成EEE | E*E | (E) | iCompiler Constructi
33、on Principles布尔表达式到四元式的翻译布尔表达式到四元式的翻译一.布尔表达式的文法 计算逻辑值程序设计语言中布尔表达式有两个作用: 用作控制语句中的条件式布尔表达式是由布尔算符(、和)施于布尔变量或关系表达式而成。 Compiler Construction Principles布尔表达式到四元式的翻译布尔表达式到四元式的翻译 对某些语言,如 PL / 1,允许更通用的表达式,其中,布尔算符、算术算符和关系算符可施于任何类型的表达式,并不区别布尔值和算术值。 为简单起见,只考虑如下文法生成的布尔表达式:Compiler Construction Principles布尔表达式到四元
34、式的翻译布尔表达式到四元式的翻译 E E (1) E (2) E E (1) E (2) E E (1) E ( E (1) ) E i (1) rop i (2) E true E false E iCompiler Construction Principles布尔表达式到四元式的翻译布尔表达式到四元式的翻译 二. 布尔表达式的计值方法 1. 如同计算算术表达式一样,步步计算出各部分真、假值,最后计算出整个表达式的值。 2. 根据布尔运算的特殊性,采取某种优化措施,可避免计算整个表达式的值。Compiler Construction Principles布尔表达式到四元式的翻译布尔表达式到
35、四元式的翻译 AB 解释成 AB 解释成 A 解释成if A then true else Bif A then B else falseif A then false else true 三. 布尔表达式的翻译方法 1. 同翻译算术表达式一样,翻译布尔表达式。Compiler Construction Principles布尔表达式到四元式的翻译布尔表达式到四元式的翻译 1. E E (1) E (2) E.place newtemp( ); emit ( E.placeE(1).placeE(2).place ) 2. E E (1) E (2) E.place newtemp( ); e
36、mit ( E.placeE(1).placeE(2).place ) Compiler Construction Principles布尔表达式到四元式的翻译布尔表达式到四元式的翻译3. E ( E (1) ) E.place E(1).place; 4. E i (1) rop i (2) E.place newtemp( ); emit (if i (1).place rop.op i (2).place goto next+3); emit ( E.place 0 ); emit ( goto next+2); emit ( E.place 1 ); Compiler Construc
37、tion Principles布尔表达式到四元式的翻译布尔表达式到四元式的翻译8. E true E.place newtemp( ); emit ( E.place 1) E.place newtemp( ); emit ( E.place 0) 6. E false 或 E.place i . place; 6. E i Compiler Construction Principles布尔表达式到四元式的翻译布尔表达式到四元式的翻译例如布尔表达式 a = bc d 对应如下四元式序列:101 if a = b goto 104102 t1= 0103 goto 108104 t1= 110
38、8 t2= c d106 t3 = t1 t2 Compiler Construction Principles布尔表达式到四元式的翻译布尔表达式到四元式的翻译2. 控制语句中布尔表达式的翻译条件语句的语法为:根据条件语句的语义,条件语句的代码结构为:if E then S(1) else S(2)E的代码S(1)的代码S(2)的代码Jump out out: 真 假Compiler Construction Principles布尔表达式到四元式的翻译布尔表达式到四元式的翻译 E是布尔表达式,根据布尔运算的特殊性,布尔表达式的目标结构为:假E(1)的代码E(2)的代码真S(1)S(2)真假真
39、E(1)的代码E(2)的代码假S(2)S(1)假真Compiler Construction Principles (1) 真出口和假出口:真出口表示布尔表达式E为真时控制流向的转移目标假出口表示布尔表达式E为假时控制流向的转移目标布尔表达式到四元式的翻译布尔表达式到四元式的翻译Compiler Construction Principles(2) 作为条件转移的E,把E翻译成的代码 是一串条件转或无条件转的四元式对于E为 a rop b 的形式生成代码为: if a rop b goto 真出口 goto 假出口布尔表达式到四元式的翻译布尔表达式到四元式的翻译Compiler Constru
40、ction Principles(q)例如语句 if a bc d then S(1) else S(2) 的四元式为:100 if a b goto 104101 goto 102102 if c d goto 104 103 goto ( p+1) 104 ( 关于 S(1) 的四元式)(p) goto (q)(p+1) ( 关于 S(2) 的四元式)E(1)的真出口为104, E(1)的假出口为102E(2)的真出口为104, E(2)的假出口为(p+1)E的真出口为104, E的假出口为(p+1)布尔表达式到四元式的翻译布尔表达式到四元式的翻译Compiler Construction
41、 Principles布尔表达式到四元式的翻译布尔表达式到四元式的翻译布尔表达式的真、假出口不能在产生其四元式的同时得知例如 E(1)的真出口为104需分析到S(1)时才能得知,因此E.tr: 记录表达式 E 所对应的四元式需回填真出口的四元式的地址所构成的链E.fa: 记录表达式 E 所对应的四元式需回填假出口的四元式的地址所构成的链(3) 设置两个语义变量:Compiler Construction Principles(q)例如语句 if a bc d then S(1) else S(2) 的四元式为:100 if a b goto 104101 goto 102102 if c d
42、goto 104 103 goto ( p+1) 104 ( 关于 S(1) 的四元式)(p) goto (q)(p+1) ( 关于 S(2) 的四元式)布尔表达式到四元式的翻译布尔表达式到四元式的翻译E(1).tr=100, E(1).fa=101E(2).tr=102, E(2).fa=103Compiler Construction Principles布尔表达式到四元式的翻译布尔表达式到四元式的翻译E.fa=103; E.tr=100和102所构成的链 E(1) E(2)归约E时, Compiler Construction Principles布尔表达式到四元式的翻译布尔表达式到四元
43、式的翻译把以 p1, p2为链首的两条链合并为一, 返回合并后的链首(4) 链结函数和回填函数: merg (p1, p2) :Compiler Construction Principles布尔表达式到四元式的翻译布尔表达式到四元式的翻译 merg (int p1, int p2) if p2=0 return( p1 ) ;else p= p2 ; while ( 四元式p的第四分量内容不为0) p=四元式p的第四分量内容; 把p1填进四元式p的第四分量; return( p2 ) ;Compiler Construction Principles布尔表达式到四元式的翻译布尔表达式到四元式
44、的翻译r1 ( 0 )q1 ( r1 )q2 ( r2 )p1 ( q1 )r2 ( 0 )p2 ( q2 )p1Compiler Construction Principles布尔表达式到四元式的翻译布尔表达式到四元式的翻译 merg (int p1, int p2) if p2=0 return( p1 ) ;else p= p2 ; while ( 四元式p的第四分量内容不为0) p=四元式p的第四分量内容; 把p1填进四元式p的第四分量; return( p2 ) ;100102102Compiler Construction Principles(q)例如语句 if a bc d t
45、hen S(1) else S(2) 的四元式为:100 if a b goto 0101 goto 102102 if c d goto 100 103 goto ( p+1) 104 ( 关于 S(1) 的四元式)(p) goto (q)(p+1) ( 关于 S(2) 的四元式)布尔表达式到四元式的翻译布尔表达式到四元式的翻译Compiler Construction Principles布尔表达式到四元式的翻译布尔表达式到四元式的翻译 bp ( int p, int t ) : 将 p 所链结的每个四元式的第四区分量都回填 t ;Compiler Construction Princip
46、les布尔表达式到四元式的翻译布尔表达式到四元式的翻译 bp ( int p, int t )q=p;while (q != 0 ) r = 四元式 q 的第四分量内容; 把 t 填进四元式 q 的第四分量; q=r ;1021041000 102100Compiler Construction Principles(q)例如语句 if a bc d then S(1) else S(2) 的四元式为:100 if a b goto 104101 goto 102102 if c d goto 104 103 goto ( p+1) 104 ( 关于 S(1) 的四元式)(p) goto (q
47、)(p+1) ( 关于 S(2) 的四元式)布尔表达式到四元式的翻译布尔表达式到四元式的翻译Compiler Construction Principles布尔表达式到四元式的翻译布尔表达式到四元式的翻译(8) 为及时回填转移地址, 使用语义变量 E.code 记录表达式E的第一个四元式语句序号。(6) 定义语义变量 next 为四元式表指针。E (1).code=100E (2).code=102E .code=100Compiler Construction Principles布尔表达式到四元式的翻译布尔表达式到四元式的翻译布尔表达式语义动作的设计 1. E E (1) E (2) bp
48、( E(1).fa, E(2).code) ; E.code= E(1).code ; E.tr=merg( E(1).tr, E(2).tr ) ; E.fa= E(2).fa ;Compiler Construction Principles布尔表达式到四元式的翻译布尔表达式到四元式的翻译布尔表达式语义动作的设计 2. E E (1) E (2) bp( E(1).tr, E(2).code) ; E.code= E(1).code ; E.tr= E(2).tr ; E.fa=merg( E(1).fa, E(2).fa ) ;Compiler Construction Principl
49、es布尔表达式语义动作的设计 3. E ( E (1) ) E.code= E(1).code ; E.tr=E(1).tr ; E.fa= E(1).fa ;布尔表达式到四元式的翻译布尔表达式到四元式的翻译Compiler Construction Principles布尔表达式语义动作的设计 4. E i (1) rop i (2) E.tr= next ; E.code= next ; E.fa= next+1; emit ( if i (1).place rop.op i (2).place goto _ ) ; emit( goto _ ) ;布尔表达式到四元式的翻译布尔表达式到四元
50、式的翻译Compiler Construction Principles布尔表达式语义动作的设计 8. E true E.tr= next ; E.code= next ; emit( goto _ ) ;布尔表达式到四元式的翻译布尔表达式到四元式的翻译Compiler Construction Principles布尔表达式到四元式的翻译布尔表达式到四元式的翻译布尔表达式语义动作的设计 6. E false E.fa= next ; E.code= next ; emit( goto _ ) ;Compiler Construction Principles布尔表达式到四元式的翻译布尔表达式到四元式的翻译布尔表达式语义动作的设计 8. E i E.tr= next ; E.fa= next
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 国企人力资源岗笔试真题及参考答案
- 2026年主管护师资格考试历年真题及答案
- 2026年银行业专业人员中级职业资格考试(专业实务风险管理)全真冲刺试题及答案
- 2026年京东初阶商家售前客服岗位人才认证考试题及答案
- 2026北京市公园管理中心招聘69人笔试参考试题及答案解析
- 第一批危旧房棚户区改造项目可行性研究报告模板-立项备案
- 科学防疫共筑健康堡垒四年级主题班会课件
- 2026年安徽阜阳太和县马集镇村级后备干部招聘考试核心押题卷(第1套)(附独家高分解析)
- 2026年甘肃省武威市支持未就业普通高校毕业生到基层就业招聘考试试卷-含答案解析
- 海关协勤笔试题库及答案(完整版·2026)
- 统编版(2024)八年级下册历史期末复习:材料题 专项练习题 (含答案)
- 地下水动态评价技术规范(2025版)
- 江苏科技大学《大学物理A》2025 - 2026学年第一学期期末试卷(A卷)
- 机电一体化系统-001-国开机考复习资料
- 吉林省长春市南关区2023-2024学年七年级下学期期中地理试题
- 专题 平行四边形中的最值问题(解析版)
- JGJ6-2011 高层建筑筏形与箱形基础技术规范
- 2023年中国中医科学院广安门医院专项招聘医学类人员及高层次卫技人才考试历年高频考点试题含答案解析
- 工作场所安全使用化学品规定
- 小学二年级数学下册无纸化测试题
- T-QGCML 772-2023 管状电机标准规范
评论
0/150
提交评论