《编译原理》总结.docx
《《编译原理》总结.docx》由会员分享,可在线阅读,更多相关《《编译原理》总结.docx(43页珍藏版)》请在冰豆网上搜索。
《编译原理》总结
编译原理模拟试卷及答案
学生姓名:
_____________学号:
___________________
学生系别:
_____________专业:
______________年级___________班级_____________
课程名称:
编译原理课程性质:
专业必修
一、文法G[]的产生式为:
(12%)
→+|
→*|
→I|()
a)给出(I+I)*I的最左推导、最右推导及相应的推导树;
b)列出句型+*的所有短语、简单短语和句柄。
答:
a)最左推导:
⇒⇒*⇒*⇒()*⇒(+)*⇒(+)*
⇒(+)*⇒(I+)*⇒(I+)*⇒(I+I)*⇒(I+I)*⇒(I+I)*⇒(I+I)*I
最右推导:
⇒⇒*⇒*⇒*⇒*I⇒*I⇒()*I
⇒(+)*I⇒(+)*I⇒(+I)*I⇒(+I)*I⇒(+I)*I⇒(I+I)*I
推导树如下:
b)所有短语:
(2个)、*、+*
简单短语:
(2个)
短语:
二、构造下列正则表达式的确定性的有限状态自动机。
(12%)
aba(a|b)*a
答:
三、证明下面文法是SLR
(1)文法,并构造其SLR分析表。
(15%)
→+|
→|
→*|a|b
答:
分析表如下所示:
状态T
项目集
输入符号
下一状态
0
*
→·⊥
1
→·+
1
→·
2
→·
2
→·
3
→·*
3
→·a
a
4
→·b
b
5
1
*
→·⊥
⊥
Accept
*
→·+
+
6
2
*
→·
⊥/+
#2
*
→·
7
→·*
7
→·a
a
4
→·b
b
5
3
*
→·
⊥/+/a/b
#4
*
→·*
*
8
4
*
→a·
#6
5
*
→b·
#7
6
*
→+·
9
→·
9
→·
3
→·*
3
→·a
a
4
→·b
b
5
7
*
→·
⊥/+/a/b
#3
*
→·*
*
8
8
*
→*·
#5
9
*
→+·
⊥/+
#1
*
→·
7
→·*
7
→·a
a
4
→·b
b
5
四、写出下列表达式的三地址形式的中间表示。
(16%)
(1)5+6⨯(a+b);
(2)⌝A∨(B∧(C∨D));
(3)forj:
=1to10doa[j+j]:
=0;
(4)ifx>ythenx:
=10elsex:
=x+y;
答:
100:
t1:
=a+b
101:
t2:
=6*t1
102:
t3:
=5+t2
100:
ifAgoto102
101:
gotoT
102:
ifBgoto104
103:
gotoF
104:
ifCgotoT
105:
goto106
106:
ifDgotoT
107:
gotoF
100:
j:
=1
101:
ifj>10gotoNEXT
102:
i:
=j+j
103:
a[i]:
=0
104:
goto101
100:
ifx>ygoto102
101:
goto104
102:
x:
=10
103:
goto105
104:
x:
=x+y
105:
五、条件语句可形式定义为:
(20%)
→IFTHEN1ELSE2
其中带有属性
1..type值为“boolean”表示是布尔类型
2..true和.false值为中真和假的尚待回填的出口的链首指针
条件语句的语义可描述为:
t:
=e;
ifnottthengotoL1;
1;
gotoL2;
L1:
2;
L2:
其中e为的值。
试用句法制导翻译的方法写出符合上述要求的条件语句的翻译方案。
答:
条件语句的属性翻译文法为:
→if
{
CheckBool(.type);
TLT:
=NewTL;
GEN(LABEL,TLT);
Backpatch(.true,TLT);
.false:
=.false;
}
→then1
{
.TL:
=NewTL;
GEN(BR,.TL);
TLF:
=NewTL;
GEN(LABEL,TLF);
Backpatch(.false,TLF);
}
→else2
{
GEN(LABEL,.TL);
}
六、对如下程序框架,若采用以过程为单位、二级存储区的存储分配方法.
试写出当程序流到达L时,整个运行栈的内容.(15%)
proceduremain
procedureq(x,y:
int)
begin
Z:
real;
arrayB[x..y]ofreal;
begin
D,E:
real;
arrayC[1..600]ofint;
end;
begin
arrayA[1..x]ofreal;
begin
E,F:
int;
L:
end;
end;
end;//q
begin
r,s:
int;
arrayT[10..400]ofreal;
callq(1,200);
end;//main
要求用图的形式详细列出调用记录中各个项的分布情况。
答:
调用记录中各项的分布情况如图6.29所示:
七、设基本块π由如下语句构成:
(10%)
T0:
=3.14;
T1:
=2*T0;
T2:
=R+r;
A:
=Tl*T2;
B:
=A;
T3:
=2*T0;
T4:
=R+r;
T5:
=T3*T4;
T6:
=R-r;
B:
=T5*T6;
a)试给出基本块π的DAG。
b)根据DAG重写基本块。
c)若π所在的程序中只有A和B在π后将要被引用,试写出优化后的基本块。
答:
1)基本块π的DAG如图7.1所示。
图7.1基本块π的DAG
2)因为DAG重写基本块必须满足的约束条件是:
DAG中各节点计算时,其子节点已经完成计算。
所以重写序列为1、3、4、5、7、2、6、8。
即可重写为:
T0:
=3.14;
T2:
=R+r;
T4:
=T2;
T6:
=R-r;
T1:
=6.28;
T3:
=T1;
A:
=6.28*T2;
T5:
=A;
B:
=A*T6;
3)因为只有A、B将在π后被引用,
所以最后优化的代码为:
S1:
=R+r;
S2:
=R-r;
A:
=6.28*S1;
B:
=A*S2;
其中,S1、S2为临时变量。
<编译原理>历年试题及答案
一. (每项选择2分,共20分)选择题
1.将编译程序分成若干个“遍”是为了___。
a.提高程序的执行效率
b.使程序的结构更加清晰
c.利用有限的机器内存并提高机器的执行效率
d.利用有限的机器内存但降低了机器的执行效率
2.构造编译程序应掌握____。
a.源程序 b.目标语言
c.编译方法 d.以上三项都是
3.变量应当_。
a.持有左值 b.持有右值
c.既持有左值又持有右值 d.既不持有左值也不持有右值
4.编译程序绝大多数时间花在____上。
a.出错处理 b.词法分析
c.目标代码生成 d.管理表格
5.词法分析器的输出结果是____。
a.单词的种别编码 b.单词在符号表中的位置
c.单词的种别编码和自身值 d.单词自身值
6.正规式MI和M2等价是指____。
a.MI和M2的状态数相等 b.Ml和M2的有向弧条数相等。
C.M1和M2所识别的语言集相等 d.Ml和M2状态数和有向弧条数相等
7.中间代码生成时所依据的是—。
a.语法规则 b.词法规则 c.语义规则 d.等价变换规则
8.后缀式ab+cd+/可用表达式___来表示。
a.a+b/c+d b.(a+b)/(c+d) c.a+b/(c+d) d.a+b+c/d
9.程序所需的数据空间在程序运行前就可确定,称为______管理技术。
a.动态存储 b.栈式存储 c.静态存储 d.堆式存储
10.堆式动态分配申请和释放存储空间遵守________原则。
a.先请先放 b.先请后放 c.后请先放 d.任意
二(每小题10分,共80分)简答题
1.画出编译程序的总体结构图,简述各部分的主要功能。
2. 已知文法G[E]:
E→ET+|T T→TF*|F F→F^|a
试证:
FF^^*是文法的句型,指出该句型的短语、简单短语和句柄.
3.为正规式(a|b)*a(a|b)构造一个确定的有限自动机。
4. 设文法G(S):
S→(L)|aS|a
L→L,S|S
(1)消除左递归和回溯;
(2)计算每个非终结符的FIRST和FOLLOW;
(3)构造预测分析表。
5. 已知文法
A->aAd|aAb|ε
判断该文法是否SLR
(1)文法,若是构造相应分析表,并对输入串ab#给出分析过程。
6. 构造算符文法G[H]的算符优先关系(含#)。
G[H]:
H→H;M|M
M→d|aHb
7.已构造出文法G(S)
(1)S BB
(2)B aB
(3)B b
1)。
给出DFA图
2).给出LR分析表
3).假定输入串为abaab,请给出LR分析过程(即状态,符号,输入串的变化过程)。
8. 将下面的语句翻译成四元式序列:
whileA ifA=1thenC:
=C+l
elsewhileA≤Ddo
A:
=A+2;
9. 对下面的流图,
(1)求出流图中各结点N的必经结点集D(n),
(2)求出流图中的回边,
(3)求出流图中的循环。
参考答案
一.单项选择题
1. 将编译程序分成若干个“遍”是为了使编译程序的结构更加清晰,故选b。
2. .构造编译程序应掌握源程序、目标语言及编译方法等三方面的知识,故选d。
3. 对编译而言,变量既持有左值又持有右值,故选c。
4. 编译程序打交道最多的就是各种表格,因此选d。
5. 词法分析器输出的结果是单词的种别编码和自身值,选C。
6. 正规式M1和M2所识别的语言集相等,故选C。
7. 选c。
8. 选b。
9. 选C
10. 堆式动态分配申请和释放存储空间不一定遵守先请后放和后请先放的原则,故选d
二.简答题
1. 【解答】
编译程序的总体结构图如图1.2所示。
词法分析器:
输入源程序,进行词法分析,输出单词符号。
语法分析器:
在词法分析的基础上,根据语言的语法规则(文法规则)把单词符号串分
解成各类语法单位,并判断输入串是否构成语法上正确的“程序”。
中间代码生成器:
按照语义规则把语法分析器归约(或推导)出的语法单位翻译成一定
形式的中间代码,比如说四元式。
优化:
对中间代码进行优化处理。
目标代码生成器:
把中间代码翻译成目标语言程序。
表格管理模块保存一系列的表格,登记源程序的各类信息和编译各阶段的进展情况。
编
译程序各阶段所产生的中间结果都记录在表格中,所需信息多数都需从表格中获取,整个编
译过程都在不断地和表格打交道。
出错处理程序对出现在源程序中的错误进行处理。
此外,编译的各阶段都可能出现错误,
出错处理程序对发现的错误都及时进行处理。
2. 【解答】
该句型对应的语法树如下:
该句型相对于E的短语有FF^^*;相对于T的短语有FF^^*,F;相对于F的短语有F^;F^^;简单短语有F;F^;句柄为F.
3. 【解答】
最简DFA如图2.66所示。
4. 【解答】
(1)
S→(L)|aS’
S’→S|ε
L→SL’
L’→SL’|ε
评分细则:
消除左递归2分,提公共因子2分。
(2)FIRST和FOLLOW
FIRST)S)={(,a} FOLLOW(S)={#,,,)}
FIRST(S’)={,a,ε} FOLLOW(S’)={#,,,)}
FIRST(L)={(,a} FOLLOW(L)={)}
FIRST(L’)={,,ε} FOLLOW(L’〕={)}
5. 【解答】
(1)拓广文法
(0)S->A
(1)A->aAd
(2)A->aAb (3)A->ε
(2)构造识别活前缀的DFA
FOLLOW(A)={d,b,#}
对于状态I0:
FOLLOW(A)∩{a}=Ф
对于状态I1:
FOLLOW(A)∩{a}=Ф
因为,在DFA中无冲突的现象,所以该文法是SLR
(1)文法。
(3)SLR
(1)分析表
状态 ACTION GOTO
a B d # A
0 S2 r3 r3 r3 1
1 acc
2 S2 r3 r3 r3 3
3 S5 S4
4 r1 r1 r1
5 r2 r2 r2
(4)串ab#的分析过程
步骤 状态栈 符号栈 当前字符 剩余字符串 动作
1 0 # a b# 移进
2 02 #a b # 归约A->ε
3 023 #aA b # 移进
4 0235 #aAb # 归约A->aAb
5 01 #A # 接受
6. 【解答】
由M→d和M→a…得:
FIRSTVT(M)={d,a};
由H-H;…得:
FIRSTVT(H)={;}
由H→M得:
FIRSTVT(M)cFIRSTVT(H),即FIRSTVT(H)={;,d,a}
由M→d和M→…b得:
LASTVT(M)={d,b};
由H---,;m得:
LASTVT(H)={;};
由H→M得:
LASTVT(M)cLASTVT(H),即LASTVT(H)={;,d,b}
对文法开始符H,有#H#存在,即有#=#,##,也即#<;,##,b>#。
对形如P→…ab…,或P→…aQb…,有a=b,由M→a|b得:
a=b;
对形如P→…aR…,而b∈FIRSTVT(R),有a
有a>b。
由H→…;M得:
;:
由M→aH…得:
aa<;,a 由H→H;’’•得:
LASTVT(H)>;,即:
;>;,d>;,b>;
由M→…Hb得:
LASTVT(H)>b,即:
;>b,d>b,b>b
由此得到算符优先关系表,见表3.5。
7. 【解答】
(1)LR分析表如下:
(2)分析表
状态 ACTION GOTO
a b # S B
0 s3 s4 1 2
1 acc
2 S3 S4 5
3 s3 s4 6
4 r3 r3
5 R1 R1 r1
6 R2 R2 R2
(3)句子abaab的分析过程
表:
句子abaab的分析过程
步骤 状态 符号栈 输入串 所得产生式
0 #0 # abaad#
1 #03 #a baad#
2 #034 #ab aab# B→b
3 #036 #aB aab# B→aB
4 #02 #B aab#
5 #023 #Ba ab#
6 #0233 #Baa b#
7 #02334 #Baab #
8 #02336 #BaaB #
9 #0236 #BaB ad#
10 #025 #BB ad#
11 #01 #S d#
12 # # d#
13 识别成功
8. 【解答】
该语句的四元式序列如下(其中E1、E2和E3分别对应:
A 100(j<,A,C,102)
101(j,_,_,113) /*E1为F*/
102(j<,B,D,104) /*El为T*/
103(j,_,_,113) /*El为F*/
104(j=,A,1,106) /*Ez为T*/
105(j,_,_,108) /*EZ为F*/
106(+,C,1,C) /*C:
=C+1*/
107(j,_,_,112) /*跳过else后的语句*/
108(j≤,A,D,110) /*E3为T*/
109(