注:至于怎么填这个表请参见上一页中的PPT,这里不再赘述,Action表中si代表跳转到第i个状态,ri代表选择文法中第i条规则进行归约,acc代表接受,即分析成功。Goto表中数字i代表跳转到第i个状态。 (3)对accd#进行分析 步骤 1 2 3 4 5 6 7 8 9 #0 #0a2 #0a2c5 #0a2c5c5 #0a2c5c5d6 #0a2c5c5A10 #0a2c5A10 #0a2A4 #0E1 分析栈 accd# ccd# cd# d# # # # # # 输入串 s2 s5 s5 s6 r4 r3 r3 r1 acc 操作 8、写出表达式或者程序的中间形式 逆波兰式和四元式是三地址代码的两种记录表现形式,当然表示形式还有三元式、间接三元式等等,根据老师的意思应该不考,四元式和逆波兰式必考。
(1)逆波兰表达式
逆波兰表达式即后缀表达式,就是中缀表达式(也就是我们一般看到的表达式形式)对应的后续遍历结果,这个方法有很多,个人认为搞清楚运算优先级,观察一下就可写出,先算谁就将其对应的操作数写出,运算符放在后面就行很简单: 例如:写出下列各式的逆波兰表示 (1) -a-(b*c/(c-d) + (-b)*a) (2) -A+B*C↑ (D/E)/F
解: (1) a@bc*cd-/b@a*+ - (2) A@BCDE/↑*F/+ 注:@代表负号“-”
(2)四元式
四元式形式如下(op,arg1,arg2,Result)从左至右分别代表运算符,第一操作数,第二操作数,运算结果。
如:A + B * ( C - D ) + E / ( C - D ) ^N 对应的四元式序列如下: 四元式 : (1) ( - ,C ,D,T1 ) (2) ( * ,B,T1,T2) (3) ( + ,A,T2,T3) (4) ( - ,C,D,T4)
(5) ( ^ ,T4,N,T5) (6)( / ,E ,T5,T6)
(7) ( + ,T3 ,T6 ,T7)
注:T1,T2等等位存放结果的临时变量。
条件语句等四元式的表示
(jnz , a ,-- , p ) 表示 if a goto p
(jrop, x , y, p ) 表示 if x rop y goto p(rop代表关系运算符,如<,>等等)
(j , --, --- , p ) 表示 goto p
例如:写出条件语句 IF a>0 THEN x:=x+1 ELSE x:=4*( x- 1) 四元式序列
17 / 21
解:
(1)( j > , a ,0 ,(3)) (2)( j , -, -,(6)) (3)(+,x , 1 , T1) (4)( := , T1,-, T2 ) (5)(j ,-, -,(9)) (6)( -, x,1, T3) (7) (*, 4 ,T3 ,T4 ) (8) ( := , T4 ,-,x) (9) 注意:(5)和(9)不能写丢,否则一分没有!上述四元式中第二第三个位置的“-”代表没有元素。
其实四元式就是对上述程序进行解释,如果满足则跳转到哪里执行,不满足则跳转到哪里执行,大家自己分析一下,应该能够看懂。 考题:根据要求写出下列表达式的中间形式。
(1)5+6*(a+b)写出表达式的逆波兰式 逆波兰表达式为:56ab+*+ (2) if x > y then { y:=y-1; x:=y*z+10 } else x:= z + y 写出上述代码的四元式 或者三址码。 (有的试卷上问法是写出下列表达式三地址形式的中间表示,答案一样) 答案(1) (0)(j>,x,y,(2)) (1)(j,-,-,(8)) (2)(-,y,1,T1) (3)(:=,T1,-,y) (4)(*,y,z,T2) (5)(+,T2,10,T3) (6)( :=,T3,-,x) (7)(j,-,-,(10)) (8)(+,z,y,T4) (9)( :=,T4,-,x) (10) 答案(2) 100: if x>y goto 102 101: goto 108 102: T1:=y-1 103: y:=T1 104: T2:=y*z 105: T3:=T2+10 106: x:=T3 107: goto 110 108: T4:=z+y 109: x:=T4 110: 注意:同上题,本题答案加红色的部分此外上述编号随意,从0开始也行从100开始也行。不能丢,否则一分没有!
9、参数传递
这种题目很简单,是送分题,一定要做对!
参数传递方式分为三种,值传递,地址传递和传名。
值传递过程中形参值的改变不会影响实参值的改变,地址传递形参值的改变导致对应是实参值的改变,传名传递类似于C语言中的宏展开,将实参原封不动的替换相应的形参(文字替换)。 请看下题:
(1) 高级语言程序中常用的参数传递方式有哪些?请根据这些传递方式写出程序的运
行结果。
18 / 21
int main() {
int a=2; int b=3; p(a,a,a);
相关推荐: