编译原理第八章_第1页
编译原理第八章_第2页
编译原理第八章_第3页
编译原理第八章_第4页
编译原理第八章_第5页
已阅读5页,还剩76页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、u源程序的结构分析源程序的结构分析词法分析词法分析 ch4ch4语法分析语法分析 ch5ch5、ch6ch6、ch7ch7u语义分析语义分析由语法分析程序直接调用相应的语义子程由语法分析程序直接调用相应的语义子程序序首先生成语法树(或该结构的某种表示)首先生成语法树(或该结构的某种表示),再进行语义处理,再进行语义处理u生成中间代码生成中间代码编译中的逻辑阶段编译中的逻辑阶段源语言程序源语言程序 代码优化代码优化 目标代码(汇编或机器码)目标代码(汇编或机器码) 词法分析词法分析语义分析语义分析语法分析语法分析中间代码生成中间代码生成目标代码生成目标代码生成前端处理前端处理后端处理后端处理语义

2、处理语义处理语义处理的任务:语义处理的任务:静态语义检查静态语义检查 静态语义:语法结构静态语义:语法结构 静态语义检查:审查静态语义检查:审查静态语义静态语义动态语义处理动态语义处理 动态语义:程序单元执行的操作动态语义:程序单元执行的操作 动态语义处理:生成动态语义处理:生成( (中间中间/ /目标目标) )代码代码语义处理的实现:语义处理的实现:l属性文法:描述语义规则。属性文法:描述语义规则。-工具工具l语法制导翻译:语法制导翻译:在语法分析的同时在语法分析的同时,执行,执行语义规则描述的动作:语义规则描述的动作:检查静态语义检查静态语义生成中间代码生成中间代码/ /目标代码目标代码语

3、义处理的环境语义处理的环境:符号表符号表l为语义分析提供类型、作用域等信息。为语义分析提供类型、作用域等信息。l为代码生成提供类型、作用域、存储为代码生成提供类型、作用域、存储类别、存储(相对)位置等信息类别、存储(相对)位置等信息。 本章引入属性文法和语法制导翻译本章引入属性文法和语法制导翻译方法的基本思想,介绍几种典型的中间方法的基本思想,介绍几种典型的中间代码形式,最后讨论一些语法成分的翻代码形式,最后讨论一些语法成分的翻译工作。译工作。 第第8章章 语法制导翻译和中间代码生成语法制导翻译和中间代码生成 8 81 1 属性文法属性文法8 82 2 语法制导翻译概论语法制导翻译概论 8 8

4、3 3 中间代码的形式中间代码的形式 8 84 4 简单赋值语句的翻译简单赋值语句的翻译 8 85 5 布尔表达式的翻译布尔表达式的翻译 8 86 6 控制结构的翻译控制结构的翻译 8 87 7 说明语句的翻译说明语句的翻译 8 88 8 数组和结构的翻译数组和结构的翻译 8 81 1 属性文法属性文法 u属性文法:属性文法:语法制导翻译工具,说明程序设计语言语法制导翻译工具,说明程序设计语言的意义。的意义。u属性文法构成:属性文法构成:上下文无关文法上下文无关文法 + + 语义规则语义规则u语义规则附在文法的产生式上,在语法分析过程中,语义规则附在文法的产生式上,在语法分析过程中,完成附加在

5、完成附加在所使用产生式上所使用产生式上的语义规则描述的动作,的语义规则描述的动作,从而实现语义处理。从而实现语义处理。 定义:定义: 一个属性文法是一个三元组:一个属性文法是一个三元组: A=(G,V,F)其中其中:G:上下文无关文法:上下文无关文法V:属性的有穷集:属性的有穷集。 每个属性与文法的某个非终结符或终结符相联每个属性与文法的某个非终结符或终结符相联F:关于属性的断言或谓词:关于属性的断言或谓词的有穷集。的有穷集。 -属性的计算规则属性的计算规则 每个断言与文法的某产生式相联。每个断言与文法的某产生式相联。 例如例如 G:E T1 + T2 | T1 or T2 T num | t

6、rue | false 属性文法记号中常使用属性文法记号中常使用Nt的形式表示与非终的形式表示与非终结符结符N相联的属性。相联的属性。E T1 + T2 T1t = int AND T2t = int E T1 or T2 T1t = bool AND T2t = bool T num Tt = int T true Tt = bool T false Tt = bool 可进行可进行类型检查类型检查的属性文法(表达式)的属性文法(表达式) 对输入串对输入串3+4的语法树:的语法树: E T1t =T2t T1= int TT T2= int 3 4 + 如果对如果对G G中的某一输入串而言,

