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 + * +
not A or not (C or not 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 and B) or (not C or 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 or B) and (C or not D and 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
if (x+y)∗z=0 then (a+b)↑c else a↑b↑cif\ (x + y)*z = 0\ then\ (a+b)↑c\ else\ a↑b↑cif (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→idE\rightarrow idE→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→idE\rightarrow idE→id | |
| 11 | #id:=E*(E | +D)# | E→−EE\rightarrow -EE→−E | T1:=−CT_1:=-CT1:=−C |
| 12 | #id:=E*(E+ | D)# | ||
| 13 | #id:=E*(E+id | )# | ||
| 14 | #id:=E*(E+E | )# | E→idE\rightarrow idE→id | |
| 15 | #id:=E*(E | )# | E→E1+E2E\rightarrow E_1+E_2E→E1+E2 | T2:=T1+DT_2:=T_1+DT2:=T1+D |
| 16 | #id:=E*(E) | # | ||
| 17 | #id:=E*E | # | E→(E)E\rightarrow (E)E→(E) | |
| 18 | #id:=E | # | E→E1∗E2E\rightarrow E_1*E_2E→E1∗E2 | T3:=B∗T2T_3:=B*T_2T3:=B∗T2 |
| 19 | #S | # | S→id:=ES\rightarrow id:=ES→id:=E | A:=T3A:=T_3A:=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 low默认为d
T1:=i×nT1:=T1+jT2:=A−4d(n+1)T3:=4×T1T4:=i×nT4:=T4+jT5:=B−4d(n+1)T6:=4×T4T7:=T5[T6]T8:=k×nT8:=T8+jT9:=A−4d(n+1)T10:=4×T8T11:=T9[T10]T12:=C−4dT13:=4×T11T14:=T12[T13]T15:=T7+T14T16:=i+jT17:=D−4dT18:=4×T16T19:=T17[T18]T20:=T15+T19T2[T3]:=T20
T_1 := i \times n\\
T_1:=T_1 + j \\
T_2:= A-4d(n+1) \\
T_3 := 4\times T_1 \\
T_4:= i\times n \\
T_4 := T_4 + j \\
T_5 :=B-4d(n+1) \\
T_6:=4\times T_4\\
T_7:=T_5[T_6]\\
T_8 := k\times n\\
T_8 := T_8 + j\\
T_9 := A-4d(n+1)\\
T_{10} := 4\times T_8\\
T_{11} := T_9[T_{10}]\\
T_{12} := C-4d\\
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-4d\\
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−4d(n+1)T3:=4×T1T4:=i×nT4:=T4+jT5:=B−4d(n+1)T6:=4×T4T7:=T5[T6]T8:=k×nT8:=T8+jT9:=A−4d(n+1)T10:=4×T8T11:=T9[T10]T12:=C−4dT13:=4×T11T14:=T12[T13]T15:=T7+T14T16:=i+jT17:=D−4dT18:=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, -, 103 ) |
| 105 | ( j, -, -, 106 ) |
| 106 | ( jnz, D, -, 104 ) |
| 107 | ( j, -, -, 100 ) |
真出口107与100(形成truelist)
假出口 103 104 106(形成了falselist链子)
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ϵ
改写bool式的语义动作
ϵ\epsilonϵ
E → E1 or M E2 { backpatch(E1.flist, M.quad);
E.tlist := merge(E1.tlist, M.tlist, E2.tlist);
E.flist := E2.flist }
E → E1 and N E2 { backpatch(E1.tlist, N.quad);
E.flist := merge(E1.flist, E2.flist);
E.tlist := E2.tlist }
E → id1 relop id2 { E.tlist := NULL;
E.flist := makelist(nextquad);
if relop.op = ‘>’ then emit(‘j<=’’,’ id1.place’,’id2.place’,’’0’);
else if relop.op = ‘>=’ then emit(‘j<’’,’ id1.place’,’id2.place’,’’0’);
else if relop.op = ‘<’ then emit(‘j>=’’,’ id1.place’,’id2.place’,’’0’);
else if relop.op = ‘<=’ then emit(‘j>’’,’ id1.place’,’id2.place’,’’0’);
else if relop.op = ‘=’ then emit(‘j<>’’,’ id1.place’,’id2.place’,’’0’);
else if relop.op = ‘<>’ then emit(‘j=’’,’ id1.place’,’id2.place’,’’0’);
else error }
M → ϵ {
emit('j, -, -, 0');
M.quad = nextquad;
}
N → ε { N.quad = nextquad;}
其余内容和原来相同
其余内容和原来相同
11
C的for语句
for(E1;E2;E3)Sfor(E_1;E_2;E_3)Sfor(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;ED→D;D∣id:TT→list of T∣char∣integerE→(L)∣literal∣num∣idL→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;ED→D;DD→id:T{addtype(id.entry,T.type)}T→char{T.type=char}T→integer{T.type=integer}T→list of T1{T.type=list(T1.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}
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_1\quad\{T.type = list(T_1.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 T1{T.type=list(T1.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}
1303

被折叠的 条评论
为什么被折叠?



