编译原理作业参考答案.docx
《编译原理作业参考答案.docx》由会员分享,可在线阅读,更多相关《编译原理作业参考答案.docx(16页珍藏版)》请在冰豆网上搜索。
编译原理作业参考答案
编译原理作业参考答案
作业一
一、是非题
1.(×)2.(×)3.(×)4.(×)5.(×)6.(√)7.(√)8.(√)9.(√)10.(×)11.(√)12.(√)13.(√)
二、填空题
1.(词法分析),(语法分析),(中间代码生成),(代码优化),(目标代码生成)
2.(单词符号),(语法单位)。
3.(源程序),(单词符号)
4.(语法),(语义)
5.(词法分析)、(语法分析)、(语义分析),(中间代码产生),(代码优化),(目标代码生成)
6.(解释方式)
7.(语法规则)
8.(上下文无关文法)
9.(自上而下分析法),(自下而上分析法)
10.(规范推导)
11.(最左归约)
三、名词解释题:
1.词法分析器-----执行词法分析的程序。
2.自编译方式------先对语言的核心部分构造一个小小的编译程序,再以它为工具构造一个能够编译更多语言成分的较大编译程序。
如此扩展下去,就像滚雪球一样,越滚越大,最后形成人们所期待的整个编译程序。
3.遍-----所谓“遍”就是对源程序或中间结果长头到尾扫描一次,并作有关的加工处理,生成新的中间结果或目标程序。
4.编译程序-----一种翻译程序:
能够把某一种语言程序(称为源语言程序)转换成另一种语言(成为目标程序),而后着与前者在逻辑上是等价的。
5.超前搜索-----所谓超前搜索是在词法分析过程中,有时为了确定词性,需超前扫描若干个字符。
6.短语------令G是一个文法,S划文法的开始符号,假定αβδ是文法G的一个句型,如果有S
αAδ且A
β,则称β是句型αβδ相对非终结符A的短语。
7.规范句型------由规范推导所得到的句型。
8.句柄------一个句型的最左直接短语。
9.-规范推导-----最右推导又称为规范推导。
四、简答题:
1.正规式a(a|b)*。
2.(a*b|b*a)={a,b,ab,ba,aab,bba……}
3.状态转换图是一张有限方向图。
在状态转换图中,有一个初态,至少一个终态。
(用双圈表示)。
一个状态转换图可用于识别(或接受)一定的字符串。
4.证明:
因为
L(b(ab)*)={b}{,ab,abab,ababab,…}
={b,bab,babab,bababab,…}
L(ba)*b)={,ba,baba,bababa,…}{b}
={b,bab,babab,bababab,…}
=L(b(ab)*)
所以,b(ab)*=(ba)*b
5.正规表达式为b(a|b)*aa
6.词法分析器的功能输入源程序,按照构词规则分解成一系列单词符号。
7.词法分析是编译过程中的一个阶段,在语法分析前进行。
词法分析作为一遍,可以简化设计,改进编译效率,增加编译系统的可移植性。
也可以和语法分析结合在一起作为一遍,由语法分析程序调用词法分析程序来获得当前单词供语法分析使用。
8.编译预处理:
滤掉空格,跳过注释、换行符等。
9.
句子adccd的分析过程:
步骤
符号栈
输入串
产生式
0
#S
adccd#
1
#AB
adccd#
S→BA
2
#AAa
adccd#
B→aA
3
#AA
dccd#
4
#Ad
dccd#
A→d
5
#A
ccd#
6
#SB
ccd#
A→BS
7
#Sc
ccd#
B→c
8
#S
cd#
9
#AB
cd#
B→c
10
#Ac
d#
11
#A
d#
12
#d
d#
A→d
13
#
#
10.一个文法G别是LL
(1)文法的充要条件是:
(1)FIRST(α)∩FIRST(β)=Ф
(2)如果β=*>ε,FIRST(α)∩FOLLOW(A)=Ф
11.
(1)消除左递归
S→aFS’|*aFS’
S’→*aFS’|ε
F→+aF|+a
(2)提公共左因子
S→aFS’|*aFS’
S’→*aFS’|ε
F→+aF’
F’→F|ε
12.句子b(aa)b的规范归约过程:
步骤
符号栈
输入串
动作
0
#
b(aa)b#
预备
1
#b
(aa)b#
移进
2
#b(
aa)b#
移进
3
#b(a
a)b#
移进
4
#b(A
a)b#
归约
5
#b(Ma
)b#
移进
6
#b(Ma)
b#
移进
7
#b(B
b#
归约
8
#bA
b#
归约
9
#bAb
#
移进
10
#S
#
接受
五、计算题:
1.
(1)画出句型对应的语法树。
句型(S,(a))的语法树如下图所示
(2)句子(a,(a,a)的最左推导
S=>(L)=>(L,S)=>(S,S)=>(a,S)=>(a,(L))=>(a,(L,S))=>(a,(S,S))=>(a,(a,S))=>(a,(a,a))
2.G[S]:
S→A|BD
D→CD|A
A→1|3|5|7|9
B→2|4|6|8|A
C→B|0
3.证明:
因为文法G[S]存在句子aa有两个不同的最左推导,所以文法G[S]是是二义性的。
S=>SaS=>SaSaS=>aSaS=>aaS=>aa
S=>SaS=>aS=>aSaS=>aaS=>aa
4.所求文法是G[S]:
S→AB
A→aAc|D
D→bD|b
B→aBb|aabb
5.
⑴消除左递,文法变为G’[S]:
S→^|a|(T)'
T→ST’|S
T’→,ST’|ε
此文法无左公共左因子。
⑵构造相应的FIRST和FOLLOW集合:
FIRST(S)={a,^,(},FOLLOW(S)={#,,,)}
FIRST(T)={a,^,(},FOLLOW(T)={}}
FIRST(T’)={,,ε},FOLLOW(F)={)}
⑶构造预测分析表:
a
^
(
)
#
S
S→a
S→^
S→(T)'
T
T→ST’
T→ST’
T→ST’
T’
T’→ε
T’→,ST’
作业二
一、是非题
1.(√)2.(×)3.(√)4.(×)5.(√)6.(×)7.(×)8.(√)9.(√)10.(√)
二、填空题:
1.(综合属性),(继承属性)
2.(语义规则)
3.(综合)
4.(后缀式)、(四元式)、(三元式)、(间接三元式)
5.(静态语义检查)
三、名词解释题:
1.语法制导翻译――在语法分析过程中,根据每个产生式所对应的语义程序进行翻译的方法叫做语法制导翻译。
2.属性文法-----属性文法是在上下文无关文法的基础上,为每个文法符号(终结符或非终结符)配备相关的“值”(称为属性)。
这些属性代表与文法相关信息。
3.语义规则-----对于文法的每一个产生式都配置了一组属性的计算规则,称为语义规则。
4.综合属性-----在语法树中,一个结点的综合属性的值由其子结点的属性值确定。
通常使用自底向上的方法在每一个结点处使用语义规则计算综合属性的值。
5.继承属性-----在语法树中,一个结点的继承属性由此结点的父结点和/或兄弟结点的某些属性确定。
6.素短语------素短语是指这样一个短语,至少含有一个终结符,并且,除它自身外不再含任何更小的素短语。
四、简答题:
1.静态语义检查通常包括:
(1)类型检查;如果操作符作用于不相容的操作数,编译程序必须报告出错信息。
(2)控制流检查;控制流语句必须使控制转移到合法的地方,如果不存在包括它的这样的语句,应报错。
(3)一致性检查;在很多场合要地象只能被定义一次。
(4)相关名字检查。
同一名字必须出现两次或多次。
2.程序可以直接翻译为目标语言代码,但是许多编译程序却采用了独立于机器的、复杂性介于源语言和机器语言之间的中间语言.这样的好处是:
(1)无关的代码优化工作;
(2)程序改变目标机更容易;
(3)程序的结构在逻辑上更为简单明确,以中间语言为界面,编译前端和后端的接口更清晰。
3.符号表中信息栏中登记了每个名字的有关的性质,如类型、种属、所占单元大小、地址等等。
4.在整个编译期间,对于符号表的操作大致可归纳为五类:
(1)对给定名字,查询名字是否已在表中;
(2)往表中填入一个新的名字;
(3)对给定名字,访问它的某些信息;
(4)对给定名字,填写或更新它的某些信息;
(5)删除一个或一组无用的项。
5.符号表的组织方式:
(1)符号表最简单的组织方式是让各项各栏所占的存储单元的长度都是固定的。
这种项栏长度固定的表格易于组织、填写和查找。
但是,有许多语言对标识符的长度几乎不加限制,或者说,标识符的长度范围甚宽。
如果每项长度固定,则势必会大量浪费存储空间。
改进的方法:
用一个独立的字符串数组,把所有标识符都存放在其中。
在符号表的主栏放一个指示器和一个整数,指示器指出标识符在字符中的数组的位置;整数代表此标识符的长度。
(2)把一些共同属性直接登记在符号表的信息栏中,而把某些特殊属性登记在别的地方,并在信息栏中附设一指示器,指向存放特殊属性的地方。
对于数组标识符,需要存储的信息有维数等等,如果将它们与其它名字全部集中在一张符号表中,处理起来很不方便.因此常常采用以下方式:
即专门开辟一个信息表区,称为数组信息表(或内情向量表),将数组的有关信息全部存入此表中。
在符号表的地址栏中存入符号表与内情向量表连接的入口地址(即指针)。
6.
(1)E=>E+T=>T+T=>T*F+T=>F*F+T=>(E)*F+T=>(E+T)*F+T=>(T+T)*F+T
=>(F+T)*F+T=>(i+T)*F+T=>(i+F)*F+T=>(i+i)*F+T=>(i+i)*i+T
=>(i+i)*i+F=>(i+i)*i+i
(2)短语i,F,E+T,(E+T),(E+T)*i,(E+T)*i+F
素短语i,E+T
最左素短语E+T
五、计算题:
1.
句子acab对应的语法树为:
因此,输入acab,输出是4231。
2.对D,L,T设置综合属性type。
过程addtype(name,type)用来把名字name填入到符号表中,并给出此名字的类型type。
翻译方案如下:
D→idL{addtype(id.name,L.type}
L→,idL
(1){addtype(id.name,L
(1).type)
L.type:
=L
(1).type}
L→:
T{L.type:
=T.type}
T→integer{T.type:
=integer}
T→real{T.type:
=real}
3.波兰式abc+e*bc+f/+:
=
三元序列oparg1arg2
(1)+bc
(2)*
(1)e
(3)+bc
(4)/(3)f
(5)+
(2)(4)
(6):
=a(5)
4.
(1)
C→ifEthen
S→CS
(1)
(2)
C→ifEthen{BACK(E.TC,NXQ);C.chain:
=E.FC}
S→CS
(1){S.chain:
=MERG(C.Chain,S
(1).Chain)}
5.
(1)(j<,a,‘10’,(3))
(2)(j,_,_,(12))
(3)(j>,c,‘0’,(5))
(4)(j,_,_,(8))
(5)(+,a,‘1’,T1))
(6)(:
=,T1,_,a)
(7)(j,_,_,
(1))
(8)(*,a,‘13’,T2)
(9)(-,T2,‘1’,T3)
(10)(:
=,T3,_,a)
(11)(j,_,_,
(1))
(12)
6.
(1)
S→doM1S1whileM2E
M→ε
(2)
M→ε{M.quad=nestquad;}
S→doM1S1whileM2E{backpatch(s1.nextlist,M2.quad);
backpatch(E.truelist,M1.quad);
S.nextlist=E.falelist;
}
7.
(1)(j>,X,0,(5))
(2)(j,_,_,(3))
(3)(j<,Y,0,(5))
(4)(j,_,_,(11))
(5)(j>0,X,0,(7))
(6)(j,_,_,(7))
(7)(*,A,3,T1)
(8)(:
=,T1,_,N)
(9)(j,_,_,(5))
(10)(j,_,_,(13))
(11)(+,B,3,T2)
(12)(:
=,T2,_,Y)
8.
(1)计算FIRSTVT和LASTVT集合
FIRSTVT(S)={a,(}
FIRSTVT(T)={+,aa,(}
LASTVT(S)={a,)}
LASTVT(T)={+,a,)}
(2)构造优先关系表
a
+
(
)
a
.>
.>
+
<.
.>
<.
.>
(
<.
<.
<.
=.
)
.>
.>
>.
作业三
一、是非题
1.(√)
2.(√)
3.(√)
4.(√)
5.(×)
二、填空题
1.(现行活动记录地址和所有外层最新活动记录的地址)
2.(栈式),(堆式)
3.(传地址),(传值),(传名)
4.(局部优化),(循环优化),(全局优化)
5.(局部优化)
三、名词解释题:
1.DISPLAY表----过程的嵌套层次显示表,记录该过程的各外层过程的最新活动记录的起始地址。
2.待用信息------如果在一个基本块中,四元式i对A定值,四元式j要引用A值,而从i到j之间没有A的其它定值,则称j是四元式i的变量A的待用信息。
3.活动记录------为了管理过程在一次执行中所需要的信息,使用一个连续的存储区来管理,这个区(块)叫做一个活动记录。
4.静态链------使用静态链指针,该指针指向直接外层的最新活动记录的地址。
形成一条链,称为静态链。
5.优化------所谓代码优化就是对程序进行各种等价变换,使得从变换后的程序出发,能生成更有效的目标代码。
四、简答题:
1.每个过程的活动记录的体积在编译时可静态确定。
2.现行活动记录地址和所有外层最新活动记录的地址
3.常用的动态存贮分配办法是栈式动态存贮分配,堆式动态存贮分配。
5.设法跟踪每个外层过程的最新活动记录的位置。
主要跟踪的方法
(1)静态链
(2)DISPLAY表
5.绝对地址=活动记录基地址+相对地址
6.传值A=2,B=4
传地址A=6,B=16
7.传值a=5
传地址a=12
8.编译程序为了组织存储空间,必须考虑下面几个问题:
(1)过程是否允许递归?
(2)当控制从一个过程的活动返回时,对局部名称的值如何处理?
(3)过程是否允许引用非局部名称?
(3)过程调用时如何传递参数;过程是否可以做出为参数被传递和做为结果被返回?
(4)存储空间可否在程序控制下进行动态分配?
(5)存储空间是否必须显式地释放?
9.通过DISPLAY表访问非局部变量要比沿着静态链访问非局部变量的速度快,因为通过DISPLAY表的一个域,可以确定任意活动记录的指针,再沿着这个指针可找到处于外层活动记录的非局部变量。
五、计算题:
1.优化后的四元序列
D:
=A-C
E:
=A*C
F:
=D*E
M:
=F+20
2.划分为B1、B2、B3和B4基本块。
(1)J:
=1
(2)A:
=0
(3)R:
=I-1B1
(4)C:
=B+J
(5)A:
=C*A
(6)ifJ=20goto(9)B2
(7)J:
=J+1
(8)goto(3)B3
(9)B4
3.优化后的四元序列
T2:
=A+B
T3:
=A*B
T4:
=T2+T3
X:
=3*T4
Y:
=T2+15
4.该基本块的目标代码如下:
LDR0,B
SUBR0,C
LDR1,A
MULR1,R0
LDR0,D
ADDR0,1
STR1,T2
LDR1,E
SUBR1,F
MULR0,R1
LDR1,T2
DIVR1,R0
STR1,W
5.该基本块的目标代码如下:
LDR0,A
ADDR0,B
LDR1,C
SUBR1,R0
LDR0,D
ADDR0,E
SUBR0,R1
STR0,T4