7、中的某一输入串而言,A A中的所有断言中的所有断言对该输入串的对该输入串的语法树的结点的属性全为真,则该串语法树的结点的属性全为真,则该串也是也是A A语言中的句子。语言中的句子。编译程序的静态语义审查工作就是编译程序的静态语义审查工作就是验证关于所编译验证关于所编译的程序的断言是否全部为真的程序的断言是否全部为真。 A为属性文法为属性文法例例8.28.2 描述描述说明语句说明语句中各种变量的类型信息中各种变量的类型信息的语义规则的语义规则产生式产生式 语义规则语义规则(1) DTL L.in := T.type(2) T int T.type := integer(3) T real T.t

8、ype := real(4) L L1,id L1.in := L.in; addtype(id.entry, L.in)(5) L id addtype(id.entry, L.in)entry id entry id 的属性:可以是它在符号表中的地址的属性:可以是它在符号表中的地址addtype addtype 在符号表中为变量填加类型信息在符号表中为变量填加类型信息8 82 2 语法制导翻译概论语法制导翻译概论 语法制导翻译:语法制导翻译:n首先,使用首先,使用属性文法属性文法为工具,描述程序为工具,描述程序设计语言的语义规则。设计语言的语义规则。 n在语法分析时,每应用一个产生式(推在

9、语法分析时,每应用一个产生式(推导或归约),同时完成该产生式上所附导或归约),同时完成该产生式上所附的语义规则描述的动作,从而完成语义的语义规则描述的动作,从而完成语义处理。处理。在进行语法分析的同时,完成相应的语义处理在进行语法分析的同时,完成相应的语义处理 语法制导翻译的具体实现途径不难。如语法制导翻译的具体实现途径不难。如有一个有一个LRLR分析器,扩充它的分析栈,使得每分析器,扩充它的分析栈,使得每个文法符号都跟有语义值。同时扩充个文法符号都跟有语义值。同时扩充LRLR分析分析器功能,使它不仅执行语法分析任务,且能器功能,使它不仅执行语法分析任务,且能在用某个产生式进行归约的在用某个产

10、生式进行归约的同时同时调用相应语调用相应语义子程序。义子程序。 例例 算术表达式算术表达式求值求值的语义描述的语义描述 (0)LE print(E.val) (1)E E1 + T E.val:=E1.val+T.val(2)E T E.val:=T.val (3)T T1 * F T.val:=T1.val*F.val(4)T F T.val:=F.val (5)F(E) F.val:=E.val(6)Fdigit F.val:=digit.lexval 输入串输入串2+32+3* *5,5,语义处理是计算表达式的值,采用语义处理是计算表达式的值,采用LRLR分析法,分析法,LRLR分析表如

11、下:分析表如下: 状状态态 ACITON ACITON(动作)(动作)GOTOGOTO(转换)(转换)d d+ +* *()# #E ET TF F0 0S S5 S S4 1 12 23 31 1 S S6 accacc 2 2 r r2S S7 r r2r r2 3 3 r r4r r4 r r4r r4 4 4S S5 S S4 8 82 23 35 5 r r6r r6 r r6r r6 6 6S S5 S S4 9 93 37 7S S5 S S4 10108 8 S S6 S S11 9 9 r r1S S7 r r1r r1 1010 r r3r r3 r r3r r3 1111

12、 r r5r r5 r r5r r5 步骤步骤 状态栈状态栈 语义栈(值栈)语义栈(值栈) 符号栈符号栈 剩余输入串剩余输入串 归约动作归约动作1 0 - # 2+31 0 - # 2+3* *5# 5# 2 05 - - #2 +32 05 - - #2 +3* *5#5#3 03 -3 03 -2 2 #F +3 #F +3* *5# 5# r6r64 02 -4 02 -2 2 #T +3 #T +3* *5# 5# r4r45 01 -5 01 -2 2 #E +3 #E +3* *5# 5# r2r26 016 -2- #E+ 36 016 -2- #E+ 3* *5#5#7 016

13、5 -2- - #E+3 7 0165 -2- - #E+3 * *5#5# 步骤步骤 状态栈状态栈 语义栈(值栈)语义栈(值栈) 符号栈符号栈 剩余输入串剩余输入串 归约动作归约动作8 0163 -2-8 0163 -2-3 3 #E+F #E+F * *5# 5# r6r69 0169 -2-9 0169 -2-3 3 #E+T #E+T * *5# 5# r4r410 01697 -2-3- #E+T10 01697 -2-3- #E+T* * 5# 5#11 016975 -2-3- #E+T11 016975 -2-3- #E+T* *5 #5 #12 0169712 01697(1

