编译原理课程重点.docx
《编译原理课程重点.docx》由会员分享,可在线阅读,更多相关《编译原理课程重点.docx(18页珍藏版)》请在冰豆网上搜索。
编译原理课程重点
编译原理课程测试试卷评分标准1
(数计学院04计科A卷)
一、填空题参考答案(共30分,30个空,每空1分)
题号
1
2
3
4
参考答案
代码优化、前后端、源语言与目标机器
上下文无关文法、VN、|β|>=|α|
语法制导翻译、语义动作、属性文法
A→aB、A→B、
Z→ε
题号
5
6
7
8
参考答案
寄存器、计算机指令系统、计算次序
NFA、DFA、接受(识别)
线性、排序、散列
FIRST(β)、β=*>ε、S=*>…A
题号
9
10
参考答案
顺序、最后一个语句、局部优化
预测分析程序、SELECT(A→α)、没有值
说明:
各个答案可有不同表达方式,只要意思相同即可。
二、简述题参考答案(共20分,4个小题,每小题5分)
1、简述将NFA转换为最小化DFA的步骤。
1、第一步:
将NFA确定化。
用造表法将NFA确定化过程如下:
(0)表的第0行和第0列作标识行列的值。
(1)将ε-closure(I)作为表中第1行第1列。
(2)假定={a1,a2,...an},设第i行第一列已确定状态集为I,则置该行第i列为Iai,如Iai未曾在任何行第一列出现过,则将Iai加入下一空行i+1的第一列,并在第0列标记为Ti+1。
(3)反复重复第
(1)步,直至无新状态出现为止。
(4)重新命名新状态。
(3分)
第二步:
将DFA最小化。
DFA最小化具体过程:
用子集分割法将不含多余状态的DFA分成一些不相交的子集,使得任何两个不同的子集中的状态都是可区别的,而相同子集中状态是等价的。
分割时,首先将DFA状态分成终态子集和非终态子集,再根据输出弧所达到状态的性质逐步细分。
(2分)
2、简述静态存储分配、栈式存储分配和堆式存储分配的特点和主要用途。
2、
(1)静态存储分配的特点:
编译时刻确定存储位置;访问效率高。
主要用途:
子程序的目标代码段、全局数据目标(全局变量)。
(2分)
(2)栈(Stack)式存储分配的特点:
嵌套调用次序、先进后出、生存期限于本次调用、自动释放。
用途:
过程的局部环境、活动记录。
(1分)
(3)堆(Heap)式存储分配的特点:
将内存空间分为若干块,根据用户要求分配;无法满足时,调用无用单元收集程序将被释放的块收集起来重新分配。
主要用途:
用于动态数据结构:
存储空间的动态分配和释放。
(2分)
3、以表达式a:
=b*(-c)+b/(-d)为例,简述常用的三种中间代码表示形式。
3、
(1)逆波兰式:
abc-*bd-/+:
=。
(1分)
(2)三元式:
①(-,c,_)②(*,b,①)③(-,d,_)
④(/,b,③)⑤(+,②,④)⑥(:
=,③,a)。
(2分)
(3)四元式:
①(-,c,_,t1)②(*,b,t1,t2)③(-,d,_,t3)
④(/,b,t3,t4)⑤(+,t2,t4,t5)⑥(:
=,t5,_,a)。
(2分)
4、简述判别文法G是否为LL
(1)文法的步骤和将一个非LL
(1)文法转换为LL
(1)文法的
4、
(1)判别步骤:
先画出各非终结符能否推导出ε的情况表;然后,用定义法或关系图法计算FIRST、FOLLOW集;再计算各规则的SELECT集;最后,根据同一个左部的规则其SELECT集是否相交来判断给定文法是否为LL
(1)文法。
(3分)
(2)将非LL
(1)文法转换成LL
(1)文法的两种主要方法:
提取左公共因子、消除左递归。
(2分)
三、应用题参考答案(共50分)
1、
(1)证明(3分):
因为存在推导序列S=>aAS=>aSbAS=>aabAS=>aabbaS=>aabbaa,即有S=*>aabbaa成立,所以,是文法的一个句子。
(2)语法树(3分):
(3)句型分析(6分):
将句型改写为a1a2b1b2a3a4,则:
该句型相对于S的短语:
a1a2b1b2a3a4和a4;相对于A的短语:
a2b1b2a3和b2a3;对于S→a的直接短语:
a2,a4;相对于A→ba的直接短语:
b2a3;句柄:
a2。
2、
(1)计算G[E']的FIRSTVT和LASTVT集如下:
(5分)
(2)构造G[E']的算符优先关系表如下:
(4分)
由上表可知G[E']是算符优先文法(1分)。
(3)输入串w=i+i#的算符优先分析过程如下:
(5分)
3、
(1)基本块的DAG图如下:
(3分)
(2)根据DAG结点原来的构造顺序重写四元式如下:
(2分)
A:
=5T1=10T3=10B:
=R+r
T0:
=A+BT2:
=T0X1:
=T0+T1X2:
=T0*T1
(3)假设基本块出口后只有X1,X2还被引用,则通过重新命名临时变量的基本块保结构变换,可将基本块的四元式代码进一步优化为:
(3分)
C:
=R+rD:
=5+CX1:
=D+10X2:
=D*10
4、0)S’→S1)S→A2)S→B3)A→aAe
4)A→a5)B→bBd6)B→b
(1)G[S’]的LR(0)项目集规范族DFA如下:
(4分)
(2)由于
,得G[S’]的SLR
(1)分析表如下:
(3分)
由上左表可知G[S’]是SLR
(1)文法(1分)。
(3)用SLR
(1)方法分析输入串aae#过程如上右表所示:
(4分)
(4)由于G[S’]LR(0)项目集规范族DFA中I4、T5中都包含有移进—归约冲突,所以G[S’]不是LR(0)文法,由于G[S’]是SLR
(1)文法故一定是LR
(1)和LALR
(1)文法。
(3分)
编译原理课程测试试卷评分标准2
(数计学院04计科B卷)
一、填空题参考答案(共30分,30个空,每空1分)
题号
1
2
3
4
参考答案
中间代码生成、单词、语义分析
句子、非终结符号集和终结符集、左部
移进项目、A→α.Bβ、接受项目
不唯一、优先矩阵、优先函数
题号
5
6
7
8
参考答案
标识符、类型、作用域和可视性、
算符文法、多、算符优先文法
目标代码、已定位、可重定位
强连通、有且只有一个入口结点
题号
9
10
参考答案
符号a、状态j、归约得到的非终结符A、goto[S,a]的值j
全局变量、形参和实参
说明:
各个答案可有不同表达方式,只要意思相同即可。
二、简述题参考答案(共20分,4个小题,每小题5分)
1、简述运行目标程序时所需空间的种类。
1、运行目标程序时所需空间分为两种容纳目标代码的空间和目标代码运行时的数据空间。
(2分)
目标代码运行时的数据空间中某些部分无法在编译时确定存储位置,它主要包括:
用户所定义的变量和常量所需空间、中间结果及参数传递所需的临时单元、调用过程时的连接单元、I/O操作所需缓冲区。
(3分)
2、简述算符优先分析算法的步骤和算符优先分析方法的优、缺点。
2、
(1)算符优先分析算法的步骤:
(3分)
设单元a中存放当前输入符,S为一个符号栈,则:
1)将当前输入符存放到a中,将#入符号栈。
2)将栈顶第一个终结符b与a比较。
如果b≡a,而b==#且栈中只剩一个非终结符时,则成功;否则a入栈;如果b≮a,则a入栈;如果b≯a,在栈顶寻找最左素短语,并将最左素短语归约为一个非终结符;如果文法中找不到相应规则,则出错;
3)重复
(2)至成功或失败。
(2)算符优先分析方法的优、缺点:
(2分)
由于只考虑终结符之间的优先关系确定句柄,所以效率高;由于去掉了单非终结符之间的归约,有可能将错误的句子识别为正确的,只适用于表达式的语法分析。
3、简述代码优化的概念和分类,并列举出四种以上常用的代码优化技术。
3、所谓优化实质上是对代码进行等价变换,使得变换后的代码运行结果与变换前的代码运行结果相同,但运行速度或占用的存储空间加大。
(1分)
代码优化按阶段分中间代码优化和目标代码优化,按程序范围分为局部基本块优化、循环优化、全局优化。
(2分)
常用的优化技术有删除多余运算、代码外提、强度削弱、变换循环控制条件、合并已知变量与复写传播等。
(2分)
4、简述判别文法G是否为LL
(1)文法的步骤和将一个非LL
(1)文法转换为LL
(1)文法的
4、判别任意给定的一个上下文无关文法G[S]是否为LALR
(1)文法的过程:
(1)将G[S]加入一条规则:
S’→SG[S’]拓广为G[S’],然后构造G[S’]的LR(0)项目集规范族DFA。
检查DFA的项目集中有无移进—归约冲突或归约—归约冲突,若无,则G[S’]是LR(0)文法,也是LALR
(1)文法。
(1分)
(2)如果DFA的项目集中有无移进—归约冲突或归约—归约冲突,通过考虑归约项目左部非终结符的FOLLOW集能够解决这两类冲突,则G[S’]是SLR
(1)文法,也是LALR
(1)文法。
(2分)
(3)如果通过考虑归约项目左部非终结符的FOLLOW集还有不能够解决的移进—归约冲突,通过考虑后跟符号来构造G[S’]的LR
(1)项目集规范族DFA。
如果冲突可以解决,则G[S’]是LR
(1)文法。
进一步合并LR
(1)项目集规范族中同心集,如果依然不产生归约—归约冲突,则G[S’]是LALR
(1)文法。
(3分)
三、应用题参考答案(共50分)
1、
(1)证明(3分):
因为存在推导序列:
E=>T+E=>T+T+E=>T+T*F+E=>T+T*F+T
=>T+T*F+F=>T+T*F+i,即有E=*>T+T*F+i成立,所以,T+T*F+i是文法的一个句型。
(2)语法树(3分):
(3)句型分析(7分):
该句型相对于E的短语:
T+T*F+i、T*F+i和i;相对于T的短语有:
T*F和i,相对于F的短语有i。
相对于T→T*F的直接短语:
T*F,相对于F→i的直接短语:
i。
句柄:
T*F。
(4)该句型的所有素短语:
T*F和I;T*F为最左素短语。
(3分)
2、ifafthens1elses2生成的三地址代码/四元式序列如下:
(6分)
(1)ifa(2)goto(3)
(3)ifc(4)goto(p+1)
(5)ife>fgoto(7)
(6)goto(p+1)
(7)s1对应的四元式序列
…
(p)goto(q)
(p+1)s2对应的四元式序列
…
(q)
3、
(1)代入后有S的规则右部=a(bS|b)|b(aS|a)=ab(S|ε)|ba(S|ε)=(ab|ba)(S|ε),故对应的正规式R=(ab|ba)(ab|ba)*。
(3分)
(2)对应的NFA状态图如下左图所示:
(3分)
(3)将所得NFA确定化为DFA状态图如上右图所示:
(3分)
(4)将所得DFA最小化:
首先根据是否终态划分为非终态集P1={S,A,B}和终态集P2={Z};然后对P1根据a弧划分为P11={S},P12={A},P13={B}。
可见原DFA已是最小化的DFA。
(3分)
4、
(1)计算G[E]的SELECT集如下:
(2分)
SELECT(E→E–T)={(,a}SELECT(E→T)=={(,a}
SELECT(T→T^F)={(,a}SELECT(T→F)={(,a}
SELECT(F→(E))={(}SELECT(F→a)={a}
由于SELECT(E→E–T)∩SELECT(E→T)=={(,a}≠φ;
SELECT(T→T^F)∩SELECT(T→F)={(,a}≠φ;
SELECT(F→(E))∩SELECT(F→a)={(}∩{a}=φ
故G[E]不是LL(
(1)文法。
(1分)
对G[E]的E→E–T和T→T^F两条规则消除左递归后变为:
(2分)
E→TE’E’→–TE’|εT→FT’T’→^FT’|εF→(E)|a
计算消除左递归后G[E]的SELECT集如下:
(2分)
SELECT(E→TE’)={(,a}SELECT(E’→–TE’)={–}
SELECT(E’→ε)={#,)}SELECT(T→FT’)={(,a}
SELECT(T’→^FT’)={^}SELECT(T’→ε)={–,#,)}
SELECT(F→(E))={(}SELECT(F→a)={a}
由于SELECT(E’→–TE’)∩SELECT(E'→ε)=φ
SELECT(T'→^FT')∩SELECT(T'→ε)=φ
SELECT(F→(E))∩SELECT(F→a)==φ
故消除左递归后的G[E]是LL(
(1)文法。
(1分)
(2)根据消除左递归后的G[E]的SELECT集构造预测分析表如下:
(3分)
对输入串w=a-a^a#的分析过程如下表所示(注意:
规则右部以逆序入栈):
(5分)
编译原理课程测试试卷评分标准3
(数计学院03A卷)
第一题:
填空题(30分)
1、共有30个空,每空1分,30×1=30分。
2、参考答案:
题号
1*
2
3
参考答案
源语言、目标机
YACC、LEX
句型、句子
题号
4
5
6
参考答案
上下文无关文法、一个非终结符
有害规则、多余规则
状态转换函数、子集
题号
7
8
9*
参考答案
预测分析方法、算符优先分析方法
待约项目、归约项目
提取左公共因子、消除左递归
题号
10
11*
12
参考答案
入口、出口
ai-1≮ai、aj≯aj+1ai≡ai+1≡…≡aj-1≡aj、
收集符号属性、目标代码生成阶段地址分配
题号
13
14*
15
参考答案
图中存在环/回路
传值、传地址
语法制导、属性文法
说明:
(1)各个答案可有不同表达方式,只要意思相同即可;
(2)带*的题中的答案可交换次序。
第二题:
(7分)
典型编译程序在各个工作阶段的任务参考答案:
1、词法分析阶段的任务:
对构成源程序的字符串进行扫描和分解,识别出单词(如标识符等)符号序列。
(1分)
2、语法分析阶段的任务:
根据语言的语法规则对单词符号串(符号序列)进行语法分析,识别出各类语法短语(可表示成语法树的语法单位),判断输入串在语法上是否正确。
(1分)
3、语义分析阶段的任务:
按语义规则对语法分析器归约出的语法单位进行语义分析,审查有无语义错误,为代码生成阶段收集类型信息,并进行类型审查和违背语言规范的报错处理。
(1分)
4、中间代码生成阶段的任务:
将语义分析得到的源程序变成一种结构简单,含义明确,容易生成,容易译成目标代码的内在代码形式。
(1分)
5、代码优化阶段的任务:
对中间代码或目标代码进行等价的变换改造等优化处理,使生成的代码更高效。
(1分)
6、目标代码生成阶段的任务:
将中间代码生成特定机器上的绝对或可重定位的指令代码或汇编指令代码。
(1分)
说明:
结合具体高级语言的答案再加1分。
第三题:
(10分)
1、正规文法G[S](4分):
S→0A|1B
A→1S|1
B→0S|0
2、NFA(3分):
3、DFA(3分):
步骤如下表所示(可省):
标记
新状态
I0
I1
T0
{S}
{A}
{B}
T1
{A}
φ
{S,Z}
T2
{B}
{S,Z}
φ
T3
{S,Z}
{A}
{B}
将集合T0至T3各用一个状态表示,确定化后所得DFAM如下:
说明:
此答案只供参考,可以是其他答案,只要功能等价即可。
第四题:
(10分)
1、证明(3分):
因为存在推导序列E=>E-T=>E-T*F=>E-F*F=>E-F*(E)=>E-F*(T)=>E-F*(F)=>E-F*(i),即有E
E-F*(i)成立,所以,E-F*(i)是文法的一个句型。
2、语法树(2分):
3、句型分析(5分)
句型E-F*(i)相对于E的短语有:
E-F*(i),i。
句型E-F*(i)相对于T的短语有:
F*(i),F,i。
句型E-F*(i)相对于F的短语有:
(i),i。
(3分)
句型E-F*(i)相对于T→F的直接短语有:
F。
句型E-F*(i)相对于F→i的直接短语有:
i。
(2分)
句型E-F*(i)的句柄为:
F。
(1分)
说明:
(1)短语、直接短语的说明可不具体指明所相对的非终结符或规则。
(2)短语每错两个扣1分。
第五题:
(10分)
对任意给定的一个文法G[S]:
1、判断是否为LL
(1)文法的步骤:
(4分)
1)画出各非终结符能否推导出ε的情况表。
2)用定义法或关系图法计算FIRST、FOLLOW集。
3)计算各规则的SELECT集。
4)检查所有左部相同的规则的SELECT集是否相交,如果不相交,则G[S]为LL
(1)文法。
否则,说明G[S]不是LL
(1)文法。
2、构造G[S]预测分析表:
(3分)
预测分析表为一个二维矩阵,其形式为M[A,a],其中A∈VN,a∈VT或#。
对文法中的规则A→α,若有终结符a∈SELECT(A→α),则将A→α填入M[A,a]中。
(书写时,通常省略规则左部,只填→α)。
对所有没有值的M[A,a]标记为出错。
3、根据预测分析表M对给定的某个输入串进行预测分析的过程,可用下述算法表示:
(3分)
#,S进栈;//初始化工作,S为开始符
do{
X=当前栈顶符号;a=当前输入符号;
if(X∈VT∪{#})
{if(X==a)
{if(X!
=#){将X弹出,且前移输入指针}}
elseerror()}
else{
if(M[X,a]==Y1Y2…Yk)
{将X弹出;依次Yk…Y2Y1将压入栈;}
elseerror()};
}while(X!
=#);
说明:
此答案只供参考,可以是其他答案,只要意思相近即可。
第六题:
(15分)
1、对文法进行拓广,加入规则E’→E后得G[E’],其非终结符的FIRSTVT、LASTVT集计算如下:
(4分)
非终结符
E’
E
D
H
T
FIRSTVT集
{#}
{;,(,a}
{(,a}
{(,a}
{*,;,(,a}
LASTVT集
{#}
{;,),a}
{),a}
{),a}
{*,;,),a}
由FIRSTVT、LASTVT集构造≮和≯如下:
VTVN符号对
≮关系
VNVT符号对
≯关系
#E
#≮FIRSTVT(E)
E#
LASTVT(E)≯#
;D
;≮FIRSTVT(D)
E;
LASTVT(E)≯;
(T
(≮FIRSTVT(T)
T)
LASTVT(T)≯)
(E
(≮FIRSTVT(E)
E)
LASTVT(E)≯)
*E
*≮FIRSTVT(E)
T*
LASTVT(T)≯*
2、
(1)优先矩阵为:
(4分)
;
(
)
a
*
#
;
≯
≮
≯
≮
≯
≯
(
≮
≮
≡
≮
≮
)
≯
≯
≯
≯
≯
a
≯
≯
≯
≯
≯
*
≮
≮
≯
≮
≯
#
≮
≮
≮
≡
(2)该文法是算符优先文法(1分)。
3、
(1)输入串(a*a)#的算符优先分析过程:
(4分)
步骤
分析栈
剩余输入串
关系
动作
1
#
≮
(a*a)#
入栈
2
#(
≮
a*a)#
入栈
3
#(a
≯
*a)#
归约
4
#(H
≮
*a)#
入栈
5
#(H*
≮
a)#
入栈
6
#(H*a
≯
)#
归约
7
#(H*H
≯
)#
归约
8
#(T
≡
)#
入栈
9
#(T)
≯
#
归约
10
#H
≡
#
成功
(2)优缺点(2分):
由上述分析过程可知,用算符优先分析法分析在确定句柄时只考虑终结符之间的优先关系,而与非终结符无关,这使得算符优先分析法具有效率高的优点;但是,由于去掉了单非终结符之间的归约,有可能将错误的句子识别为正确的。
上例中对输入串(a*a)#能分析成功,但(a*a)#并不是文法G[E]的句子。
这就是算符优先分析法的缺点。
第七题:
(18分)
1、
(1)G[S’]的LR(0)项目集规范族DFA(3分):
(2)检查发现I2={S→L.=R,R→L.}中存在移进—归约冲突,所以,G[S’]不是LR(0)文法。
(1分)
(3)在I2={S→L.=R,R→L.}中,由于根据归约项目R→L.所得的FOLLOW(R)={=,#}中含有移进项目S→L.=R中的“=”,当面临输入符号为“=”时,出现了移进归约冲突:
S→L.=R∈I2且go(I2,=)=I6
action[2,=]=S6
R→L.∈I2且“=”在FOLLOW(R)={=,#}中,
action[2,=]=r5
说明G[S’]不是SLR
(1)文法。
(2分)
2、
(1)G[S’]的LR
(1)项目集规范族DFA(3分):
(2)在上面LR
(1)项目集规范族的I2中,当输入#号时才用项目R→L.归约;当输入=号时用项目S→L.=R作移进。
所以,SLR
(1)不能解决的移进--归约冲突可由LR
(1)方法解决。
故该文法是LR
(1)文法。
(2分)
(3)进一步合并LR
(1)项目集规范族中同心集I4和I11、I5和I12、I7和I13、I8和I10,得合并结果为:
I4、I5、I7、和I8。
显然,它们依然不含归约--归约冲突。
故该文法是LALR
(1)文法。
(1分)
3、LALR
(1)分析表:
(3分)
状态
ACTION
GOTO
=
*
i
#
S
L
R
0
S4
S5
1
2
3
1
acc
2
S6
r5
3
r2
4
S4
S5
8
7
5
r4
r4
6
S4
S5
8
9
7
r3
r3
8
r5
r2
r5
9
r1
4、LR算法如下:
(3分)
设s是栈