1
给出下面表达式的逆波兰后缀
a ∗ ( − b + c ) a*(-b+c) a∗(−b+c)
ab-c+*
a + b ∗ ( c + d / e ) a+b*(c+d/e) a+b∗(c+d/e)
abcde/+*+
− a + b ∗ ( − c + d ) -a+b*(-c+d) −a+b∗(−c+d)
a - b c - d + * +
n o t A o r n o t ( C o r n o t D ) not\ A\ or\ not\ (C\ or\ not\ D) not A or not (C or not D)
A not C D not or not or
( A a n d B ) o r ( n o t C o r D ) (A\ and\ B)\ or\ (not\ C\ or\ D) (A and B) or (not C or D)
A B and C not D or or
( A o r B ) a n d ( C o r n o t D a n d E ) (A\ or\ B)\ and\ (C\ or\ not\ D\ and\ E) (A or B) and (C or not D and E)
A B or C D not E and or and
i f ( x + y ) ∗ z = 0 t h e n ( a + b ) ↑ c e l s e a ↑ b ↑ c if\ (x + y)*z = 0\ then\ (a+b)↑c\ else\ a↑b↑c if (x+y)∗z=0 then (a+b)↑c else a↑b↑c
x y + z * 0 = a b + c ↑ a b c ↑ ↑ if-then-else
4
写出下面的赋值语句的自下而上语法制导翻译过程和三地址代码
A : = B ∗ ( − C + D ) A:=B*(-C+D) A:=B∗(−C+D)
步骤 | 规约 | 输入串 | 产生式 | 三地址代码 |
---|---|---|---|---|
1 | # | A:=B*(-C+D)# | ||
2 | #id | :=B*(-C+D)# | ||
3 | #id:= | B*(-C+D)# | ||
4 | #id:=id | *(-C+D)# | ||
5 | #id:=E | *(-C+D)# | E → i d E\rightarrow id E→id | |
6 | #id:=E* | (-C+D)# | ||
7 | #id:=E*( | -C+D)# | ||
8 | #id:=E*(- | C+D)# | ||
9 | #id:=E*(-id | +D)# | ||
10 | #id:=E*(-E | +D)# | E → i d E\rightarrow id E→id | |
11 | #id:=E*(E | +D)# | E → I E E\rightarrow IE E→IE | T 1 : = − C T_1:=-C T1:=−C |
12 | #id:=E*(E+ | D)# | ||
13 | #id:=E*(E+id | )# | ||
14 | #id:=E*(E+E | )# | E → i d E\rightarrow id E→id | |
15 | #id:=E*(E | )# | E → E 1 + E 2 E\rightarrow E_1+E_2 E→E1+E2 | T 2 : = T 1 + D T_2:=T_1+D T2:=T1+D |
16 | #id:=E*(E) | # | ||
17 | #id:=E*E | # | E → ( E ) E\rightarrow (E) E→(E) | |
18 | #id:=E | # | E → E 1 ∗ E 2 E\rightarrow E_1*E_2 E→E1∗E2 | T 3 : = B ∗ T 2 T_3:=B*T_2 T3:=B∗T2 |
19 | #S | # | S → i d : = E S\rightarrow id:=E S→id:=E | A : = T 3 A:=T_3 A:=T3 |
5
7.3.2
将赋值语句翻译为三地址代码
A : [ i , j ] : = B [ i , j ] + C [ A [ k , j ] ] + d [ i + j ] A:[i,j]:=B[i,j]+C[A[k,j]]+d[i+j] A:[i,j]:=B[i,j]+C[A[k,j]]+d[i+j]
设A, B为m*n的数组
C和D大小为n
数据宽度为4
T 1 : = i × n T 1 : = T 1 + j T 2 : = A − 4 ( n + 1 ) d T 3 : = 4 × T 1 T 4 : = i × n T 4 : = T 4 + j T 5 : = B − 4 ( n + 1 ) T 6 : = 4 × T 4 T 7 : = T 5 [ T 6 ] T 8 : = K × n T 8 : = T 8 + 1 T 9 : = A − 4 ( n + 1 ) T 10 : = 4 × T 8 T 11 : = T 9 [ T 10 ] T 12 : = C − 4 T 13 : = 4 × T 11 T 14 : = T 12 [ T 13 ] T 15 : = T 7 + T 14 T 16 : = i + j T 17 : = D − 4 T 18 : = 4 × T 16 T 19 : = T 17 [ T 18 ] T 20 : = T 15 + T 19 T 2 [ T 3 ] : = T 20 T_1 := i \times n\\ T_1:=T_1 + j \\ T_2:= A-4(n+1)d \\ T_3 := 4\times T_1 \\ T_4:= i\times n \\ T_4 := T_4 + j \\ T_5 :=B-4(n+1) \\ T_6:=4\times T_4\\ T_7:=T_5[T_6]\\ T_8 := K\times n\\ T_8 := T_8 + 1\\ T_9 := A-4(n+1)\\ T_{10} := 4\times T_8\\ T_{11} := T_9[T_{10}]\\ T_{12} := C-4\\ T_{13} := 4 \times T_{11}\\ T_{14} := T_{12}[T_{13}]\\ T_{15}:= T_7+T_{14}\\ T_{16}:=i+j\\ T_{17}:=D-4\\ T_{18}:=4\times T_{16}\\ T_{19}:=T_{17}[T_{18}]\\ T_{20}:=T_{15}+T_{19}\\ T_2[T_3]:=T_{20} T1:=i×nT1:=T1+jT2:=A−4(n+1)dT3:=4×T1T4:=i×nT4:=T4+jT5:=B−4(n+1)T6:=4×T4T7:=T5[T6]T8:=K×nT8:=T8+1T9:=A−4(n+1)T10:=4×T8T11:=T9[T10]T12:=C−4T13:=4×T11T14:=T12[T13]T15:=T7+T14T16:=i+jT17:=D−4T18:=4×T16T19:=T17[T18]T20:=T15+T19T2[T3]:=T20
6
7.4.2 写出A or (B and not (C or D))
的四元式序列
标号 | 四元式 |
---|---|
100 | ( jnz, A, -, 0 ) |
101 | ( j, -, -, 102 ) |
102 | ( jnz, B, -, 104 ) |
103 | ( j, -, -, 0 ) |
104 | ( jnz, C, -, 0 ) |
105 | ( j, -, -, 106 ) |
106 | ( jnz, D, -, 0 ) |
107 | ( j, -, -, 0 ) |
真出口107与100
假出口 103 104 106
7
7.5.1 翻译成四元式
while A < C and B < D do
if A = 1 then C := C + 1 else
while A <= D do A := A + 2
标号 | 四元式 |
---|---|
100: | (j<,A,C,102) |
101: | (j,-,-,115) |
102: | (j<,B,D,104) |
103: | (j,-,-,115) |
104: | (j=,A,‘1’,106) |
105: | (j,-,-,109) |
106: | (+,C,‘1’,T1) |
107: | (:=,T1,-,C) |
108: | (j,-,-,100) |
109: | (j≤,A,D,111) |
110: | (j,-,-,100) |
111: | (+,A,‘2’,T2) |
112: | (:=,T2,-,A) |
113: | (j,-,-,109) |
114: | (j,-,-,100) |
115: |
8
改写bool式的语义动作
ϵ \epsilon ϵ
E → id1 < id2{
E.truelist := makelist(nextquad + 1);
E.falselist := makelist(nextquad);
emit('j >=' ',' id1.place ',' id2.place ',' '0');
}
E → id1 > id2{
E.truelist := makelist(nextquad + 1);
E.falselist := makelist(nextquad);
emit('i <=' ',' id1.place ',' id2.place ',' '0');
}
M → ϵ {
emit('j, -, -, 0');
M.quad = nextquad;
}
其余内容和原来相同
11
C的for语句
f o r ( E 1 ; E 2 ; E 3 ) S for(E_1;E_2;E_3)S for(E1;E2;E3)S
意义如下
E1;
while(E2) do begin
S;
E3;
end
构造属性文法和翻译模式,把for语句翻译为三地址代码
S → ET{
T.next = S.next;
S.code = E.code || T.code;
}
T → while E do F{
T.begin = newlabel;
E.true = newlabel;
E.false = T.next;
F.next = T.begin;
T.code = gen(T.begin ':') || E.code || gen(E.true ':') || F.code || gen('goto' T.begin)
}
F → SE {
E.next = F.next;
F.code = S.code || E.code
}
S → E{
E.next = S.next;
S.code = E.code
}
15
文法包含了对文字串表的定义
P → D ; E D → D ; D ∣ i d : T T → l i s t o f T ∣ c h a r ∣ i n t e g e r E → ( L ) ∣ l i t e r a l ∣ n u m ∣ i d L → E , L ∣ E P \rightarrow D;E\\ D\rightarrow D;D | id:T\\ T\rightarrow list\ of\ T|char|integer\\ E\rightarrow(L)|literal|num|id \\ L\rightarrow E,L|E P→D;ED→D;D∣id:TT→list of T∣char∣integerE→(L)∣literal∣num∣idL→E,L∣E
设计翻译模式确定表达式E和表L的类型
P → D ; E D → D ; D D → i d : T { a d d t y p e ( i d . e n t r y , T . t y p e ) } T → c h a r { T . t y p e = c h a r } T → i n t e g e r { T . t y p e = i n t e g e r } T → l i s t o f T { T . t y p e = l i s t ( T . t y p e ) } E → ( L ) { E . t y p e = l i s t ( L . t y p e ) } E → l i t e r a l { E . t y p e = c h a r } E → n u m { E . t y p e = i n t e g e r } E → i d { E . t y p e = s e a r c h ( i d . e n t r y ) } L → E , L 1 { i f ( E . t y p e = L 1 . t y p e ) t h e n ( L . t y p e = E . t y p e ) e l s e ( L . t y p e = e r r o r ) } L → E { L . t y p e = E . t y p e } P \rightarrow D;E\\ D\rightarrow D;D \\ D\rightarrow id:T \quad \{addtype(id.entry, T.type)\}\\ T\rightarrow char\quad\{T.type = char\}\\ T\rightarrow integer\quad\{T.type = integer\}\\ T\rightarrow list\ of\ T\quad\{T.type = list(T.type)\}\\ E\rightarrow (L)\quad\{E.type = list(L.type)\}\\ E\rightarrow literal\quad \{E.type=char\}\\ E\rightarrow num\quad \{E.type=integer\}\\ E\rightarrow id\quad \{E.type=search(id.entry)\}\\ L\rightarrow E, L_1\quad \{if(E.type = L_1.type) \\ then (L.type = E.type) else (L.type = error)\}\\ L\rightarrow E\{L.type = E.type\} P→D;ED→D;DD→id:T{
addtype(id.entry,T.type)}T→char{
T.type=char}T→integer{
T.type=integer}T→list of T{
T.type=list(T.type)}E→(L){
E.type=list(L.type)}E→literal{
E.type=char}E→num{
E.type=integer}E→id{
E.type=search(id.entry)}L→E,L1{
if(E.type=L1.type)then(L.type=E.type)else(L.type=error)}L→E{
L.type=E.type}