14、010)-2-3-2-3-5 5 #E+T #E+T* *F # F # r6r613 0169 -2-13 0169 -2-(1515) #E+T # r3#E+T # r314 01 -14 01 -(1717) #E #E # r1r115 15 接受接受 8 83 3 中间代码的形式中间代码的形式 中间代码有多种形式,常见的有中间代码有多种形式,常见的有v 逆波兰式逆波兰式v 三元式三元式v 四元式四元式v 树形表示树形表示 一、一、 逆波兰记号逆波兰记号 最简单的一种中间代码形式。最简单的一种中间代码形式。将运算对象写在前面,运算符号写在后面将运算对象写在前面,运算符号写在后面如如a

15、+ba+b写成写成ab+ab+,也称,也称后缀式后缀式。后缀表示法表。后缀表示法表示表达式的最大优点是计算机处理表达式方示表达式的最大优点是计算机处理表达式方便。如便。如BCDBCD* *+ + ( 表示一元减,中缀表示为表示一元减,中缀表示为-B+C-B+C* *D D) 如如 GOTO L GOTO L 写为写为 L jumpL jumpif E then Sif E then S1 else elseS S2 表示为表示为 ESES1S S2 ,把,把if-then-elseif-then-else看成三目运算符,用看成三目运算符,用 表示。表示。但要注意,要对新添加的运算符的含义正确处

16、但要注意,要对新添加的运算符的含义正确处理。理。 组成组成:(OPOP,ARGARG1,ARGARG2)OPOP为算符,为算符,ARGARG1和和ARGARG2分别为第一、第二分别为第一、第二运算对象。运算对象。 (1 1) (* *,b b, c c) (2 2) (/ /,c c,d d)(3 3) (+ +,(1 1),(2 2)(4 4) (:(:= =,(3 3),a a) 三元式中的(三元式中的(1 1)、()、(2 2)表示第一和第二个)表示第一和第二个三元式的结果。三元式的结果。 对一元运算符,规定只用对一元运算符,规定只用ARGARG1。 树形表示是三元式的树形表示是三元式的

17、翻版翻版。表达式的树形。表达式的树形表示很容易实现:简单变量或常数的树是自表示很容易实现:简单变量或常数的树是自身,如果表达式身,如果表达式e e1和和e e2的树分别为的树分别为T T1和和T T2,那,那么么e e1+e+e2、e e1* *e e2,-e-e1的树为:的树为: e1 + e2+T1T2*T1T2-T1e1 * e2 -e1二目运算对应二叉子树,多目运算对应多叉子树。二目运算对应二叉子树,多目运算对应多叉子树。 普遍采用的一种中间代码形式。普遍采用的一种中间代码形式。组成:组成:(OPOP,ARGARG1,ARGARG2,RESULTRESULT)其中其中: OP: OP,

18、ARGARG1,ARGARG2的含义同三元式的含义同三元式 RESULTRESULT是运算结果。是运算结果。 有时为了直观,也把四元式的形式写成简单有时为了直观,也把四元式的形式写成简单赋值形式赋值形式,例如把上述四元式写成:,例如把上述四元式写成: (1 1) t t1:=b=b* *c c(2 2) t t2:=c/d=c/d(3 3) t t3:=t=t1+t+t2(4 4) a a:=t=t3 如,如, a a:=b=b* *c+c/dc+c/d的四元式表示如下:的四元式表示如下: (1 1)()(* *,b b,c c,t t1)(2 2)()(/ /,c c,d d,t t2)(3

19、 3)()(+ +,t t1,t t2,t t3)(4 4)(:)(:= =,t t3,- -,a a) 四元式和三元式的主要不同在于:四元式和三元式的主要不同在于:四元四元式对中间结果的引用必须通过给定的名字,式对中间结果的引用必须通过给定的名字,三元式是通过产生中间结果的三元式编号。三元式是通过产生中间结果的三元式编号。 四元式表示类似于三地址指令,有时也四元式表示类似于三地址指令,有时也把这种表示称为三地址代码,它对代码优化和把这种表示称为三地址代码,它对代码优化和目标代码生成都较有利。目标代码生成都较有利。 说明:说明: 在实际实现中,四元式的在实际实现中,四元式的ARGARG1和和A

20、RGARG2、RESULTRESULT,或者是一个指针,指向符号表,或者是一个指针,指向符号表的某一登录项;或者是一个临时变量的的某一登录项;或者是一个临时变量的整数码。整数码。 语义变量语义变量ididnamename:idid表示的单词的一属性表示的单词的一属性语义变量语义变量E Eplaceplace:表示存放:表示存放E E值的变量名在符值的变量名在符 号表的登录项或一整数码号表的登录项或一整数码语义过程语义过程emitemit:表示输出四元式到输出文件上:表示输出四元式到输出文件上语义过程语义过程newtempnewtemp:表示生成一临时变量。:表示生成一临时变量。函数函数Look

21、upLookup(ididnamename):查:查ididnamename是否在符是否在符号表中,如在,则返回指向号表中,如在,则返回指向该登录项指针,否则返回该登录项指针,否则返回nilnil。 下面列出了下面列出了翻译赋值语句到四元式翻译赋值语句到四元式的语义的语义描述,这里的语义工作包括对变量进行描述,这里的语义工作包括对变量进行“先定先定义后使用义后使用”的检查。的检查。 (1 1) Sid := E p:= Lookup(idname);); if nilthenemit(p:Eplace) else error 四元式采用赋值形式,即四元式采用赋值形式,即result:=arg1

22、 op arg2(2) EE1 + E2 E.place := newtemp; emit(E.place := E1.place+E2.place) (3) EE1 * E2 E.place := newtemp; emit(E.place := E1.place*E2.place) (4) E - E1 E.place := newtemp; emit(E.place := uminus E1.place) (5) E(E1) E.place := E1.place (6) Eid p := Lookup();); if p nilthenE.place := p else

