《编译第七章语法制导翻译》由会员分享,可在线阅读,更多相关《编译第七章语法制导翻译(108页珍藏版)》请在金锄头文库上搜索。
1、第七章语法制导翻第七章语法制导翻译和中间代码生成译和中间代码生成第一节第一节 概述概述v 语法分析之后,编译的任务是由已识别为正确的源程语法分析之后,编译的任务是由已识别为正确的源程序生成一组规格一致,便于计算机加工的指令形式。序生成一组规格一致,便于计算机加工的指令形式。一、中间代码生成方法一、中间代码生成方法语法制导翻译,属性文法制导翻译语法制导翻译,属性文法制导翻译二、中间代码二、中间代码中间代码:不是机器语言,便于生成机器语言,便于代中间代码:不是机器语言,便于生成机器语言,便于代码优化。码优化。中间代码的形式:中间代码的形式:-逆波兰式逆波兰式-树形表示法树形表示法-三元式三元式-四
2、元式:最常用的形式四元式:最常用的形式第七章中间代码的生成 1第一节第一节 概述概述v二、翻译方法二、翻译方法1 1、语法制导翻译、语法制导翻译-在语法分析的基础上进行边分析边翻译。在语法分析的基础上进行边分析边翻译。注:注:1 1)语法制导翻译时会根据文法产生式右部符号)语法制导翻译时会根据文法产生式右部符号串的含义进行翻译,翻译的结果是生成相应中间代串的含义进行翻译,翻译的结果是生成相应中间代码。码。2 2)语法制导翻译的依据是语义子程序。)语法制导翻译的依据是语义子程序。3 3)具体做法:为每个产生式配置一个语义子程序,)具体做法:为每个产生式配置一个语义子程序,当语法分析进行归约或推导
3、时,调用语义子程序,当语法分析进行归约或推导时,调用语义子程序,完成一部分翻译任务。完成一部分翻译任务。4 4)语法分析完成,翻译工作也告结束。)语法分析完成,翻译工作也告结束。第七章中间代码的生成 2第一节第一节 概述概述v二、翻译方法二、翻译方法1 1、语法制导翻译、语法制导翻译-语法制导翻译适用于多种语法分析语法制导翻译适用于多种语法分析-语法制导翻译种类语法制导翻译种类1 1、自上而下语法制导翻译:对每个文法符号配以语、自上而下语法制导翻译:对每个文法符号配以语义动作。义动作。2 2、自下而上语法制导翻译:我们主要讨论、自下而上语法制导翻译:我们主要讨论LRLR语法制语法制导翻译导翻译
4、第七章中间代码的生成 3第一节第一节 概述概述v三、语义子程序三、语义子程序1 1、作用、作用用来描述一个产生式所对应的翻译工作。用来描述一个产生式所对应的翻译工作。-如:改进某些变量的值;查填各种符号表;发现并如:改进某些变量的值;查填各种符号表;发现并报告源程序错误;产生中间代码等。报告源程序错误;产生中间代码等。注;这些翻译工作很大程度上决定了要产生什么形注;这些翻译工作很大程度上决定了要产生什么形式的中间代码式的中间代码v三、语义子程序三、语义子程序2 2、写法、写法语义子程序写在该产生式后面的花括号内。语义子程序写在该产生式后面的花括号内。 X X a a 语义子程序语义子程序 注:
5、在一个产生式中同一个文法符号可能出现多次,但它们注:在一个产生式中同一个文法符号可能出现多次,但它们代表的是不同的语义值,要区分可以加上角标。代表的是不同的语义值,要区分可以加上角标。如:如: E EE E(1)(1)+E+E(2)(2)3 3、语义值、语义值为了描述语义动作,需要为每个文法符号赋予不同的语义值:为了描述语义动作,需要为每个文法符号赋予不同的语义值:类型,地址,代码值等。类型,地址,代码值等。第一节第一节 概述概述第一节第一节 概述概述v三、语义子程序三、语义子程序4 4、语义栈、语义栈各个符号的语义值放在语义栈中各个符号的语义值放在语义栈中-当产生式进行归约时,需对产生式右部
6、符号的语义值进行当产生式进行归约时,需对产生式右部符号的语义值进行综合,综合,其结果作为左部符号的语义值保存到语义栈中。其结果作为左部符号的语义值保存到语义栈中。下推栈包含下推栈包含3 3部分:部分:-状态栈、符号栈和语义栈状态栈、符号栈和语义栈-注:语义栈与状态栈和符号栈是同步变化的。注:语义栈与状态栈和符号栈是同步变化的。第一节第一节 概述概述v三、语义子程序三、语义子程序注:注:1 1)若把语义子程序改成产生某种中间代码)若把语义子程序改成产生某种中间代码的动作,就能在语法分析制导下,随着分析的动作,就能在语法分析制导下,随着分析的进展逐步生成中间代码。的进展逐步生成中间代码。 2 2)
7、若把语义子程序改成产生某种机器的汇)若把语义子程序改成产生某种机器的汇编语言指令,就能随着分析的进展逐步生成编语言指令,就能随着分析的进展逐步生成某机器的汇编语言代码。某机器的汇编语言代码。第一节第一节 概述概述v例如:例如:v产生式产生式 语义子程序语义子程序v(0)S E PRINT E(0)S E PRINT E VALVALv(1)E E(1)E E(1)(1) +E +E(2)(2) E EVAL=E(1)VAL=E(1)VAL+E(2)VAL+E(2)VALVALv(2)E E(2)E E(1)(1) * * E E(2)(2) E EVAL=E(1)VAL=E(1)VAL*E(2
8、)VAL*E(2)VALVALv(3)E (E(3)E (E(1)(1) E) EVAL=E(1)VAL=E(1)VALVALv(4)E i E(4)E i EVAL=LEXVALVAL=LEXVALv注:注:LEXVALLEXVAL指的是词法分析送来的机内二进制整数。指的是词法分析送来的机内二进制整数。v下推栈SmE(2)E(2).VALSm-1+E(1)E(1).VAL.S0#状态符号VAL(语义)第一节第一节 概述概述v注:由于语义值是放在语义栈中的,它也可以用栈顶指针注:由于语义值是放在语义栈中的,它也可以用栈顶指针TOPTOP指出,语义子程序改写为:指出,语义子程序改写为: v产生式
9、产生式 语义子程序语义子程序v(0)S E PRINT VALTOP(0)S E PRINT VALTOPv(1)E E(1)E E(1)(1) +E +E(2)(2) VALTOP=VALTOP+VALTOP+2 VALTOP=VALTOP+VALTOP+2v(2)E E(2)E E(1)(1) * * E E(2)(2) VALTOP=VALTOP*VALTOP+2 VALTOP=VALTOP*VALTOP+2v(3)E (E(3)E (E(1)(1) VALTOP=TOP+1) VALTOP=TOP+1v(4)E i VALTOP=LEXVAL(4)E i VALTOP=LEXVALv注
10、:注:LEXVALLEXVAL指的是词法分析送来的机内二进制整数。指的是词法分析送来的机内二进制整数。第一节第一节 概述概述v例如:分析输入串例如:分析输入串(7+9)*5#,(7+9)*5#,并给出它的计算过程。并给出它的计算过程。分析表如下:分析表如下:状态状态ACTIONGOTOi+*( )#S0S3S211S4S5acc2S3 S2 63r4r4r4r4 4S3S275S3S2 8 6S4 S5 S9 7 r1( (S4) S5(r1) r1r1 8r1( (S4) r2( (S5) r2r2 9 r3 r3r3r3步骤步骤状态状态SYMSYMVALVALINPUTINPUTACTIO
11、NACTION1 10 0# #- -(7+9)*5#(7+9)*5#2 20,20,2#(#(-7+9)*5#7+9)*5#移进移进3 30,2,30,2,3#(7#(7-+9)*5#+9)*5#移进移进4 40,2,60,2,6#(E#(E-7-7+9)*5#+9)*5#r r4 45 50,2,6,40,2,6,4#(E+#(E+-7-7-9)*5#9)*5#移进移进6 60,2,6,4,30,2,6,4,3#(E+9#(E+9-7-7-)*5#)*5#移进移进7 70,2,6,4,70,2,6,4,7#(E+E#(E+E-7-9-7-9)*5#)*5#r r4 48 80,2,60,2
12、,6#(E#(E-16-16)*5#)*5#r r1 19 90,2,6,90,2,6,9#(E)#(E)-16-16-*5#*5#移进移进10100,10,1#E#E-16-16*5#*5#r r3 311110,1,50,1,5#E*#E*-16-16-5#5#移进移进第一节第一节 概述概述四、常见的中间代码形式四、常见的中间代码形式1.1.四元式形式四元式形式(Operator,Operand1, Operand2, Result)Operator,Operand1, Operand2, Result)注:注:1 1)Operand1, Operand2, ResultOperand1,
13、 Operand2, Result可能是用户自定义的变可能是用户自定义的变量,也可能是编译时引进的变量,这里量,也可能是编译时引进的变量,这里OperatorOperator是双目运算是双目运算符,若只有一个运算量,则是单目运算符。符,若只有一个运算量,则是单目运算符。 2 2)四元式中变量采用符号表入口的地址,而不用变良的)四元式中变量采用符号表入口的地址,而不用变良的地址,因为语义分析不仅需要变量的地址,还需要从符号表地址,因为语义分析不仅需要变量的地址,还需要从符号表查到的变量的属性,类型和地址等。查到的变量的属性,类型和地址等。第一节第一节 概述概述v四、常见的中间代码形式四、常见的中
14、间代码形式v2.2.三元式三元式v(Operator,Operand1, Operand2Operator,Operand1, Operand2)v注:注:1 1)这里三元式本身作为存放结果的单元。)这里三元式本身作为存放结果的单元。 2 2)为了在其它三元式中利用当前三元式的结果,)为了在其它三元式中利用当前三元式的结果,需要对三元式进行遍号。三元式的编号就作为相应需要对三元式进行遍号。三元式的编号就作为相应三元式的结果值。三元式的结果值。第一节第一节 概述概述v四、常见的中间代码形式四、常见的中间代码形式v3 3、后缀表示式(逆波兰表示式)、后缀表示式(逆波兰表示式)vOperand1 O
15、perand2 OperatorOperand1 Operand2 Operatorv4 4、树型表示法、树型表示法OperatorOperand2Operand1注:常用中间代码表示法是四元式注:常用中间代码表示法是四元式第二节第二节 简单算术表达式和赋值语句的翻译简单算术表达式和赋值语句的翻译v一、赋值语句的翻译赋值语句的翻译v-仅含简单变量的表达式和赋值语句的翻译仅含简单变量的表达式和赋值语句的翻译v1 1、赋值语句的文法、赋值语句的文法v A i=EA i=Ev E E+E|E*E|- E E+E|E*E|-E|(E)|iE|(E)|iv2 2、需要的语义过程、需要的语义过程vNEWT
16、EMONEWTEMO函数:每次使用送回一个代表新临时变量的函数:每次使用送回一个代表新临时变量的序号,可认为是送回序号,可认为是送回T1,T2T1,T2这样的一些临时变量;这样的一些临时变量;vENTRY(iENTRY(i) )函数:用于查变量函数:用于查变量i i的符号表入口地址;的符号表入口地址;vGEN(OP,ARG1,ARG2,RESULT)GEN(OP,ARG1,ARG2,RESULT)过程:产生一个四元式,过程:产生一个四元式,并填入四元式序列表并填入四元式序列表第二节第二节 简单算术表达式和赋值语句的翻译简单算术表达式和赋值语句的翻译v一、赋值语句的翻译一、赋值语句的翻译v3 3
17、、需要的语义变量、需要的语义变量vE EPLACE:PLACE:与非终结符与非终结符E E相联系的语义变量相联系的语义变量v-值为某变量的符号表入口地址或临时变量值为某变量的符号表入口地址或临时变量序号。序号。v-它与文法的非终结符相联,分析过程就建它与文法的非终结符相联,分析过程就建立,不需要就消亡。立,不需要就消亡。v产生式产生式 语义子程序语义子程序v(1)A i=E GEN(=,(1)A i=E GEN(=,E EPLACE,_,ENTRY(iPLACE,_,ENTRY(i)v(2)E -E(2)E -E(1) (1) T=NEWTEMP;T=NEWTEMP;v- GEN(,E- GE
18、N(,E(1)(1)PLACE,_,T);PLACE,_,T);v- E- EPLACE=TPLACE=Tv(3)E E(3)E E(1)(1)*E*E(2) (2) T=NEWTEMP;T=NEWTEMP;v GEN(*,E GEN(*,E(1)(1)PLACE,EPLACE,E(2)(2)PLACE,T);PLACE,T);v E EPLACE=TPLACE=Tv(4)E E(4)E E(1)(1)+E+E(2) (2) T=NEWTEMP;T=NEWTEMP;v GEN(+,E GEN(+,E(1)(1)PLACE,EPLACE,E(2)(2)PLACE,T);PLACE,T);v E
19、EPLACE=TPLACE=Tv(5)E (E(5)E (E(1)(1) E) EPLACE=EPLACE=E(1)(1)PLACEPLACEv(6)E i E(6)E i EPLACE=PLACE=ENTRY(iENTRY(i) ) 输入符号串SYM栈PLACE栈生成四元式A=-B*(C+D)#=-B*(C+D)#i-B*(C+D)#i=-B*(C+D)#i=-*(C+D)#i=-i-*(C+D)#i=-E-B*(C+D)#i=E-T1(,B,-,T1)(C+D)#i=E*-T1-C+D)#i=E*(-T1-+D)#i=E*(i-T1-C+D)#i=E*(E-T1-Cv注:注:1 1、符号栈
20、是为了介绍才列出的,实际上不存在。、符号栈是为了介绍才列出的,实际上不存在。v2 2、由于语义分析是在语法分析的过程中进行的,所、由于语义分析是在语法分析的过程中进行的,所以状态栈实际上是需要的,这里没有写出来。以状态栈实际上是需要的,这里没有写出来。v3 3、这个分析过程是针对整型变量做的。实际上在一、这个分析过程是针对整型变量做的。实际上在一个表达式中,可能出现各种不同类型的变量或常量,个表达式中,可能出现各种不同类型的变量或常量,所以,编译程序要么拒绝接受某种混合运算,要么所以,编译程序要么拒绝接受某种混合运算,要么能产生有关类型转换的指令。能产生有关类型转换的指令。第二节第二节 简单算
21、术表达式和赋值语句的翻译简单算术表达式和赋值语句的翻译v类型转换类型转换v对于表达式文法中的对于表达式文法中的i i是实型又可以是整型。是实型又可以是整型。v对这种混合运算,我们要先把整型量转化为实型量,就需要对这种混合运算,我们要先把整型量转化为实型量,就需要为每个非终结符的语义值添加类型信息,用为每个非终结符的语义值添加类型信息,用E EMODEMODE表示非终表示非终结符结符E E的类型信息。的类型信息。v1 1、定义各非终结符的类型信息、定义各非终结符的类型信息v产生式产生式E EE E(1)(1)op Eop E(2)(2)的语义动作中要加入关于的语义动作中要加入关于E EMODEM
22、ODE的语的语义规则的定义;义规则的定义;v-IF E-IF E(1)(1)MODE=MODE=intint AND E AND E(2)(2)MODE=MODE=intintv-IF -IF E EMODE=MODE=intint ELSE ELSE E EMODE=rMODE=r第二节第二节 简单算术表达式和赋值语句的翻译简单算术表达式和赋值语句的翻译v2 2、对运算量进行类型转换、对运算量进行类型转换v例如:例如:X=Y+I*J,X=Y+I*J,其中其中X,YX,Y是实型,是实型,I,JI,J是整型。是整型。v其四元式为:其四元式为:v-(*I,I,J,T-(*I,I,J,T1 1) )
23、v-(itr,T-(itr,T1 1,_,T,_,T2 2) )v-(+r,Y,T-(+r,Y,T2 2,T,T3 3) )v-(=,T-(=,T3 3,_,X),_,X)第二节第二节 简单算术表达式和赋值语句的翻译简单算术表达式和赋值语句的翻译v注:注:1)1)对运算符也要指出相应的类型(运算对运算符也要指出相应的类型(运算符上加角标),说明是定点还是浮点远算。符上加角标),说明是定点还是浮点远算。v2)2)由于非终结符由于非终结符E E的语义值有的语义值有E EPLACEPLACE和和E EMODEMODE两个,这两者都要保存在语义栈中。两个,这两者都要保存在语义栈中。v3)3)在运算量的
24、类型较多的情况下,需要仔细在运算量的类型较多的情况下,需要仔细推敲语义规则,否则语义子程序会变置累赘推敲语义规则,否则语义子程序会变置累赘不填。不填。第三节第三节 布尔表达式的翻译布尔表达式的翻译v一、布尔表达式在程序设计语言中的作用布尔表达式在程序设计语言中的作用v-用作控制语句中的条件表达式用作控制语句中的条件表达式v-用于逻辑赋值语句中布尔表达式演算用于逻辑赋值语句中布尔表达式演算v二、布尔表达式的组成二、布尔表达式的组成v-由布尔算符作用于布尔变量(或常量)或关系表由布尔算符作用于布尔变量(或常量)或关系表达式而形成的。达式而形成的。v-布尔算符:布尔算符:, , v-关系表达式的形式
25、:关系表达式的形式: E E(1)(1)rop Erop E(2)(2), ,其中其中roprop是关系是关系运算符(如运算符(如,=,=,=,), E,=,=,=,), E(1)(1)和和E E(2)(2)是算术表达是算术表达式。式。第三节第三节 布尔表达式的翻译布尔表达式的翻译v三、三、布尔表达式的文法:布尔表达式的文法:v-G(B):E E-G(B):E EE|EE|EE| E| E|(E)|i|EaE|(E)|i|Ea roprop Ea Eav-i-i为布尔变量或常量;为布尔变量或常量;EaEa为算术表达式。为算术表达式。v注:注:1)1)此文法为二义文法,一般布尔算符的优先顺序为:
26、此文法为二义文法,一般布尔算符的优先顺序为: ,服从左结合律;关系运算优先级别高于布尔运算。服从左结合律;关系运算优先级别高于布尔运算。v 2)2)由于布尔表达式有两种用途,所以有两种不同的翻译由于布尔表达式有两种用途,所以有两种不同的翻译方法。方法。第三节第三节 布尔表达式的翻译布尔表达式的翻译v四、布尔表达式在逻辑演算中的翻译布尔表达式在逻辑演算中的翻译v1 1、语义子程序、语义子程序v由于布尔表达式演算与算术表达式计算非常由于布尔表达式演算与算术表达式计算非常类似,可以仿照算术表达式的翻译方法,为类似,可以仿照算术表达式的翻译方法,为每个产生式写出语义子程序。每个产生式写出语义子程序。v
27、 产生式产生式 语义子程序语义子程序v(1)E E(1)E Ea a(1)(1)ropEropEa a(2) (2) T=NEWTEMP;T=NEWTEMP;v GEN(rop,E GEN(rop,Ea a(1)(1)PLACE,EPLACE,Ea a(2)(2)PLACE,T);PLACE,T);v E EPLACE=TPLACE=Tv(2)E E(2)E Ea a(1)(1)bopEbopEa a(2) (2) T=NEWTEMP;T=NEWTEMP; GEN(bop,E GEN(bop,Ea a(1)(1)PLACE,EPLACE,Ea a(2)(2)PLACE,T);PLACE,T);
28、v E EPLACE=TPLACE=Tv(3)E E(3)E E(1) (1) T=NEWTEMP;T=NEWTEMP;v GEN( ,E GEN( ,E(1)(1)PLACE,_,T);PLACE,_,T);v E EPLACE=TPLACE=Tv(4)E (E(4)E (E(1)(1) E) EPLACE=EPLACE=E(1)(1)PLACEPLACEv(5)E i E(5)E i EPLACE=PLACE=ENTRY(iENTRY(i) ) 第三节第三节 布尔表达式的翻译布尔表达式的翻译v四、布尔表达式在逻辑演算中的翻译布尔表达式在逻辑演算中的翻译v2 2、实例:对布尔式、实例:对布尔
29、式X+YZA( BC) X+YZA( BC) 进行翻译:进行翻译:v解:语法制导翻译是在语法分析下的过程中进行的,解:语法制导翻译是在语法分析下的过程中进行的,若利用若利用G(B)G(B)文法的文法的LRLR分析表对上句进行分析表对上句进行LRLR分析,在分析,在其过程中进行语义分析;则得到对上句进行其过程中进行语义分析;则得到对上句进行LRLR分析,分析,在其过程中进行语义分析;则得到的四元式序列是:在其过程中进行语义分析;则得到的四元式序列是:v-(+,X,Y,T-(+,X,Y,T1 1);E+E);E+E进行归约,识别了算术运算进行归约,识别了算术运算v-(,T-(,T1 1,Z,T,Z
30、,T2 2);EE);EE进行归约,识别了关系运算进行归约,识别了关系运算v-( ,B,_,T-( ,B,_,T3 3); E); E归约归约v-(,T-(,T3 3,C,T,C,T4 4);EE);EE进行归约进行归约v-(-(,A,TA,T4 4,T,T5 5);); E EE E进行归约进行归约v-(-(,T T2 2,T,T5 5,T,T6 6);); EEEE进行归约进行归约第三节第三节 布尔表达式的翻译布尔表达式的翻译v注:上面的翻译质量并不高,可以采取某种优化措注:上面的翻译质量并不高,可以采取某种优化措施:施:v例如:例如:v对对AB.AB.若已知若已知A A的值是的值是1.1
31、.那么那么 B B的值就不需要知道的值就不需要知道就能得出就能得出AB=1AB=1;v-可以表示为:可以表示为:IF A THEN TRUE ELSE BIF A THEN TRUE ELSE Bv对对A AB B若已知若已知A A的值是的值是0 0,那么,那么B B的值就不需要知道就的值就不需要知道就错得出错得出A AB=0B=0;v-可以表示为:可以表示为: IF A THEN FALSE ELSE TRUEIF A THEN FALSE ELSE TRUE第三节第三节 布尔表达式的翻译布尔表达式的翻译v五、控制语句中布尔式的翻译五、控制语句中布尔式的翻译v1 1、控制语句中布尔式并不需要
32、计算表达式的值,、控制语句中布尔式并不需要计算表达式的值,只用只用if-then-elseif-then-else来解释来解释, , , , ,以来控制程以来控制程序流向。序流向。vIf E then SIf E then S1 1 else S else S2 2 E的代码序列S1 1的代码序列S2 2的代码序列假假真真第三节第三节 布尔表达式的翻译布尔表达式的翻译v五、控制语句中的布尔式的翻译五、控制语句中的布尔式的翻译v2 2、控制语句中的布尔式的翻译的四元式为以下三种:、控制语句中的布尔式的翻译的四元式为以下三种:v(juz,A(juz,A1 1,_,P ,_,P - if A - i
33、f A1 1 then then gotogoto P P (j (jQ Q,A,A1 1,A,A2 2, , - if A - if A1 1Q QA A2 2 then then gotogoto P P ( (j,_,_,Pj,_,_,P) ) - -GotoGoto P P注:这些四元式都是转移四元式,其中注:这些四元式都是转移四元式,其中P P为出口的四元为出口的四元式序号,与式序号,与E E的真假值相对应的分别为真出口和假出的真假值相对应的分别为真出口和假出口两类四元式。口两类四元式。v例如:把语句例如:把语句if ABD then Sif ABD then S1 1 else S
34、 else S2 2翻译成四翻译成四元式元式v解解:(1)(jnz,A,_,(5);:(1)(jnz,A,_,(5);真出口真出口; ;若若A A为真为真, ,执行执行S S1 1代码代码v(2)(j,_,(3);(2)(j,_,(3);若若A A为假,看为假,看右边的表达式值右边的表达式值v(3)(j,B,D,(5);(3)(j,B,D,(5);真出口真出口,右边的表达式值为真右边的表达式值为真v(4)(j,_,_,(p+1);(4)(j,_,_,(p+1);假出口假出口,右边的表达式值为假右边的表达式值为假v(5)S(5)S1 1语句的第一个四元式语句的第一个四元式v.v( (p)(j,_
35、,_,(qp)(j,_,_,(q););执行完执行完S S1 1代码后跳过代码后跳过S S2 2代码段代码段v(p+1)S(p+1)S2 2语句的第一个四元式语句的第一个四元式v.v(q)(q)此语句的后继语句此语句的后继语句第三节第三节 布尔表达式的翻译布尔表达式的翻译v五、控制语句中布尔式的翻译五、控制语句中布尔式的翻译v4 4、增加语义值、增加语义值vE ETCTC、E EFCFC的值也可以放在语义栈中,即下推栈又的值也可以放在语义栈中,即下推栈又增加了两栏增加了两栏. .E(1).S0#_SSYMPLACETCFC分析栈分析栈语义栈语义栈第三节第三节 布尔表达式的翻译布尔表达式的翻译v
36、五、控制语句中布尔式的翻译五、控制语句中布尔式的翻译v5 5、文法、文法G(B)G(B)各产生式的语义子程序各产生式的语义子程序v-文法:文法:E EE EA AE|EE|E0 0E| E| E|(E)|i|EE|(E)|i|Ea aropEropEa av E EA A E Ev E E0 0 E Ev语义子程序:语义子程序:v-(1)E i E-(1)E i ETC=NXQ; ETC=NXQ; EFC=NXQ+1;FC=NXQ+1;v- - GEN(jnz,ENTRY(i),_,OGEN(jnz,ENTRY(i),_,O););v- - GEN(j,_,_,OGEN(j,_,_,O) )v
37、-注:将布尔型操作数进行归约,产生两个四元式;注:将布尔型操作数进行归约,产生两个四元式;v无论真假都不知该转到哪个四元式上去,故转向无论真假都不知该转到哪个四元式上去,故转向0 0v例如:将控制语句中的例如:将控制语句中的ABD ABD v翻译成四元式翻译成四元式v解解:(1)(jnz,A,_,0);:(1)(jnz,A,_,0);真出口;真出口;v (2)(j,_,_,0);(2)(j,_,_,0);若若A A为假为假, ,看看右边的表达右边的表达式的值式的值v TC:1;TC:1;v FC:2; FC:2;第三节第三节 布尔表达式的翻译布尔表达式的翻译v五、控制语句中布尔式的翻译五、控制
38、语句中布尔式的翻译v5 5、文法、文法G(B)G(B)各产生式的语义子程序各产生式的语义子程序v(7)E(7)E0 0 E E(1)(1)v- BACKPATCH(E- BACKPATCH(E(1)(1)FC,NXQ);FC,NXQ);v- E- E00TC=ETC=E(1)(1)TC;TC;v注:对注:对进行归约之后,若进行归约之后,若E E(1)(1)=0,=0,则则运算的结果运算的结果就要看就要看右边式子的值了,所以表示右边式子的值了,所以表示E E(1)(1)=0=0的四元式的四元式应转移到应转移到归约后的下一个四元式,即判断归约后的下一个四元式,即判断右边右边式子的值的第一个四元式。
39、式子的值的第一个四元式。第三节第三节 布尔表达式的翻译布尔表达式的翻译v五、控制语句中布尔式的翻译五、控制语句中布尔式的翻译v5 5、文法、文法G(B)G(B)各产生式的语义子程序各产生式的语义子程序vPROCEDURE PROCEDURE BACKPATCH(p,tBACKPATCH(p,t) )vQ=P;Q=P;vWHILE (Q0)WHILE (Q0)vq=q=四元式四元式Q Q第四段的内容;第四段的内容;v 把把t t填入四元式填入四元式Q Q的第四段;的第四段;v Q=q;Q=q;v注:其算法思想是:从链头算起,边找边读,直到注:其算法思想是:从链头算起,边找边读,直到链尾为止。链尾
40、为止。v例如:将控制语句中的例如:将控制语句中的ABD ABD v翻译成四元式翻译成四元式v解解:(1)(jnz,A,_,0);:(1)(jnz,A,_,0);真出口;真出口;v (2)(j,_,_,(3);(2)(j,_,_,(3);若若A A为假,看为假,看右边的表右边的表达式的值达式的值v E E00TC:1;TC:1;vFCFC已回填已回填第三节第三节 布尔表达式的翻译布尔表达式的翻译v五、控制语句中布尔式的翻译五、控制语句中布尔式的翻译v5 5、文法、文法G(B)G(B)各产生式的语义子程序各产生式的语义子程序 (2)E (2)E E Ea aropEropEa a- - E ETC
41、=NXQ; ETC=NXQ; EFC=NXQ+1;FC=NXQ+1;- GEN(jrop,E- GEN(jrop,Ea a(1)(1)PLACE,PLACE,E Ea a(2)(2)PLACE,0);PLACE,0);- GEN(j,_,_,0)- GEN(j,_,_,0)v例如:将控制语句中的例如:将控制语句中的ABD ABD v翻译成四元式翻译成四元式v解解:(1)(jnz,A,_,0);:(1)(jnz,A,_,0);真出口真出口v (2)(j,_,_,(3);(2)(j,_,_,(3);若若A A为假为假, ,看看右边的表达式值右边的表达式值v (3)(j,B,D,0);(3)(j,B
42、,D,0);真出口真出口, ,右边的表达式值为真右边的表达式值为真v (4)(j,_,_,0);(4)(j,_,_,0);假假出口出口, , 右边的表达式值为假右边的表达式值为假vE ETC:3;TC:3;vE EFC:4;FC:4;第三节第三节 布尔表达式的翻译布尔表达式的翻译v五、控制语句中布尔式的翻译五、控制语句中布尔式的翻译v5 5、文法、文法G(B)G(B)各产生式的语义子程序各产生式的语义子程序v(8) E E(8) E E0 0E E(2)(2)v- - E EFC=EFC=E(2(2) )FC;FC;v- E- ETC=MERG(ETC=MERG(E0 0TC, ETC, E(
43、2)(2)TCTCv注:由于注:由于E E的真假决定于的真假决定于E E(2)(2)为假时它们的转移相同;为假时它们的转移相同;由于由于E E(1)(1)或或E E(2)(2)为真时都导致问真,所以它们为真的为真时都导致问真,所以它们为真的情况要合并起来。情况要合并起来。v例如:将控制语句中的例如:将控制语句中的ABD ABD v翻译成四元式翻译成四元式v解解:(1)(jnz,A,_,0);:(1)(jnz,A,_,0);真出口真出口v (2)(j,_,_,(3);(2)(j,_,_,(3);若若A A为假为假, ,看看右边的表达式值右边的表达式值v (3)(j,B,D,0);(3)(j,B,
44、D,0);真出口真出口, ,右边的表达式值为真右边的表达式值为真v (4)(j,_,_,0);(4)(j,_,_,0);假假出口出口, , 右边的表达式值为假右边的表达式值为假vE ETC:3TC:3,1;1;vE EFC:4;FC:4;vFUNCTION MERG(PFUNCTION MERG(P1 1,P,P2 2););vIF PIF P2 2=0=0v MERG=P MERG=P1 1vWHILE WHILE 四元式四元式P P的第的第4 4段内容不为段内容不为0 0v P= P=四元式四元式P P的第的第4 4段内容;段内容;v 把把P P1 1填进四元式填进四元式P P的第四段;的
45、第四段;v MERG=PMERG=P2 2;v注:算法思想:找到注:算法思想:找到P P2 2的链尾,然后将的链尾,然后将P P1 1连接到连接到P P2 2的的链尾。链尾。第三节第三节 布尔表达式的翻译布尔表达式的翻译v(3)E (E(3)E (E(1)(1) E) ETC=ETC=E(1(1) )TC; ETC; EFC=EFC=E(1(1) )FCFCv(4)E E(4)E E(1)(1) E ETC=ETC=E(1(1) )FC; EFC; EFC=EFC=E(1(1) )FCFCv(5)E(5)EA A E E(1)(1)v- BACKPATCH(E- BACKPATCH(ETC,N
46、XQ);TC,NXQ);v- E- EA AFC=EFC=E(1)(1)FC;FC;v(6)E E(6)E EA AE E(2)(2)v- E- ETC=ETC=E(1)(1)TC;TC;v- - E EFC=MERG(EFC=MERG(EA AFC,EFC,E(2)(2)FCFC第三节第三节 布尔表达式的翻译布尔表达式的翻译v五、控制语句中布尔式的翻译五、控制语句中布尔式的翻译v例如:将布尔式例如:将布尔式AB CAB C在语法制导下翻译成四元式。在语法制导下翻译成四元式。INPUTINPUTSYMSYMTCTCFCFC四元式四元式AB C#AB C# #- - -B C#B C#i#i-B
47、 C#B C#E#E-1-1-2-21.(jnz,a,_,(3)1.(jnz,a,_,(3) )B C#B C#E#E-1-1-2-2-2.(j,_,_.(5)2.(j,_,_.(5)B C#B C#E#EA A-2-2 C# C# #E EAiAi-2-2-INPUTINPUTSYMSYMTCTCFCFC四元式四元式 C# C#E#EA AE E-3-3-24-243.(jnz,B,_,0)3.(jnz,B,_,0) C# C#E#E-3-3-4-44.(j,_,_,(5)4.(j,_,_,(5) C# C#E#E-3-3-4-4- C# C#E#E0 0-3 -3 - - - C# C#E
48、#E0 0-3-3-# #E#E0 0 i i-3-3-# #E#E0 0 E E-3-5-3-5-6-65.(jnz,C,_,0)5.(jnz,C,_,0)# # #E E0 0E E-36-36-5-55.(j,_,_,(3)5.(j,_,_,(3)# #E#E-6-6-5-5成功成功第四节第四节 控制语句的翻译控制语句的翻译v一、控制语句的种类:控制语句的种类:v无条件转换语句无条件转换语句v条件语句条件语句v迭代语句迭代语句v循环语句循环语句v分支语句分支语句第四节第四节 控制语句的翻译控制语句的翻译v二、标号和转移语句二、标号和转移语句(GOTO)(GOTO)v1 1、标号和转移语句
49、、标号和转移语句(GOTO)(GOTO)v(1)(1)标号语句标号语句v-GOTO-GOTO语句实现无条件转移,要确定转移的目的语句,需语句实现无条件转移,要确定转移的目的语句,需要给语句加标号。要给语句加标号。v-带标号的语句形式:带标号的语句形式:L:SL:SvL L是标号是标号v(2)(2)标号的定义和使用:标号的定义和使用:v-先定义后使用先定义后使用 L:S .GOTO LL:S .GOTO Lv-先使用后定义先使用后定义 GOTO LL:SGOTO LL:S第四节第四节 控制语句的翻译控制语句的翻译v2 2、先定义后使用、先定义后使用v(1)(1)形式:形式:L:SL:Sv- .-
50、 .v- GOTO L- GOTO Lv- .- .v(2)(2)定义和使用表号的文法定义和使用表号的文法v- S - S gotogoto L Lv- Label i:- Label i:v(3)(3)翻译过程:翻译过程:v-当遇到定义性的标号语句时,将当遇到定义性的标号语句时,将L L归约为归约为LabelLabel,再将再将L L填入符号表,如下:填入符号表,如下:NAMENAMEINFORMATIONINFORMATIONCATCAT.定义否定义否地址地址.L L标号标号已已S.QUADS.QUAD.S.QUAD:S.QUAD:即即S S对应的入口四元式序号。对应的入口四元式序号。当后
51、面遇到当后面遇到GOTO LGOTO L语句时,便产生四元式:语句时,便产生四元式:( (j,_,_,Pj,_,_,P), ), 其中其中P=S.QUADP=S.QUADv2 2、先使用后定义、先使用后定义v(1)(1)形式:形式:GOTO LGOTO Lv- - v- GOTO L- GOTO Lv- .- .v- GOTO L- GOTO Lv- .- .v- L:S- L:Sv(2)(2)翻译过程:翻译过程:v-由于这里是先使用,所以当遇到标号由于这里是先使用,所以当遇到标号LL时,时,它还未定义,故而填入符号表时情况与上不同,表它还未定义,故而填入符号表时情况与上不同,表如下:如下:N
52、AMENAMEINFORMATIONINFORMATIONCATCAT.定义否定义否地址地址.LL标号标号未未P P.(2)(2)翻译过程:翻译过程:(a)(a)填符号表:将定义否栏填填符号表:将定义否栏填“未未”,地址档暂填即,地址档暂填即将生成的四元式序号将生成的四元式序号P,CATP,CAT栏填栏填“标号标号”;(b)(b)生成四元式生成四元式 (P) (j,_,_,0),(P) (j,_,_,0),等待回填;等待回填;NAMENAMEINFORMATIONINFORMATIONCATCAT.定义否定义否地址地址.LL标号标号未未q q.(c)(c)当遇到第当遇到第2 2个使用性标号个使
53、用性标号LL时,修改符号表,仅时,修改符号表,仅将将LL这一行的地址栏内容修改为即将生成的四元式这一行的地址栏内容修改为即将生成的四元式序号序号q; q; (b)(b)生成四元式生成四元式 (q) (q) (j,_,_,Pj,_,_,P),),其中第四段的其中第四段的P P取自取自符号表的地址栏在修改前的内容,即形成一个需要符号表的地址栏在修改前的内容,即形成一个需要回填的链,不断重复回填的链,不断重复( (c)(dc)(d).).NAMENAMEINFORMATIONINFORMATIONCATCAT.定义否定义否地址地址.LL标号标号未未r r.(p) (j,_,_,0)(p) (j,_,
54、_,0)(q) (q) (j,_,_,pj,_,_,p) )(r) (r) (j,_,_,qj,_,_,q) )第四节第四节 控制语句的翻译控制语句的翻译v二、标号和转移语句二、标号和转移语句(GOTO)(GOTO)v2 2、先使用后定义、先使用后定义v(2)(2)翻译过程:翻译过程:v-e)-e)当定义性语句当定义性语句L:SL:S出现时,用出现时,用S S语句所对应的第一个语句所对应的第一个四元式序号回填这个链,即使用四元式序号回填这个链,即使用 BACKPATCHBACKPATCH过程。过程。v-注:此链表的链首在符号表的相应行的地址栏内。注:此链表的链首在符号表的相应行的地址栏内。v(
55、3)(3)形式化的语义子程序:形式化的语义子程序:v-产生式产生式 语义子程序语义子程序v- S - S gotogoto L L 程序程序1 1v-label i: -label i: 程序程序2 2v-查符号表:查符号表:v-若若L L不在表中,在表中建不在表中,在表中建L L这行,这行,CATCAT栏置标号,栏置标号,定义否填定义否填“未未”,地址为,地址为NXQ;GEN(j,_,_,0);NXQ;GEN(j,_,_,0);v-若若L L在表中,但未定义,则在表中,但未定义,则;P=L ;P=L 地址;地址; L.L.地址为地址为NXQ;GEN(j,_,_,pNXQ;GEN(j,_,_,
56、p);); - -若若L L在表中,已定义,则在表中,已定义,则:P=L.:P=L.地址;地址; GEN(j,_,_,pGEN(j,_,_,p);); - -v-查符号表:查符号表:v-若若L L不在表中,在表中建不在表中,在表中建L L这行,这行,CATCAT栏置标号,定义否栏置标号,定义否填填“已已”,地址为,地址为NXQ;NXQ;v-若若L L已在表中,但定义否填已在表中,但定义否填“已已”或或CATCAT标号,则出错;标号,则出错; -否则,否则, 将定义否改为将定义否改为“已已”; -q=L.-q=L.地址;地址; -BACKPATCH(q.NXQBACKPATCH(q.NXQ);)
57、; -L. -L.地址地址=NXQ;=NXQ; - -第四节第四节 控制语句的翻译控制语句的翻译v三、三、IFIF语句的翻译语句的翻译v1 1、描述、描述IFIF语句的文法语句的文法v-S if E then S-S if E then S(1)(1)v-S if E then S-S if E then S(1)(1) else S else S(2)(2)v2 2、IFIF语句的翻译语句的翻译v-(1)-(1)完成对布尔式完成对布尔式E E的翻译,获得一元四元式,并的翻译,获得一元四元式,并留下两个待续的语义值留下两个待续的语义值E EECEC,E EFC;FC;v-(2)-(2)扫描完扫
58、描完thenthen之后,就得到了之后,就得到了E E的真出口,用的真出口,用BACKPATCHBACKPATCH(E(EEC,NXQ)EC,NXQ)过程或填;过程或填;v-(3)-(3)翻译翻译S S(1)(1),它可能会是任何一种语句,总可以,它可能会是任何一种语句,总可以递归地调用语句翻译过程来完成,得到一组四元式递归地调用语句翻译过程来完成,得到一组四元式序列;序列;第四节第四节 控制语句的翻译控制语句的翻译v三、三、IFIF语句的翻译语句的翻译v2 2、IFIF语句的翻译语句的翻译v-(4)-(4)若遇到若遇到elseelse,表示,表示S S(1)(1)已翻译完,应无条件生已翻译完
59、,应无条件生成一条成一条GOTOGOTO四元式四元式(j,_,_,0)(j,_,_,0)转到转到S S(2)(2)语句后面,以语句后面,以示这个示这个IFIF语句已执行结束。但这个无条件转移语句语句已执行结束。但这个无条件转移语句究竟转到什么地方去究竟转到什么地方去, ,是不确定的是不确定的. .甚至在翻译完甚至在翻译完S S(2)(2)语句之后也不一定确定下来。遇到语句之后也不一定确定下来。遇到elseelse还表示已获还表示已获得得E E的假出口。的假出口。v例如:语句例如:语句v-if E-if E1 1 then if E then if E2 2 then S then S1 1 e
60、lse S else S2 2 else S else S3 3v注:由于转移指令的转移目标只能等到出口明朗了注:由于转移指令的转移目标只能等到出口明朗了才能回填。此时应把该待填的四元式序号并链后存才能回填。此时应把该待填的四元式序号并链后存在与代表整个语句的非终结符在与代表整个语句的非终结符S S相联系的语义栈相联系的语义栈 S SCHAINCHAIN中。中。第四节第四节 控制语句的翻译控制语句的翻译v三、三、IFIF语句的翻译语句的翻译v2 2、IFIF语句的翻译语句的翻译v(4)(4)若不遇到若不遇到elseelse,那么布尔式的假出口与,那么布尔式的假出口与S S(1)(1)的结的结束
61、出口都表示束出口都表示IFIF语句的结束。语句的结束。v(5)(5)翻译翻译S S(2)(2)语句成四元式序列。它执行过后也表示语句成四元式序列。它执行过后也表示IFIF语句应该结束了,它的结束出口和语句应该结束了,它的结束出口和S S(1)(1)是一样的,是一样的,可将它们出口并链,链首置于可将它们出口并链,链首置于S SCHAIN.CHAIN.v姑,条件语句翻译之后,除了生成相应姑,条件语句翻译之后,除了生成相应E,SE,S(1)(1),S,S(2)(2)的的四元式之外,还剩下一个待填语句链,链首在四元式之外,还剩下一个待填语句链,链首在 S SCHAINCHAIN中,出口明确后接此回填。
62、中,出口明确后接此回填。第四节第四节 控制语句的翻译控制语句的翻译v三、三、IFIF语句的翻译语句的翻译v3 3、改写产生式、改写产生式v S if E then SS if E then S(1)(1)else Selse S(2)(2)改写为:改写为:- C if E then- C if E then- T C S- T C S(1)(1)elseelse- S T S- S T S(2)(2) S if E then SS if E then S(1)(1)改写为:改写为:- C if E then- C if E then- S CS- S CS(1)(1)第四节第四节 控制语句的翻
63、译控制语句的翻译v三、三、IFIF语句的翻译语句的翻译v4 4、语义子程序、语义子程序vC if E then BACKPATCH(EC if E then BACKPATCH(EEC,NXQ);EC,NXQ); C CCHAIN=ECHAIN=EFC;FC; T CS T CS(1) (1) else q=NXQ;GEN(j,_,_,0);else q=NXQ;GEN(j,_,_,0); BACKPATCH(C BACKPATCH(CCHAIN,NXQ);CHAIN,NXQ); T TCHAIN=MERG(SCHAIN=MERG(S(1)(1)CHAIN,q)CHAIN,q) S TS S
64、TS(2) (2) SSCHAIN=MERG(TCHAIN=MERG(TCHAIN, SCHAIN, S(2)(2)CHAIN)CHAIN) S CS S CS(1) (1) SSCHAIN=MERG(TCHAIN=MERG(TCHAIN, SCHAIN, S(2)(2)CHAIN)CHAIN)第四节第四节 控制语句的翻译控制语句的翻译v例如:翻译无条件嵌套语句:例如:翻译无条件嵌套语句:vif a thenif a thenv if b then if b thenv A:=2 A:=2v else A:=3 else A:=3vELSE if c thenELSE if c thenv A
65、:=4 A:=4v Else A:=5 Else A:=5v翻译成四元式为:翻译成四元式为:(1)(jnz,a,_,0)(1)(jnz,a,_,0)(2)(j,_,_,0)(2)(j,_,_,0)(3)(jnz,b,_,0)(3)(jnz,b,_,0)(4)(j,_,_,0)(4)(j,_,_,0)(5)(:=,2,_,A)(5)(:=,2,_,A)(6)(j,_,_,0)(6)(j,_,_,0)(7)(:=,3,_,A)(7)(:=,3,_,A)(8)(j,_,_,0)(8)(j,_,_,0)第四节第四节 控制语句的翻译控制语句的翻译v(1)(jnz,a,_,0)(1)(jnz,a,_,0)
66、v(2)(j,_,_,0)(2)(j,_,_,0)v(3)(jnz,b,_,0)(3)(jnz,b,_,0)v(4)(j,_,_,0)(4)(j,_,_,0)v(5)(:=,2,_,A)(5)(:=,2,_,A)v(6)(j,_,_,0)(6)(j,_,_,0)v(7)(:=,3,_,A)(7)(:=,3,_,A)v(8)(j,_,_,0)(8)(j,_,_,0)(8)(j,_,_,6)(8)(j,_,_,6)(9)(jnz,c,_,11)(9)(jnz,c,_,11)(10)(j,_,_,13)(10)(j,_,_,13)(11)(:=,4,_,A)(11)(:=,4,_,A)(12)(j,
67、_,_,8)(12)(j,_,_,8)(13)(:=,5,_.A)(13)(:=,5,_.A)aS4(A:=5)bS1(A:=2)S2(A:=3)cS3(A:=4)1,23,49,101113751286TRUEFALSEif a then if b then A:=2 else A:=3ELSE if c then A:=4 Else A:=5第四节第四节 控制语句的翻译控制语句的翻译v四、四、WHILEWHILE语句的翻译语句的翻译v1 1、WHILEWHILE语句的文法语句的文法v S while E do SS while E do S(1)(1)v2 2、WHILE WHILE 语句
68、的翻译思想语句的翻译思想v(1)(1)翻译翻译E E代码段,并留两个待填的代码段,并留两个待填的E ETC,ETC,ETCTC链链v(2)(2)扫描过扫描过dodo之后,就可以回填之后,就可以回填E ETCTCv(3)(3)翻译翻译S S(1)(1)成代码段成代码段,S,S(1)(1)翻译之后,应无条件转到翻译之后,应无条件转到E E代码段的第一条四元式。代码段的第一条四元式。v:1)1)因此因此, ,开始翻译开始翻译whilewhile语句时,应留下第一条四语句时,应留下第一条四元式序号,以备元式序号,以备S S(1)(1)翻译之后用。翻译之后用。v 2)E2)E为假时需回填,此时为假时需回
69、填,此时E ETCTC作为作为S SCHAINCHAIN一部分,一部分,以便回填。以便回填。第四节第四节 控制语句的翻译控制语句的翻译v四、四、WHILEWHILE语句的翻译语句的翻译v3 3、改写产生式、改写产生式v S while E do SS while E do S(1)(1)改写为:改写为:v- W while- W whilev- W- Wd d WE do WE dov- S W- S Wd d S S(1)(1)第四节第四节 控制语句的翻译控制语句的翻译v4 4、语义子程序、语义子程序vW while WW while WQUAD=NXQQUAD=NXQvW Wd d WE
70、do BACKPATCH(E WE do BACKPATCH(EFC,NXQ);FC,NXQ);v- - W Wd dCHAINCHAIN=E=EFC;FC;v- - W Wd dQUADQUAD=W=WQUAD;QUAD;vS WS Wd dS S(1)(1) BACKPATCH(S BACKPATCH(S(1)(1)CHAIN,WCHAIN,Wd dQUAD);QUAD);v- - GEN(j,_,_,WGEN(j,_,_,Wd dQUADQUAD););v- S- SCHAIN= CHAIN= W Wd dCHAINCHAIN 第四节第四节 控制语句的翻译控制语句的翻译v例如:翻译例如:
71、翻译vWhile(AWhile(AB) doB) dovIf (CD) thenIf (CD) thenvX:=Y+Z;X:=Y+Z;v翻译为翻译为: : (100)(j,A,B,0)(100)(j,A,B,0)v (101)(j,_,_,0) (101)(j,_,_,0)v (102)(j,C,D,0) (102)(j,C,D,0)v (103)(j,_,_,(100) (103)(j,_,_,(100)v (104)(+,Y,Z,T (104)(+,Y,Z,T1 1) )v (105)(:=,T (105)(:=,T1 1,_,X),_,X)v (106)(j,_,_,(100) (106
72、)(j,_,_,(100)第四节第四节 控制语句的翻译控制语句的翻译v七、复合语句的翻译七、复合语句的翻译v1 1、文法、文法vS begin L endS begin L endvL SL SvL LL LS SS SvL LS S L L第四节第四节 控制语句的翻译控制语句的翻译v七、复合语句的翻译七、复合语句的翻译v2 2、语义子程序、语义子程序v(1)L S L(1)L S LCHAIN=SCHAIN=SCHAIN;CHAIN;v(2)L(2)LS S L BACKPATCH(L L BACKPATCH(LCHAIN,NXQ);CHAIN,NXQ);v(3)L L(3)L LS SS
73、LS LCHAIN=SCHAIN=SCHAIN;CHAIN;v(4)S begin L end(4)S begin L endv- BACKPATCH(L- BACKPATCH(LCHAIN,NXQ);CHAIN,NXQ);v- S- SCHAIN=0;CHAIN=0;第五节第五节 数组元素及其在赋值语句中的翻译数组元素及其在赋值语句中的翻译v一、数组及其下标变量地址的计算数组及其下标变量地址的计算v1 1、数组分类:、数组分类:v-一维数组,二维数组,多维数组一维数组,二维数组,多维数组v-确定数组,可变数组:确定数组,可变数组:v根据数组所需存储空间是否在编译时就已知道根据数组所需存储空间
74、是否在编译时就已知道v2 2、多维数组的存放、多维数组的存放v-按行存放按行存放v-按列存放(按列存放(FORTRAN)FORTRAN)v-只要知道数组的首地址,及每个数组元素占多少只要知道数组的首地址,及每个数组元素占多少内存单元,就可计算出任一数组元素的地址。内存单元,就可计算出任一数组元素的地址。v例如:例如:2 2维数组定义为:维数组定义为:v-ArrayL-ArrayL1 1:u:u1 1,L,L2 2:u:u2 2 v-令令d di i=u=ui i-L-Li+1i+1,i=1,2, ,i=1,2, 称为每一维尺寸称为每一维尺寸v-D=a+(i-D=a+(i1 1-L-L1 1)d
75、)d2 2+(i+(i2 2-L-L2 2)*/*m)*/*m为每个元素所占尺为每个元素所占尺寸寸* */ /v改写为改写为D=CONSPART+VARPARTD=CONSPART+VARPARTv-CONSPART=a-C-CONSPART=a-Cv C=(L C=(L1 1d d2 2+L+L2 2)*m)*mv-VARPART=(i-VARPART=(i1 1d d2 2+i+i2 2)*m)*mv:CONSPART:CONSPART称作不变部分,它和数组下标无关,称作不变部分,它和数组下标无关,只和各维尺寸和下界有关;只需计算一次,只和各维尺寸和下界有关;只需计算一次,其中其中C C在
76、编译时就可算出。在编译时就可算出。vVARPARTVARPART称作可变部分,它和数组下标有关,称作可变部分,它和数组下标有关,必须根据下标值,转换成相应代码,待运行必须根据下标值,转换成相应代码,待运行时计算出。时计算出。第五节第五节 数组元素及其在赋值语句中的翻译数组元素及其在赋值语句中的翻译v一、数组及其下标变量地址数组及其下标变量地址的计算的计算v3 3、编译程序对数组说明的、编译程序对数组说明的处理处理v当遇到数组说明时,必须把当遇到数组说明时,必须把数组的有关信息记录在一张数组的有关信息记录在一张“内情向量内情向量”表中,以便以表中,以便以后计算数组下标变量地址时后计算数组下标变量
77、地址时引用这些信息。引用这些信息。v内情向量表的结构:内情向量表的结构: 一维数,各维上下界,首地一维数,各维上下界,首地址,类型址,类型L1u1d1L2u2d2.LnundnnCtypea第五节第五节 数组元素及其在赋值语句中的翻译数组元素及其在赋值语句中的翻译v一、数组及其下标变量地址的计算数组及其下标变量地址的计算v3 3、编译程序对数组说明的处理、编译程序对数组说明的处理v1)1)对于确定的数组来说:内情向量可登记在编译时对于确定的数组来说:内情向量可登记在编译时的符号表中;的符号表中;v2)2)对于可变数组来说:对于可变数组来说:v(1)(1)内情向量在编译时无法知道,只有在运行时才
78、能内情向量在编译时无法知道,只有在运行时才能算出来;算出来;v因此,编译程序必须为可变数组设置一个存储空间,因此,编译程序必须为可变数组设置一个存储空间,以便运行对建立相应的内情向量表。以便运行对建立相应的内情向量表。v(2)(2)这样这样, ,就必须在编译时为运行程序准备好调用的就必须在编译时为运行程序准备好调用的运行子程序,我们不作讨论。运行子程序,我们不作讨论。第五节第五节 数组元素及其在赋值语句中的翻译数组元素及其在赋值语句中的翻译v二、确定数组的数组元素引用的中间代码形式二、确定数组的数组元素引用的中间代码形式v1 1、访问数组元素可设想为:、访问数组元素可设想为:v把它的把它的VA
79、RPARTVARPART计算在某一变址单元计算在某一变址单元T T中,用中,用CONSPARTCONSPART作为作为“基础基础”。然后以变址方式访问存储。然后以变址方式访问存储单元单元-CONPARTT,-CONPARTT,静态数组静态数组CONSPART=a-C,CCONSPART=a-C,C可以可以从内情向量表中查到,而从内情向量表中查到,而a a在运行时一定可确定下来,在运行时一定可确定下来,所以可以生成所以可以生成a-Ca-C代码,待运行时再确定。假定代码,待运行时再确定。假定T T1 1是是用于存放用于存放CONSPARTCONSPART的临时单元,的临时单元,T T1 1=a-C
80、=a-C那么用那么用T T1 1TT表示数组元素的地址表示数组元素的地址第五节第五节 数组元素及其在赋值语句中的翻译数组元素及其在赋值语句中的翻译v三、按行存放的赋值语句中的数组元素的翻译三、按行存放的赋值语句中的数组元素的翻译v2 2、访问数组元素、访问数组元素v引用数组元素:引用数组元素:v-(= = ,T T1 1,T,_,X),T,_,X)v: :这是一个变址取数组四元式。这是一个变址取数组四元式。v含义相当于含义相当于 X=TX=T1 1T.T.v对数组元素赋值:对数组元素赋值:v-( =,X,_,T =,X,_,T1 1T)T)v: :这是一个变址存数四元式。含义相当于:这是一个变
81、址存数四元式。含义相当于:T T1 1J=XJ=X第五节第五节 数组元素及其在赋值语句中的翻译数组元素及其在赋值语句中的翻译v三、按行存放的赋值语句中的数组元素的翻译三、按行存放的赋值语句中的数组元素的翻译v1 1、文法、文法v-A V:=E-A V:=Ev-V -V iElist|iiElist|iv-ElistElist Elist,E|EElist,E|Ev-E E op E|(E)|V/*op-E E op E|(E)|V/*op表示各种算术运算表示各种算术运算* */ /v:V V可以是简单变量也可以是下标变量可以是简单变量也可以是下标变量. .v这个递归定义可形成数组嵌套数组结构这
82、个递归定义可形成数组嵌套数组结构. .第五节第五节 数组元素及其在赋值语句中的翻译数组元素及其在赋值语句中的翻译v三、按行存放的赋值语句中的数组元素的翻译三、按行存放的赋值语句中的数组元素的翻译v2 2、文法改写、文法改写v-A V:=E-A V:=Ev-V -V Elist|IElist|Iv-ElistElist Elist(1),E|iE Elist(1),E|iEv-E -E EopE|(E)|VEopE|(E)|Vv注:把数组名注:把数组名i i和最左下标表达式写在一起就表示为和最左下标表达式写在一起就表示为数组数组i i开始计算第一个下标,同时使我们在整个下标开始计算第一个下标,同
83、时使我们在整个下标串串ElistElist的翻译过程中随时都能知道数组的翻译过程中随时都能知道数组i i的符号表的符号表入口地址及表中相应信息。入口地址及表中相应信息。第五节第五节 数组元素及其在赋值语句中的翻译数组元素及其在赋值语句中的翻译v三、按行存放的赋值语句中的数组元素的翻译三、按行存放的赋值语句中的数组元素的翻译v3 3、相关语义变量和函数过程、相关语义变量和函数过程v语义变量:语义变量:v-ARRAY:-ARRAY:数组名在符号表的入口地址数组名在符号表的入口地址v-DIM-DIM:数组下标维数计数器:数组下标维数计数器v-PLACE:-PLACE:语义变量,在符号表入口地址或临时
84、变量的序号语义变量,在符号表入口地址或临时变量的序号v-OFFSET:-OFFSET:v 简单变量:简单变量:OFFSET=nullOFFSET=nullv 下标变量:下标变量:OFFSETOFFSET保存已计算出的保存已计算出的VARPARTVARPART第五节第五节 数组元素及其在赋值语句中的翻译数组元素及其在赋值语句中的翻译v三、按行存放的赋值语句中的数组元素的翻译三、按行存放的赋值语句中的数组元素的翻译v3 3、相关语义变量和函数过程、相关语义变量和函数过程v函数过程:函数过程:v-LIMITARRAY,K:-LIMITARRAY,K:通过符号表查内情向量表,返通过符号表查内情向量表,
85、返回第回第k k维的尺寸维的尺寸dkdkv-HEADARRAY:-HEADARRAY:取得数组首地址取得数组首地址a,a,或查内情向量表,或查内情向量表,或等运行时分配得到或等运行时分配得到v-CONSARRAY:-CONSARRAY:查内情向量表查内情向量表, ,得得C C值值v-TYPEARRAY:-TYPEARRAY:查内情向量表查内情向量表TYPETYPE项,返回一个数项,返回一个数组元素,占有的字单元数组元素,占有的字单元数m m值。值。第五节第五节 数组元素及其在赋值语句中的翻译数组元素及其在赋值语句中的翻译v三、按行存放的赋值语句中的数组元素的翻译三、按行存放的赋值语句中的数组元
86、素的翻译4 4、语义子程序、语义子程序-(1)A V:=E-(1)A V:=E-IF(-IF(V VOFFSET=null()OFFSET=null() GEN(=, GEN(=,E EPLACe,_,VPLACe,_,VPLACEPLACE););-ELSE-ELSE- - GEN( =,EGEN( =,EPLACE,_,VPLACE,_,V PLACEVPLACEVOFFSET)OFFSET)第五节第五节 数组元素及其在赋值语句中的翻译数组元素及其在赋值语句中的翻译v三、按行存放的赋值语句中的数组元素的翻译三、按行存放的赋值语句中的数组元素的翻译v4 4、语义子程序、语义子程序(2)E E
87、(2)E E(1)(1)op Eop E(2) (2) T=NEWTEMP;T=NEWTEMP; GEN(op,E GEN(op,E(1)(1)PLACE,EPLACE,E(2)(2)PLACE,T);PLACE,T); E EPLACE=TPLACE=T(3)E (E(3)E (E(1)(1) E) EPLACE=EPLACE=E(1)(1)PLACEPLACE(4)E V IF(4)E V IF(V VOFFSET=null)OFFSET=null)- E- EPLACE=VPLACE=VPLACE;PLACE;- ELSE- ELSE- T=NEWTEMP;- T=NEWTEMP;- -
88、 GEN(= ,EGEN(= ,EPLACEVPLACEVOFFSET,_,T);OFFSET,_,T);- E- EPLACE=T; PLACE=T; 第五节第五节 数组元素及其在赋值语句中的翻译数组元素及其在赋值语句中的翻译v(5)V (5)V ElistElist IF IF(TYPEARRAY1)(TYPEARRAY1)v- T=NEWTEMP;- T=NEWTEMP;v- GEN(*,- GEN(*,EListEListPLACE,TYPEARRAY,TPLACE,TYPEARRAY,T););v- - ElistElistPLACEPLACE=T;=T;v- V- VOFFSET=
89、OFFSET=ElistElistPLACEPLACE; ;v- T=NEWTEMP;- T=NEWTEMP;v- GEN(_,HEADARRAY,CONSARRAY,T);- GEN(_,HEADARRAY,CONSARRAY,T);v- V- VPLACE=TPLACE=Tv(6)V i V(6)V i VPLACE=PLACE=ENTRYiENTRYi;v- V- VOFFSET=nullOFFSET=null第五节第五节 数组元素及其在赋值语句中的翻译数组元素及其在赋值语句中的翻译v4 4、语义子程序、语义子程序v(7)Elist Elist(7)Elist Elist(1)(1),E
90、 T=NEWTEMP;,E T=NEWTEMP;v- K=Elist- K=Elist(1)(1)DIMT1;DIMT1;v- - d dk k=LIMIT(Elist=LIMIT(Elist(1)(1)ARRAY,k);ARRAY,k);v- GEN(*,Elist- GEN(*,Elist(1)(1)PLACE,dPLACE,dk k,T);,T);v- T1=NEWTEMP;- T1=NEWTEMP;v- GEN(+,T,E - GEN(+,T,E PLACE,TPLACE,T1 1););v- - ElistElistARRAYARRAY=Elist=Elist(1)(1)ARRAY;
91、ARRAY;v- - ElistElistPLACEPLACE=T=T1 1; ;v- - ElistElistDIMDIM=K;=K;第五节第五节 数组元素及其在赋值语句中的翻译数组元素及其在赋值语句中的翻译v4 4、语义子程序、语义子程序v(8)Elist (8)Elist iEiEv- - ElistElistPLACEPLACE=E=EPLACE;PLACE;v- - ElistElistDIMDIM=1;=1;v- - ElistElistARRAYARRAY= =ENTRY(iENTRY(i)第五节第五节 数组元素及其在赋值语句中的翻译数组元素及其在赋值语句中的翻译v例如:数组说明
92、为:例如:数组说明为:ARRAY1:10,1:20;ARRAY1:10,1:20;且从内情向量表查得数组首地址为且从内情向量表查得数组首地址为a,a,C=21,dC=21,d2 2=20,m=1=20,m=1为为X:=AI,JX:=AI,J生成四元式序列:生成四元式序列:解:四元式序列为:解:四元式序列为:-(1)(*,I,20,T-(1)(*,I,20,T1 1) )-(2)(+,T-(2)(+,T1 1,J,T,J,T2 2) )-(3)(-,a,21,T-(3)(-,a,21,T3 3) )-(4)(= ,T-(4)(= ,T3 3TT2 2,_,T,_,T4 4) )-(5)(:=,T
93、-(5)(:=,T4 4,_,X),_,X)第六节第六节 过程调用语句过程调用语句v一、过程调用过程调用v1 1、过程、过程v-定义和调用过程是程序语言的主要特征之一,过程是模定义和调用过程是程序语言的主要特征之一,过程是模块化程序设计的主要手段,同时也是节省程序代码和扩充语块化程序设计的主要手段,同时也是节省程序代码和扩充语言能力的主要途径。言能力的主要途径。v2 2、过程调用、过程调用v-实质是把程序控制转到子程序实质是把程序控制转到子程序. .v3 3、过程调用中遇到的问题:、过程调用中遇到的问题:v-子程序完成后如何回到主调程序;子程序完成后如何回到主调程序;v-子程序回到主调程序时,
94、运行环境的恢复;子程序回到主调程序时,运行环境的恢复;v-如何进行参数传递;如何进行参数传递;第六节第六节 过程调用语句过程调用语句v二、参数传递二、参数传递v1 1、参数、参数v-实在参数实在参数v-形式参数形式参数v2 2、传递方式、传递方式v1)1)传地址(传地址(call by reference);call by reference);把实在参数的地址把实在参数的地址传递给相应的形式参数。传递给相应的形式参数。v2)2)传值传值(call by value):(call by value):把实在参数的值计算出来把实在参数的值计算出来传递给相应的形式参数。传递给相应的形式参数。v3)
95、3)传名(传名(call by call by name):ALGOLname):ALGOL 60 60所定义的一种特所定义的一种特殊的形殊的形实参结合方式。实参结合方式。第六节第六节 过程调用语句过程调用语句v二、参数传递二、参数传递v3 3、传地址、传地址v1)1)基本方式基本方式vA)A)若实参是一个变量(包括下标变量),则直接传若实参是一个变量(包括下标变量),则直接传递它的地址;递它的地址;vB)B)若实参是一个常数或其他表达式,就把值计算出若实参是一个常数或其他表达式,就把值计算出来并存放在某临时单元,然后传递这个临时单元的来并存放在某临时单元,然后传递这个临时单元的地址。地址。第
96、六节第六节 过程调用语句过程调用语句v二、参数传递二、参数传递v3 3、传地址、传地址v2)2)传址过程传址过程vA)A)当程序控制转入被调用过程之后,被调用段首先当程序控制转入被调用过程之后,被调用段首先把实地址从连接数据区中读入形参单元中。把实地址从连接数据区中读入形参单元中。v-注:若已直接传至形参单元,不做此步。注:若已直接传至形参单元,不做此步。vB)B)在过程体内,对形参的任何引用或赋值都被看作在过程体内,对形参的任何引用或赋值都被看作对新参单元的间接访问,这间接赋值将直接修改实对新参单元的间接访问,这间接赋值将直接修改实参单元的内容。参单元的内容。第六节第六节 过程调用语句过程调
97、用语句v二、参数传递二、参数传递v4 4 、传值、传值v调用时把实在参数的值计算出来,把值直接传递给调用时把实在参数的值计算出来,把值直接传递给形式单元中,在过程体内应用这些单元不会修改实形式单元中,在过程体内应用这些单元不会修改实质单元的值。质单元的值。v5 5、传名、传名v过程调用相当于把调用段的过程代替调用语句,并过程调用相当于把调用段的过程代替调用语句,并且过程体内形参名皆用相应的实参名代替。且过程体内形参名皆用相应的实参名代替。第六节第六节 过程调用语句过程调用语句v三、过程调用语句的翻译(传址)三、过程调用语句的翻译(传址)v1 1、文法、文法v-S call -S call i(
98、Arglisti(Arglist) )v-ArglistArglist Arglist,EArglist,Ev-ArglistArglist E Ev2 2、相关四元式、相关四元式v1)(par,_,_,T)1)(par,_,_,T)v-含义是:将参数含义是:将参数T T传递到一个公共的区域或直接传递到过传递到一个公共的区域或直接传递到过程的形参单元程的形参单元v2)(jsr,_,n,S)2)(jsr,_,n,S)v-含义是:转移指令,转移到含义是:转移指令,转移到S S过程的四元式入口序号。过程的四元式入口序号。第六节第六节 过程调用语句过程调用语句v三、过程调用语句的翻译(传址)三、过程调
99、用语句的翻译(传址)v(1)S call (1)S call i(Arglisti(Arglist) )v- n=0;- n=0;v- for(- for(队列队列ArglistArglistQUEUEQUEUE中的每个中的每个P)P)v- - GEN(par,_,_,PGEN(par,_,_,P););v- n=n+1;- n=n+1;v- - GEN(jsr,_,n,ENTRY(iGEN(jsr,_,n,ENTRY(i)v(2)Arglist Arglist(1) E(2)Arglist Arglist(1) Ev- - 把把E EPLACEPLACE添加入添加入Arglist(1) Ar
100、glist(1) QUEUE QUEUE 末端;末端;v- - ArglistArglistQUEUEQUEUE=Arglist(1)=Arglist(1)QUEUEQUEUE第六节第六节 过程调用语句过程调用语句v例如:过程调用:例如:过程调用:CALL S(A+B,Z)CALL S(A+B,Z)v译为:译为:v- K(+,A,B,T)- K(+,A,B,T)v- K+1(par,_,_,T)- K+1(par,_,_,T)v- K+2(par,_,_,Z)- K+2(par,_,_,Z)v- K+3(jsr,_,2,S)- K+3(jsr,_,2,S)第九节第九节 自上而下分析的制导的翻译
101、自上而下分析的制导的翻译v一、自上而下分析的制导的翻译一、自上而下分析的制导的翻译v 通过推导自左而右地产生句子的各终结符号,再通过推导自左而右地产生句子的各终结符号,再按产生式推导的过程添加语义子程序,无需得到侯按产生式推导的过程添加语义子程序,无需得到侯选式匹配完后,即不必改写文法。选式匹配完后,即不必改写文法。v注:注:1)1)在按产生式推导的中间任何一步都可以添加在按产生式推导的中间任何一步都可以添加语义子程序,所以不必改写文法。语义子程序,所以不必改写文法。v2)2)实际上,程序设计语言绝大部分均可使用自上而实际上,程序设计语言绝大部分均可使用自上而下分析并生成相应中间代码。下分析并
102、生成相应中间代码。v二、自上而下分析制导翻译种类二、自上而下分析制导翻译种类 1 1、递归下降分析制导翻译、递归下降分析制导翻译 2 2、LL(1)LL(1)分析制导翻译分析制导翻译第十节第十节 中间代码的其它形式中间代码的其它形式v一、后缀表示法(逆波兰表示法)一、后缀表示法(逆波兰表示法)v1 1、后缀表示法的文法、后缀表示法的文法v- - :=:=| | - - :=:= - - :=+|-|*|/:=+|-|*|/ - -注:这种表示法不带括号,根据运算量和运算符出注:这种表示法不带括号,根据运算量和运算符出现的先后位置,以及每个运算符的目数,就完全决定了现的先后位置,以及每个运算符的
103、目数,就完全决定了一个表达式的计算程序。一个表达式的计算程序。第十节第十节 中间代码的其它形式中间代码的其它形式v后缀表示法的特点:后缀表示法的特点:-(1)-(1)运算量的排列顺序与中缀表示法相同;运算量的排列顺序与中缀表示法相同;-(2)-(2)远算量是按运算的顺序排列的;远算量是按运算的顺序排列的;-(3)-(3)运算符紧跟在被云酸的对象之后出现。运算符紧跟在被云酸的对象之后出现。-注:它显然不符合人的习灌,但队计算机来注:它显然不符合人的习灌,但队计算机来说,很容易使用一个栈来计算它的值,或转说,很容易使用一个栈来计算它的值,或转换成另一种代码。换成另一种代码。第十节第十节 中间代码的
104、其它形式中间代码的其它形式v二、语法制导产生后缀式二、语法制导产生后缀式v首先,除了堆栈外,为分析过程设置一个一首先,除了堆栈外,为分析过程设置一个一维数组维数组POSTPOST来存放后缀式;初始时,其下标来存放后缀式;初始时,其下标K K为为1 1。v然后,利用算符优先分析法然后,利用算符优先分析法第十节第十节 中间代码的其它形式中间代码的其它形式v二、语法制导产生后缀式二、语法制导产生后缀式1 1、利用算符优先分析法进行语法分析、利用算符优先分析法进行语法分析语义子程序语义子程序产生式产生式 语义子程序语义子程序(1)E E(1)E E(1)(1)opEopE(2)(2) POSTK= P
105、OSTK=op;kop;k=k+1;=k+1;(2)E (E(2)E (E(1)(1) ) (3)E i POSTK=(3)E i POSTK=ENTRY(i);kENTRY(i);k=k+1;=k+1;例如:假定算符优先分析表已选好,对表达式例如:假定算符优先分析表已选好,对表达式A*(B+C)#A*(B+C)#翻译成后缀式翻译成后缀式步骤步骤下推栈下推栈输入串输入串后缀式后缀式0 0# #A*(B+C)#A*(B+C)#1 1#E#E*(B+C)#*(B+C)#A A2 2#E*#E*(B+C)#(B+C)#A A3 3#E*(#E*(B+C)#B+C)#A A4 4#E*(E#E*(E+
106、C)#+C)#ABAB5 5#E*(E+#E*(E+C)#C)#ABAB6 6#E*(E+E#E*(E+E)#)#ABC+ABC+7 7#E*(E#E*(E)#)#ABC+ABC+8 8#E*(E)#E*(E)# #ABC+ABC+9 9#E*E#E*E# #ABC+ABC+1010#E#E# #ABC+*ABC+*第十节第十节 中间代码的其它形式中间代码的其它形式v二、语法制导产生后缀式二、语法制导产生后缀式v2 2、后缀表示法的计值和产生中间代码、后缀表示法的计值和产生中间代码v1)1)计值过程:至左至右扫描后缀式,没碰到运算量计值过程:至左至右扫描后缀式,没碰到运算量就将其入栈,每遇到就
107、将其入栈,每遇到K K目运算符就将它作用于栈顶的目运算符就将它作用于栈顶的k k项,并将运算结果来代替这项,并将运算结果来代替这k k项。项。v-例如:例如:ab+cab+c* *v2)2)产生四元式过程:自左至右扫描后缀式,每碰到产生四元式过程:自左至右扫描后缀式,每碰到运算量就将其入栈,每遇到运算量就将其入栈,每遇到k k目运算符就将它作用于目运算符就将它作用于栈顶的栈顶的K K项,并生成相应的中间代码,以结果的临时项,并生成相应的中间代码,以结果的临时变量序号代替该栈顶的变量序号代替该栈顶的k k项。项。第十节第十节 中间代码的其它形式中间代码的其它形式v二、语法制导产生后缀式二、语法制
108、导产生后缀式v3 3、后缀式的推广、后缀式的推广v方法:遵守运算符紧跟在被作用的运算量之后。方法:遵守运算符紧跟在被作用的运算量之后。v例如例如:(1) :(1) 赋值语句赋值语句A:=E,A:=E,后缀式为:后缀式为:AE:=AE:=(2)(2)转向语句转向语句GOTO L,GOTO L,后缀式为:后缀式为:LjmpLjmp-其中其中LL是指示器,用是指示器,用POSTPOST中的下标值表示。中的下标值表示。(3)(3)条件语句条件语句 if xy then m:=x else m:=y;if xy then m:=x else m:=y;其后其后缀值为:缀值为:12345678910 11
109、 12 13 14xy11 jez m x:= 14 jmy:= .vBegin k:=100;L:if ki+j;goto L end else k:=i2-j2 i:=0; End.1 234 5 6 7891011 121314151617k 100 := k i j +20jez kkl-:=4j18 19 20 21 22 23 24 25 26 27 28 29 30 31 3229 jki2j2-:= i0:= v注:翻译成后缀式时也存在拉链回填的问题注:翻译成后缀式时也存在拉链回填的问题小结1 1、算术表达式及赋值语句翻译、算术表达式及赋值语句翻译2 2、控制语句中布尔表达式翻译、控制语句中布尔表达式翻译-留有真、假出口留有真、假出口-回填过程与并链函数回填过程与并链函数3 3、标号和转移语句翻译、标号和转移语句翻译4 4、IFIF语句的翻译语句的翻译5 5、WHILEWHILE语句的翻译语句的翻译6 6、语法制导生成后缀式(逆波兰表达式)、语法制导生成后缀式(逆波兰表达式)