编译原理个人作业--第七章——基于 编译原理 国防工业出版社 第三版

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 abc

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 idEid
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 idEid
11#id:=E*(E+D)#E→−EE\rightarrow -EEET1:=−CT_1:=-CT1:=C
12#id:=E*(E+D)#
13#id:=E*(E+id)#
14#id:=E*(E+E)#E→idE\rightarrow idEid
15#id:=E*(E)#E→E1+E2E\rightarrow E_1+E_2EE1+E2T2:=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_2EE1E2T3:=B∗T2T_3:=B*T_2T3=BT2
19#S#S→id:=ES\rightarrow id:=ESid:=EA:=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:=A4d(n+1)T3:=4×T1T4:=i×nT4:=T4+jT5:=B4d(n+1)T6:=4×T4T7:=T5[T6]T8:=k×nT8:=T8+jT9:=A4d(n+1)T10:=4×T8T11:=T9[T10]T12:=C4dT13:=4×T11T14:=T12[T13]T15:=T7+T14T16:=i+jT17:=D4dT18:=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 PD;EDD;Did:TTlist of TcharintegerE(L)literalnumidLE,LE

设计翻译模式确定表达式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\} PD;EDD;DDid:T{addtype(id.entry,T.type)}Tchar{T.type=char}Tinteger{T.type=integer}Tlist of T1{T.type=list(T1.type)}E(L){E.type=list(L.type)}Eliteral{E.type=char}Enum{E.type=integer}Eid{E.type=search(id.entry)}LE,L1{if(E.type=L1.type)then(L.type=E.type)else(L.type=error)}LE{L.type=E.type}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值