23、error 编译程序还可对表达式中的运算对象进编译程序还可对表达式中的运算对象进行行类型检查、类型转换类型检查、类型转换。约定:约定:当两个不同类型的量进行运算时,先当两个不同类型的量进行运算时,先将整型量转换为实型量,并增加将整型量转换为实型量,并增加E.typeE.type表示表示E E的类型信息,值为的类型信息,值为intint或或realreal,用,用+ + i(* * i)、)、+ + r(* * r)区别整型加和实型加。)区别整型加和实型加。 带类型转换类型转换的语义处理如下:( EEEE1 * * E E2) EE1 * E2 E.place:=newtemp; if E1.t

24、ype=int AND E2.type=int then begin emit(E.place,:=,E1.place,*i,E2.place); E.type:=int end else if E1.type=real AND E2.type=real then begin emit(E.place,:=,E1.place,*r, E2.place); E.type:=real end else if E1type=int /* E2type=real*/ thenbegin t:=newtemp; emit(t,:=,itr,E1.place);); emit(E.place,:=,t,*

25、r , E2.place);); Etype:=realendelse /* E1.type=real AND E2.type=int */begin t:=newtemp; emit(t,:=,itr,E2.place) emit(E.place,:=,E1.place,*r ,t);); E.type:=real end; 语义值的设计是与语义处理的描述相关的语义值的设计是与语义处理的描述相关的,如非终结符如非终结符E,有语义值,有语义值Eplace、Etype或或Ekind(见(见PL/0编译程序)编译程序) 在程序设计语言中,在程序设计语言中,布尔表达式的作用有布尔表达式的作用有两个:

26、两个:一是用作逻辑赋值语句的逻辑运算,二一是用作逻辑赋值语句的逻辑运算,二是用作控制语句中的条件表达式是用作控制语句中的条件表达式。 布尔表达式的形式为:布尔表达式的形式为:E1 rop E2,E1和和E2是算是算术表达式,术表达式,rop是关系符是关系符=、=、=、。为简单起见,只考虑如下文法生成的布尔表。为简单起见,只考虑如下文法生成的布尔表达式:达式: EE and E |E or E | not E |id rop id |true |false布尔运算符的优先顺序为:布尔运算符的优先顺序为:not、and、or,并且,并且and和和or服从左结合。服从左结合。 一、一、 布尔表达式的

