编译原理试题1.docx
- 文档编号:16553234
- 上传时间:2023-07-14
- 格式:DOCX
- 页数:13
- 大小:92.42KB
编译原理试题1.docx
《编译原理试题1.docx》由会员分享,可在线阅读,更多相关《编译原理试题1.docx(13页珍藏版)》请在冰点文库上搜索。
编译原理试题1
课程测试试题(A卷)
一、填空(30分)
1、将编译过程的各阶段划分为前端或后端和将编译程序分遍的主要参考因素都是()和()的特征。
2、()是一种语法分析程序的自动构造工具,用它可以直接构造各种语言的语法分析器;而()是一种词法分析程序的自动构造工具,用它可以直接构造各种语言的词法分析器。
3、假设G[S]是一个文法,如有S
x,则称x是该文法G的();文法G产生的()的全体称为该文法所描述的语言。
4、所谓2型文法就是指()文法,若用G=(VN,VT,P,S)表示它,则它要求G中的所有规则α→β都满足:
α是(),而β属于(VNUVT)*。
5、文法中形如U→U的规则称为()规则;由不可达的非终结符或不可终止的非终结符作为左部的规则称为()规则。
在实用文法中一般不允许含有这两类规则。
6、在用五元组表示的确定的有穷自动机DFAM=(K,V,F,S,Z)中,元素V表示字母表;元素S表示唯一的初态,它是状态集K的一个元素;元素F表示();元素Z表示终态集,它是状态集K的一个()。
7、语法分析方法分为自上而下与自下而上两类,自上而下的分析方法方要有递归子程序分析法和();而自下而上的分析方法主要有()和LR分析方法。
8、LR(0)项目集规范族中的项目可分为四类,它们是移进项目、()、归约项目和接受项目。
其中,接受项目是()的一种特例。
9、将非LL
(1)文法转换为等价的LL
(1)文法所采用的两种方法是()和()。
但这两种方法并不能保证所有的非LL
(1)文法都能转换为等价的LL
(1)文法。
10、通常局部优化是指基本块内的优化,所谓基本块是指程序中一顺序执行的语句序列,其中只有一个()语句和一个()语句。
11、算符优先分析时,在句型N1a1N2…ai-1NiaiNi+1ai+1…ajNj+1aj+1Nj+2…中,寻找的最左素短语NiaiNi+1ai+1…ajNj+1中的终结符应满足下优先关系:
()、()、()。
12、在编译程序中符号表用来存放语言程序中出现的有关标识符的属性信息,这些信息集中反映了标识符的语义特征属性。
符号表的功能可以归结为三个主要方面,即()、作为上下文语义合法性检查的依据和作为()的依据。
13、根据优先关系矩阵计算优先函数可用迭代法或优先关系图法,但先关系图方法计算出来的优先函数不一定有效,当()时,所得的优先函数无效,这时也说明该优先关系矩阵不存在优先函数。
14、当一个过程调用其他过程时,调用过程和被调用过程之间的通信经由非局部变量或者经由参数传递,常用的参数传递方式有()、()等。
15、现代很多编译程序都采用()翻译方法,它是指在语法分析过程中,随着分析的步步进展,根据每个规则所对应的语义子程序或语义动作进行翻译的办法。
这种方法使用()为工具来说明程序设计语言的语义。
二、结合你所熟悉的一门高级语言的编译系统,简述典型编译程序在各个工作阶段的任务。
(共7分)
三、给定正规式R=(01|10)(01|10)*,要求:
(10分)
1、构造对应的正规文法G,使得L(G)=L(R)。
(4分)
2、构造对应的NFAM状态图,使得L(M)=L(R)。
(3分)
3、将所得NFAM确定化为DFA。
(3分)
四、现有文法G[E]:
(共10分)
E→E+T|E-T|T
T→T*F|T/F|F
F→i|(E)
1、证明:
E-F*(i)是文法的一个句型。
(3分)
2、构造句型E-F*(i)的语法推导树。
(2分)
3、指出该句型所有短语、直接短语和句柄。
(5分)
五、任意给定一个文法G[S]:
(10分)
1、给出判断G[S]是否为LL
(1)文法的步骤。
(4分)
2、如果G[S]是LL
(1)文法,怎样构造它的预测分析表?
(3分)
3、怎样根据预测分析表对给定的某个输入串进行预测分析?
(3分)
六、现有文法G[E]:
(共15分)
E→E;D|D
D→D(T)|H
H→a|(E)
T→T*E|E
1、计算G[E]的FIRSTVT和LASTVT;(4分)
2、构造G[E]的算符优先关系表,并说明G[E]是否为算符优先文法;(5分)
3、给出输入串(a*a)#的算符优先分析过程,并据此说明算符优先分析方法的优点和缺点。
(6分)
七、现有文法G[S’]:
(共18分)
0)S'→S
1)S→L=R
2)S→R
3)L→*R
4)L→i
5)R→L
1、构造G[S’]的LR(0)项目集规范族DFA,并据此判断G[S’]是否为LR(0)文法或SLR
(1)文法。
(6分)
2、构造G[S’]的LR
(1)项目集规范族DFA,并据此判断G[S’]是否为LR
(1)文法或LALR
(1)文法。
(6分)
3、给出相应的LALR
(1)分析表。
(3分)
4、简述LR分析算法。
(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
参考答案
图中存在环/回路
传值、传地址
语法制导、属性文法
第二题:
(7分)
典型编译程序在各个工作阶段的任务参考答案:
1、词法分析阶段的任务:
对构成源程序的字符串进行扫描和分解,识别出单词(如标识符等)符号序列。
(1分)
2、语法分析阶段的任务:
根据语言的语法规则对单词符号串(符号序列)进行语法分析,识别出各类语法短语(可表示成语法树的语法单位),判断输入串在语法上是否正确。
(1分)
3、语义分析阶段的任务:
按语义规则对语法分析器归约出的语法单位进行语义分析,审查有无语义错误,为代码生成阶段收集类型信息,并进行类型审查和违背语言规范的报错处理。
(1分)
4、中间代码生成阶段的任务:
将语义分析得到的源程序变成一种结构简单,含义明确,容易生成,容易译成目标代码的内在代码形式。
(1分)
5、代码优化阶段的任务:
对中间代码或目标代码进行等价的变换改造等优化处理,使生成的代码更高效。
(1分)
6、目标代码生成阶段的任务:
将中间代码生成特定机器上的绝对或可重定位的指令代码或汇编指令代码。
(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分)
第五题:
(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是栈顶状态,a是输入指针ip所指向的当前符号;
1)令ip指向输入串的第一个符号;将#压入符号栈,将开始状态0压入状态栈;
2)重复执行如下过程:
if(action[s,a]=sj)
{把符号a入符号栈,把状态j入状态栈;
使ip指向下一个输入符号。
}
elseif(action[s,a]=rj)
{从栈顶弹出第j条规则右部串长|β|个符号;
把归约得到的非终结符A压入符号栈;
将goto[s,A]的值j压入状态栈;
并输出规则A→β。
}
elseif(action[s,a]=acc)
return;/*分析成功*/
else
error();/*报错*/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 试题