《hCh7语义分析和中间代码产生IISpring课件》由会员分享,可在线阅读,更多相关《hCh7语义分析和中间代码产生IISpring课件(26页珍藏版)》请在金锄头文库上搜索。
1、下面要讨论的是只含整型变量的简单赋值句的翻译。它的文法描述: Ai:=E EE+E|E*E|-E|(E)|i (7.1) 非终结符A代表“赋值句”。该文法虽然是一个二义性文法,但接受通常对于算符的结合性和优先级的规定,即二义性可以克服。hCh7语义分析和中间代码产生IISpringNEWTEMP: 函数过程。每次调用时,它都回送一个代表新临时变量名的整数码作为函数值。ENTRY(i):函数过程。E.PLACE: 和非终结符E相联系的语义变量,它表示存放E值的变量名在符号表的入口或者整数码(若为临时变量)。GEN(OP,ARG1,ARG2,RESULT): 语义过程,把四元式(OP,ARG1,A
2、RG2,RESULT)填入四元式表。hCh7语义分析和中间代码产生IISpring(1)Ai:=E GEN(:=, E.PLACE, _, ENTRY(i)(2)EE(1)+E(2) E.PLACE:=NEWTEMP;(3) GEN(+, E(1).PLACE, E(2).PLACE, E.PLACE)(3) EE(1)*E(2) E.PLACE:=NEWTEMP; GEN(*, E(1).PLACE, E(2).PLACE, E.PLACE)(4)E-E(1) E.PLACE:=NEWTEMP; GEN(, E(1).PLACE, _, E.PLACE)(5)E(E(1) E.PLACE:=
3、E(1).PLACE(6)Ei E.PLACE:= ENTRY(i) hCh7语义分析和中间代码产生IISpring示例A := - B * ( C + D )EEEEEEEA12345678hCh7语义分析和中间代码产生IISpring输入栈PLACE四元式A:=-B*(C+D)-B*(C+D)B*(C+D)*(C+D)*(C+D)i:=i:=-i:=-ii:=-Ei:=Ei:=E*i:=E*(i:=E*(ii:=E*(Ei:=E*(E+i:=E*(E+ii:=E*(E+E*(C+D)(C+D)C+D)+D)+D)D)i:=E*(Ei:=E*(E)i:=E*Ei:=EA:=-B*(C+D)i
4、AA_A_A_BA_BA_T1A_T1_A_T1_A_T1_CA_T1_CA_T1_C_A_T1_C_DA_T1_C_DA_T1_T2A_T_T2_A_T1_T2A_T3(, B, _, T1)(+, C, D, T2)(*, T1, T2, T3)(:=, T3, _, A)hCh7语义分析和中间代码产生IISpring前面假定了所有i都是整型。实际上,在一个表达式中可能出现各种不同类型的变量和常数。编译程序或者拒绝混合运算,或者产生有关类型转换的指令。例如:令文法7.1允许混合类型。那么,在进行混合运算时,首先要将整型量转换为实型量。而要进行转换,其前提是对每一个VN必须有类型信息语义变量
5、E.TYPE。因此,对应的产生式要附加关于E.TYPE的语义规则。hCh7语义分析和中间代码产生IISpring语义规则: IF E(1).TYPE = int AND E(2).TYPE = int THEN E.TYPE := int ELSE E.TYPE := r语义动作的增加,意味着语义子程序的修改,必要时能够产生对运算量进行类型转换的四元式。 ( itr, A1, _, T)将整型量A1转换成实型量T。 hCh7语义分析和中间代码产生IISpring输入串为 X := Y + I * JX,Y为实型,I,J 为整型。四元式: ( *i , I , J , T1) ( itr , T
6、1, _ , T2) ( +r, Y , T2 , T3) ( :=, T3 , _ , X)运算符要指出相称的类型,说明是定点还是浮点运算。*ihCh7语义分析和中间代码产生IISpring关于产生式 E E(1) op E(2) 在上述语法规则中,非终结符E的语义值E.TYPE必须保存在翻译栈中。 如果运算量类型增多,语义子程序必须区别的情形很快增多,从而使语义子程序累赘不堪。hCh7语义分析和中间代码产生IISpring布尔表达式E是由布尔算符(,)作用于布尔变量或关系表达式而形成的。关系表达式形式 E1 rop E2rop是关系算符,E1和E2是算术表达式。hCh7语义分析和中间代码产
7、生IISpring文法: EEE|EE|E|(E)|i|i rop i (7.2)布尔算符的优先顺序:,。、服从左结合。所有关系算符的优先级相同,高于任何布尔算符,低于任何算术算符。关系算符不得结合,如 ABC不合法。hCh7语义分析和中间代码产生IISpring布尔表达式E在语言中的用途: 计算逻辑值 X:=ABD 条件表达式 WHILE ABD DO S IF ABD THEN S1 ELSE S2hCh7语义分析和中间代码产生IISpring布尔表达式的求值1 通常算法:与算术表达式的计算过程一样,一步一步地计算出各部分的值,进而计算出整个表达式的值。2 采用优化措施 AB if A t
8、hen true else B AB if A then B else false A if A then false else truehCh7语义分析和中间代码产生IISpring说明上述两种计算方法对于不包含布尔函数调用的式子是没有什么差别的。仅当遇到布尔函数调用并且这种函数调用会引起副作用时,上述两种算法不等价。hCh7语义分析和中间代码产生IISpring对于第一种方法而言,可以如同翻译算术表达式一样来翻译布尔表达式。ABC=D 翻译成 = C D T1 B T1 T2 A T2 T3 第二种方法是本节主要内容,下面将详细讨论。hCh7语义分析和中间代码产生IISpring 一.IF
9、语句的四元式结构 二.翻译的困难和解决办法 三.E的文法和语义子程序 四.例hCh7语义分析和中间代码产生IISpring例 IF ABD THEN S1 ELSE S2E的结构从整体上,E对外只能转向两个目标。转向E为假时的目标转向E为真时的目标(1) (1) (jnz,A,_,5)(jnz,A,_,5)(2) (j,_,_,3)(2) (j,_,_,3)(3) (3) (j,B,D,5)(j,B,D,5)(4) (4) (j,_,_,p+1)(j,_,_,p+1)(5) (5) (p)(p)(p+1(p+1) )(q)(q)S1S1(j,_,_,q)(j,_,_,q)S2S2 下一语句下一
10、语句 hCh7语义分析和中间代码产生IISpring 1.1.困难困难 转移的目标在对它的引用之后才出现; (j,_,_,0)(j,_,_,0) E可以很复杂,上面的情况可以频繁出现。(1) (1) (jnz,A,_,5)(jnz,A,_,5)(2) (j,_,_,3)(2) (j,_,_,3)(3) (3) (j,B,D,5)(jEEEE|E|(E)|i|i rop i (7.3) G2 E-E E|EE|E|(E)|i|i rop i E -E E-E (7.4)hCh7语义分析和中间代码产生IISpring 2. 2.语义动作语义动作jrophCh7语义分析和中间代码产生IISpring 用自下而上语法分析方法,语法制导翻译生成ABD的四元式。hCh7语义分析和中间代码产生IISpringhCh7语义分析和中间代码产生IISpring