27、翻译方法布尔表达式的翻译方法 计算布尔表达式的值有两种办法:计算布尔表达式的值有两种办法: 第一种第一种:同算术表达式的计算一样,按步计算:同算术表达式的计算一样,按步计算各部分的真假值,最后计算整个表达式各部分的真假值,最后计算整个表达式的值。的值。例如:例如: 1 or(not 0 and 0)or 0 = 1 or(1 and 0) or 0 = 1 or 0 or 0 = 1 or 0 = 1 采取哪种方法取决于程序设计语言的语义。采取哪种方法取决于程序设计语言的语义。 第二种第二种:采取某种采取某种措施,只计算部分表达措施,只计算部分表达式,如式,如 A or BA or B,若,若

28、A A的值为的值为1 1,则无需计算,则无需计算B B,整个布尔表达式的值为整个布尔表达式的值为1 1。同理,对于。同理,对于A and BA and B,若若A A为为0 0,则整个布尔表达式值为,则整个布尔表达式值为0 0,无需计算,无需计算B B。 若按第一种方法计算布尔表达式,若按第一种方法计算布尔表达式, a or b and not c a or b and not c 翻译成四元式为:翻译成四元式为: (1) t1:= not c(2) t2:= b and t1(3) t3:= a or t2 对于对于a a b b这样的关系表达式,可看成等价的条这样的关系表达式,可看成等价的

29、条件语句件语句: : if aif a b then 1 else 0 b then 1 else 0,翻译成的,翻译成的四元式序列为:四元式序列为: (1) if a b goto (4)(2) t:= 0(3) goto (5)(4) t:= 1(5) 用t t存放a a b b的值,(5)为后继的四元式序号。 p182 p182 图图8.14 8.14 给出了按给出了按第一种第一种办法计算布尔表达办法计算布尔表达式的值。其中:式的值。其中: nextstatnextstat:给出输出序列中下一四元式序号;给出输出序列中下一四元式序号; emitemit:输出四元式,每调用一次,输出四元式

30、,每调用一次,nextstat nextstat 增加增加1 1。 E E1 or E2 E.place:= newtemp; emit(E.place:=E1.place or E2.place)E E1 and E2 E.place:= newtemp; emit(E.place := E1.placeandE2.place)E not E1 E.place:= newtemp; emit(E.place:=notE1.place)E(E1 ) E.place:= E1.place Eid1 relop id2 E.place := newtemp; emit(if id1.place r

31、elop id2.place goto nextstat+3);); emit(E.place := 0);); emit(goto nextstat+2);); emit(E.place := 1););E true E.place:= newtemp; emit(E.place := 1)E false E.place:= newtemp; emit(E.place := 0)二、二、 控制语句中布尔表达式的翻译控制语句中布尔表达式的翻译 讨论出现在讨论出现在if - then;if then - else和和while - do等语句中的布尔表达式等语句中的布尔表达式E的翻译语法:的翻译

32、语法: S if E then S1 | if E then S1 else S2 | while E do S1 begin:out:假假假假假假真真真真真真E的代码的代码E的代码的代码E的代码的代码S1 的代码的代码S1 的代码的代码S1 的代码的代码S2 的代码的代码jump outjump beginif E then S1if E then S1 else S2while E do S1 作为条件转移的作为条件转移的E,仅把仅把E翻译成条件转移和翻译成条件转移和无条件转移的四元式。无条件转移的四元式。翻译的翻译的基本思路基本思路是:是: 对于对于E为为a rop b的形式,生成代码为

33、:的形式,生成代码为: if a rop b goto E.true 和和 goto E.false 对于对于E E为为E E1 or E or E2 的形式,的形式,u若若E E1 1为真,则为真,则E E为真,即为真,即E E1 1的真出口和的真出口和E E的的真出口一样。真出口一样。u若若E E1 1为假则需计算为假则需计算E E2 2,E E1 1的假出口应是的假出口应是E E2 2代码的第一个四元式标号,代码的第一个四元式标号,E E2 2的真出口和的真出口和假出口分别与假出口分别与E E的真出口和假出口一样。的真出口和假出口一样。 E E为为E E1 1 and E and E2

