编译作业答案.docx
- 文档编号:23623159
- 上传时间:2023-05-19
- 格式:DOCX
- 页数:16
- 大小:38.60KB
编译作业答案.docx
《编译作业答案.docx》由会员分享,可在线阅读,更多相关《编译作业答案.docx(16页珍藏版)》请在冰豆网上搜索。
编译作业答案
7-2给定文法G:
SAa|Ab|c
AAd|Se|f
请消除文法的左递归,并提取公共左因子。
解:
(1)消除文法G的②产生式直接左递归。
A→SeA'|fA'③
A'→dA'|④
(2)消除间接左递归:
按S.A排序(按算法i=2,j=1时)将S的①产生式代入③有
A→AaeA'|AbeA'|ceA'|fA'⑤
(3)消除⑤的直接左递归有
A→ceA'A"|fA'A"⑥
A"→aeA'A"|beA'A"|⑦
(4)对S的①产生式提公因子有
S→AB|c⑧
B→|a|b⑨
(5)最后,文法G提取公因子,消除左递归后的产生式由⑧,⑨,⑥,⑦和④组成,无
多余的产生式。
(6)若按A.S排序,得到的产生式组合是另外的形式,但它们是等价的文法。
7-3给定文法G:
S(L)|a
LL,S|S
消除文法G的左递归,并写出递归下降分析的相应递归过程。
解:
消除左递归后,得文法G':
S→(L)|a
L→SL'
L'→,SL'|
递归下降过程:
procedureadvance()
begin
sym=getchar()
end
procedureS;
begin
ifsym='a'thenadvance()
elseifsym='('then
begin
advance()
L();
ifsym=')'thenadvance()elseerror()
end
else
error()
end
procudureL;
beginS;
L';
end
procudureL';
begin
ifsym=','thenbegin
advance()
S;
L'
end
end
7-5解:
(1)G'(S):
S→AS'
S'→:
AS'|
A→BA'
A'→+BA'|
B→bS*|a
(2)FIRST集和FOLLOW集
FIRST
FOLLOW
S
b,a
#,*
S'
:
,
#,*
A
b,a
#,*,:
A'
+,
#,*,:
B
b,a
#,*,:
,+
预测分析表
a
:
+
b
*
#
S
S→AS'
S→AS'
S'
S'→:
AS'
S'→
S'→
A
A→BA'
A→BA'
A'
A→
A→+BA'
A→
A→
B
B→a
B→bS*
(3)因为预测分析表无多重定义入口,所以G'是LL
(1)文法。
7-6解:
对习题7-3的文法G消除左递归后,得文法G':
S→(L)|a
L→SL'
L'→,SL'|
FIRST集和FOLLOW集
FIRST
FOLLOW
S
(,a
),’,#
L
(,a
)
L'
’,
)
预测分析表
(
)
a
#
S
S→(L)
S→a
L
L→SL'
L→SL'
L'
L'→)
L'→,SL'
因为预测分析表无多重定义入口,所以文法G是LL
(1)文法。
8-1
已知文法G:
SAB
AAb|bB
Ba|Sb
(1)写出bBABb的规范推导。
(2)画出bBABb的语法树。
(3)求bBABb的短语、直接短语、句柄和最左素短语。
解:
(1)规范规范推导(最右推导)最右推导SABASbAABbbBABb
(2)语法树(推导树)
(3)短语bB,AB,ABb,bBABb
直接短语bB,AB
句柄bB
最左素短语bB
8-2
已知文法G:
SSbF|F
FFaP|P
Pc
(1)试证明FaPbc是文法G的一个句型。
(2)画出FaPbc的语法树。
(3)求出FaPbc的短语、直接短语、句柄和最左素短语。
解:
(1)因为存在推导SSbFFbFFaPbFFaPbPFaPbc
所以FaPbc是文法G的一个句型。
(2)语法树
(3)短语FaP,c,FaPbc
直接短语FaP,c
句柄FaP
最左素短语FaP
8-3
已知文法G:
SAS|b
ASA|a
(1)列出G的LR(0)项目集规范族。
(2)这个文法是LR(0)文法吗?
是SLR
(1)文法吗?
若是,请构造出相应的分析表。
解:
拓广文法
0.S'→S
1.S→AS
2.S→b
3.A→SA
4.A→a
LR(0)项目集规范族
I0=closure{S'→·S}I1=GO(I0,S)I2=GO(I0,A)I3=GO(I0,b)
I0:
S'→·SS'→S·S→A·SS→b·
S→·ASA→S·AS→·AS
S→·bA→·SAS→·b
A→·SAA→·aA→·SA
A→·aS→·ASA→·a
S→·b
I4=GO(I0,a)I5=GO(I1,A)I6=GO(I1,S)I7=GO(I2,S)
A→a·A→SA·A→S·AS→AS·
S→A·SA→·SAA→S·A
S→·ASA→·bA→·SA
S→·bS→·ASA→·a
A→·SAS→·bS→·AS
A→·aS→·GO(I1,b)=I3GO(I2,a)=I4GO(I1,a)=I4GO(I2,A)=I2GO(I2,b)=I3
FOLLOW(S)={a,b,#}FOLLOW(A)={a,b}
∵状态5在输入a时有S4和r3的移进归约矛盾。
状态5在输入b时有S3和r3的移进归约矛盾。
状态7在输入a时有S4和r1的移进归约矛盾。
状态7在输入b时有S3和r1的移进归约矛盾。
∴文法G既不是LR(0)文法,也不是SLR
(1)文法。
8-7
设有文法G:
SAB
BcBd|cd
AaAb|ab
它是否为SLR
(1)文法?
若是,请构造相应的SLR
(1)分析表。
解:
0.S'→SFOLLOW(S)={$}
1.S→ABFOLLOW(A)={b,c}
2.B→cBdFOLLOW(B)={d,$}
3.B→cd
4.A→aAb
5.A→ab
I0=closure{S'→·S}
I0:
S'→·SI4=GO(I2,B)I9=GO(I5,d)
S→·ABS→AB·B→cd·
A→·aAbI5=GO(I2,c)I10=GO(I6,b)
A→·abB→c·BdA→aAb·
I1=GO(I0,S)B→·cBdI11=GO(I8,d)
S'→S·B→·cBdB→cBd·
I2=GO(I0,A)B→c·d
S→A·BI6=GO(I3,A)
B→·cBdA→aA·b
B→·cdGO(I3,a)=I3
I3=GO(I0,a)I7=GO(I3,b)
A→a·AbA→ab·
A→a·bI8=GO(I5,B)
A→·aAbB→cB·d
A→·abGO(I5,c)=I5
上述状态集没有移进—归约冲突,(a)是SLR文法,分析表如下:
a
b
c
d
$
S
A
B
0
S3
1
2
1
acc
2
S5
4
3
S3
S7
6
4
r1
5
S5
S9
8
6
S10
7
r5
r5
8
S11
9
r3
r3
10
r4
r4
11
r2
r2
8-9
设有文法G:
PP(F)|F
FabFda|a
(1)试求每个非终结符的FIRSTVT集和LASTVT集。
(2)试构造文法G的优先关系表。
解:
(1)FIRSTVT(P)={a,(}LASTVT(P)={a,)}
FIRSTVT(F)={a}LASTVT(F)={a}
(2)优先关系表:
9-4
对下列翻译方案:
SPS{print“1”}
SPQ{print“2”}
Pa{print“3”}
QbR{print“4”}
QdQ{print“5”}
Rc{print“6”}
当输入串为“aaadb”时,翻译结果是什么?
解:
结果为333645211。
9-5
试写出语句
ifC
=y+2*z的翻译过程。
解:
(1)E1→C (2)W→whileW·code=102(101)(j,-,-,103) (3)E2→A>BE2·F=103(102)(>,A,B,104) (4)E1→E*EE1·VAL=T1(103)(j,-,-,0) (5)E2→E+EE2·VAL=T2(104)(*,2,z.T1) (6)A→i: =E2A·chain=0(105)(+,y,T1,T2) (7)S→AS1·chain=0(106)(: =,T2,-,x) (8)S→WS1S1·chain=103(107)(j,-,-,102) (9)S→ifE1thenS1S·chain=101 9-6 9-7试写出语句 fori: =1toNdoS1的语义子程序。 其语义为 i: =1; again: ifiNthenbegin S1; i: =i+1; gotoagain end 原文法 S→fori: =1toNdoS1 改写为 F→fori: =1toNdo S→FS1 F→fori: =1toNdo {F.place: =entry(i); emit(: =,’1’,-F.place)); F.again: =ip;//F+1 emit(j,entry(i),N,F.again+2); F.CHAIN: =ip;//F+2 emit(j,-,-,0)} S→FS1 {backpatch(S1.CHAIN,ip); emit(+,F.place,’1’,F.place); emit(j,-,-,F.again); S.CHAIN: =F.CHAIN} 9-8试写出repeat语句的语义子程序。 其语义为 again: S1; …. B.T: ifBgoto0 B.F: gotoagain 原文法 S→repeatS1untilB 改写为 S→RB R→PS1until P→repeat 翻译方案: P→repeat {P.CODE: =ip} R→PS1until {backpatch(S1.CHAIN,ip); R.CODE: =P.CODE} S→RB {backpatch(B.F,R.CODE); S1.CHAIN: =B.T} 回边 7→4 9→1 10→7 10-1 有如下三地址代码序列: (1)readx(10)B: =y+j (2)ready(11)ifA=Bgoto(6) (3)ifx =y+i (4)readi(13)ifA>Bgoto(16) (5)readj(14)writeB (6)ifi>jgoto(9)(15)goto(9) (7)A: =i+1(16)A: =x*j (8)goto(10)(17)goto(10) (9)A: =x*j (a)请划分基本块,构造程序流图。 (b)根据必经结点找出回边及由回边组成的循环。 解: (a)基本块程序流图 B1 (1)~(3) B2(4) B3(5) B4(6) B5(7)~(8) B6(9) B7(10)~(11) B8(12)~(13) B9(14)~(15) B10(16)~(17) (b)必经结点 D (1)={1}D (2)={1,2}D(3)={1,3} D(4)={1,3,4}D(5)={1,3,4,5}D(6)={1,3,4,6} D(7)={1,3,4,7}D(8)={1,3,4,7,8}D(9)={1,3,4,7,8,9} D(10)={1,3,4,7,8,10} 由回边7→4组成的循环{7,4,5,6,8,10}。 10-2 试将下面的程序段划分为基本块,构造其程序流图,并进行优化。 (1)C: =100 (2)A: =0 (3)B: =10 (4)A: =A+B (5)ifB Cthengoto(8) (6)B: =B+10 (7)goto(4) (3)优化结果 (3)B: =10 (4)A: =A+8 (5)ifB≥100thengoto(8) (6)B: =B+10 (7)goto(4) (8)writeA (8)writeA 解: (1)基本块 (2)程序流图 B1 (1)~(3) B2(4)~(5) B3(6)~(7) B4(8) 10-7 对下列中间代码: (1)t1: =b+c(4)t4: =e*f (2)t2: =a-c(5)t5: =t3+t4 (3)t3: =d+1(6)s: = /t5 用简单代码生成方法生成目标代码,可用寄存器为R0,R1。 解: MOVbR0 ADDR0c MOVaR1 SVBR1R0 MOVR0t1 MOVdR0 ADDR01 MOVR1t2 MOVeR1 MVLR1f ADDR0R1 MOVt2R1 DIVR1R0
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 作业 答案