34、2 的形式,与的形式,与2) 2)类似,只需调换类似,只需调换E E1 1的真假出口即可的真假出口即可 对于对于not Enot E1 1的翻译,的翻译,E E的真假出口是的真假出口是E E1 1的假的假真出口。真出口。 例例8.3 布尔表达式布尔表达式a b or c d and e f 翻译成如下四元式序列:翻译成如下四元式序列: (1) if ab goto E.ture(2) goto 3(3) if cd goto 5(4) goto E.false(5) if e f goto E.true(6) goto E.false 上述四元式(上述四元式(2 2)是不需要的,这种问题可在代

35、)是不需要的,这种问题可在代码优化阶段解决。码优化阶段解决。 不是最优语句语句if ab or cd and ef then S1 else S2的四元式的四元式(1) if ab goto (7) /转移至转移至(E.true ) (2) goto (3) (3) if cd goto (5)(4) goto (p+1)/转移至转移至(E.false)(5) if ef goto (7)(6) goto (p+1)(7) ( S1的四元式的四元式 (p-1) )(p) goto (q)(p+1) (S2的四元式的四元式(q-1) )(q)/转移至转移至(E.true ) /转移至转移至(E.

36、false)/(E.false)入口入口/ (E.true ) 入口入口 E.true E.true和和E.falseE.false的值不能在产生四元式的同时的值不能在产生四元式的同时就知道,要在整个布尔表达式(或语句)的四就知道,要在整个布尔表达式(或语句)的四元式产生完毕之后才得知,因此要元式产生完毕之后才得知,因此要回填回填这个地这个地址。址。 为了记录需回填地址的四元式,常采用一种为了记录需回填地址的四元式,常采用一种拉链的办法拉链的办法:把需回填:把需回填E.trueE.true的四元式拉成一链,的四元式拉成一链,称为称为“真真”链链,把需回填,把需回填E.falseE.false的

37、四元式拉成的四元式拉成一链,称为一链,称为“假假”链链。若有四元式序列:若有四元式序列: (10) goto E.true (20) goto E.true(30) goto E.true(10) goto (0) (20) goto (10)(30) goto (20)其中链首为(其中链首为(3030),链尾为(),链尾为(1010),),0 0为链尾标志。为链尾标志。则链成则链成: :使用:使用:E.true 和和 E.false:分别表示:分别表示“真真”链和链和“假假”链链nextstat:下一四元式地址:下一四元式地址emit:输出四元式:输出四元式merge(p1,p2):合并:合

38、并p1、p2两条链,即将两条链,即将p2的的链尾链接到链尾链接到p1链首,合并后链首,合并后p2为链首。为链首。例:例: merge(p1, p2)(p10) goto ( 0) p1 链链 (p100) goto (p10)(p1) goto (p100)(p20) goto( 0) (p1) p2 链链 (p200) goto (p20)(p2) goto (p200)backpatch(p,t):把:把p所链接的所链接的每个每个四元式的四元式的第四区段都填为第四区段都填为tE.codebegin:E的第一个四元式序号(语义值)的第一个四元式序号(语义值) 自下而上的分析中布尔表达式的一种

39、翻译方案,自下而上的分析中布尔表达式的一种翻译方案,如如p167p167图图8.138.13所示所示 (1)E E1 or E2 backpatch( E1.false, E2.codebegin); E.codebegin := E1.codebegin; E.true := merge(E1.true, E2.true); E.false := E2.false; (2)E E1 and E2 backpatch( E1.true, E2.codebegin); E.codebegin := E1.codebegin; E.true := E2.true; E.false :=merge(

40、E1.false, E2.false);); (3)E not E1 E.true := E1.false; E.codebegin := E1.codebegin; E.false := E1.true; (4)E ( E1) E.true := E1.true; E.codebegin := E1.codebegin; E.false := E1.false; (5)Eid1 relop id2 E.true :=nextstat; E.codebegin := nextstat; E.false :=nextstat+1; emit(if id1.place rop id2.place

41、goto_ ); emit(goto _ ) ; (6)E true E.true :=nextstat; E.codebegin := nextstat; emit(goto _ ) ; (7)E false E.false :=nextstat; E.codebegin := nextstat; emit(goto _ ); 以以a b or c d and e f 为例,将分析产生语为例,将分析产生语法树时的语义动作结果法树时的语义动作结果“真真”“”“假假”链情况注释链情况注释在相应结点处在相应结点处 anda borE E.true=104,100 E.false=105,103E1

42、 E.true=100 E.false=101E4 E.true=104 E.false=105,103E2 E.true=102 E.false=103E3 E.true=104 E.false=105c d e f 1) 归约a b到E1时,产生两个四元式: 100:if a b goto 101:goto (假定(假定nextstat初值为初值为100) E1.true和E1.false分别为100、101, E1.codebegin=100; 2 2) 归约归约c d到到E2时,产生两个四元式:时,产生两个四元式: 102:if c d goto 103 103:goto goto E E2.true.true和和E E2.false.false分别为分别为102102、103103, E E2.codebegin=102.codebegin=102; 3 3) 归约归约e f 到到

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论