编译原理练习题文档格式.docx
《编译原理练习题文档格式.docx》由会员分享,可在线阅读,更多相关《编译原理练习题文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
二章:
1、文法G:
S-xSx|y所识别的语言是。
A、xyxB、(xyx)*C、xnyxn(n≥0)D、x*yx*
2、设有文法G[S]=({S,B},{b},{S-b|bB,B-bS},S),该文法所描述的语言是。
A、L(G[S])={bi|i≥0}B、L(G[S])={b2i|i≥0}C、L(G[S])={b2i+1|i≥0}D、L(G[S])={b2i|≥1}
3、给定文法AbA|cc,下面的符号串中为该文法句子的是。
cc
bcbc
bcbcc
bccbcc
bbbcc
可选项有:
A、
B、
C、
D、
4、描述语言L={ambn|n≥m≥1}的文法为。
A、Z--->
AbbA-aA|aB-bB|b
B、A-ABbA-Aa|aB-aBb|b
C、Z-AbA-aAb|a
D、Z-aAbA-Ab|aAb|ε
1、假定G是一个文法,S是它的开始符号。
如果S===〉α,则称α是一个句型,仅包含的句型称为句子。
2、设有文法G[S]:
S-bBB-cCBcCeC-dSS-aB,则VN={},VT={}。
判断
一个上下文无关文法的开始符号可以是终结符或非终结符。
1型文法对规则的限制比2型文法对规则的限制要多一些。
1、令文法G为:
ND|ND
D0|1|2|3|4|5|6|7|8|9
(1)文法G定义语言是什么?
(2)给出句子0127的最左推导和最右推导。
(1)G的语言是任意的数字串:
L(G)={a1a2..an|ai∈[0,1,2,…,9]}。
(2)最左推导:
N=>
ND=>
NDD=>
NDDD=>
DDDD=>
0DDD=>
01DD=>
012D=>
0127
最右推导:
N7=>
ND7=>
N27=>
ND27=>
N127=>
D127=>
2、证明下述文法是一个二义性文法:
SiSeS|iS|i
句子iiiei的语法树如下图所示。
SS
iSeSiS
iSiSeS
iii
同一句子对应两棵不同的语法树,故该文法是二义的。
词法分析:
1、如果两个文法产生的语言相同,则称这两个文法是等价的。
2、确定的有限自动机DFA是不确定的有限自动机NFA的一个特例。
3、两个等价的正规式所表示的正规集相同,高级语言的词法结构一般可以用正规文法来实现。
4、一张符号表的每一项(或称入口)包含两大栏,即名字栏和信息栏。
5、符号表的查找和整理技术通常有线性查找、二叉树和杂凑技术。
6、设∑={a,b},试写一正规式,其表示的正规集为“不以a开头,但以aa结尾的字符串集合”。
正规式为:
b(a|b)*aa
1、词法分析器的输入是。
A、单词符号串B、源程序C、语法单位D、目标程序
2、不是NFA的成分。
A、有穷字母表B、唯一的初始状态C、终止状态集合D、有限状态集合
3、在词法分析阶段不能识别的是。
A、标识符B、运算符C、四元式D、常数
4、对编译程序所用到的符号表,涉及的操作不包括。
A、填写或更新信息栏内容B、填入新名
C、给定名字,访问它的有关信息D、输出token字序列
1、有限自动机只有一个初态。
2、对任一个正规式r,都存在一个NFAM,使得L(M)=L(r)。
1、设∑={0,1},试写一正规式,其表示的正规集为:
“含有子串010的所有串”。
(0|1)*010(0|1)*
2、在实现编译程序时,常将词法分析程序从语法分析中独立出来,这样做有什么好处?
将词法分析程序从语法分析中独立出来,这样做有以下好处:
建立高级语言时能独立地研究词法与语法两方面的特性。
词法规则简单,因此可建立特别适用于这种文法的有效分析技术,也容易实现词法分析程序生成自动化。
可以就同一个语言为每种不同的机器编写一个词法分析程序,只编写一个共同的语法分析程序,这时只要每一个词法分析程序产生相同的符号内部表示形式供该语法分析程序使用即可。
综合题:
1、设={0,1}上的正规集S由倒数第二个字符为1的所有字符串组成,请给出该字集对应的正规式,并构造一个识别该正规集的DFA。
构造相应的正规式:
(0|1)*1(0|1)
NFA:
11
1
00
确定化:
I
{0,1,2}
{1,2}
{1,2,3}
{1,2,4}
{1,2,3,4}
0
1
0100
01
语法分析:
1、编译过程中,语法分析器的任务是。
分析单词是怎样构成的
分析单词串是如何构成语句和说明的
分析语句和说明是如何构成程序的
分析程序的结构
2、在通常的语法分析方法中,特别适用于表达式的分析。
A、算符优先分析法B、LR分析法C、递归下降分析法D、LL
(1)分析法
3、一个指明了在分析过程中的某时刻所能看到的产生是多大一部分。
A、活前缀B、前缀C、项目D、项目集
1、每个文法都能改写成LL
(1)文法。
2、一个LL
(1)文法一定是无二义的。
3、每一个算符优先文法,必定能找到一组优先函数与之对应。
4、欲构造行之有效的自上而下分析器,则只需消除左递归。
5、所有LR分析器的总控程序都是一样的,只是分析表各有不同。
6、若B为非终结符,则Aα.Bβ为移进项目。
1、语法分析最常用的两类方法是自上而下和自下而上分析法。
2、语法分析器的输入是单词符号串,其输出是语法单位。
3、一个文法G,若它的预测分析表M不含多重定义入口,则G是LL
(1)文法。
4、LL
(1)文法中,第一个L表示从左到右扫描输入串,第二个L表示最左推导。
5、应用算符优先分析技术分析句型时,每步被直接规约的是最左素短语,而应用LR分析技术时,每步被直接规约的是句柄。
6、活前缀是指规范句型的一个前缀,这种前缀不含句柄之后的任何符号。
1、对于文法G(S):
S(L)|as|aLL,S|SS
(1)画出句型(S,(a))的语法树
(2)给出句型(S,(a))的短语、直接短语、句柄和素短语。
(L)
L,S
S(L)
S
A
短语:
S、a、(a)、S,(a)、(S,(a))
直接短语:
a,S句柄:
S素短语:
a
2、考虑以下文法G:
Sa|∧|(T)
TT,S|S
(1)消去G的左递归
(2)经改写后的文法是否是LL
(1)的?
消左递归:
Sa|∧|(T)TST’T’,ST’|ε
fisrt(S)={a,∧,(}first(T)={a,∧,(}first(T’)={,,ε}
follow(S)={#,,,}}follow(T)={}}follow(T’)={}}
1.文法不含左递归
2.每个产生式的候选首符集两两不想交
3.first(T’)∩follow(T’)=φ
所以该文法是LL
(1)文法。
1、对下面的文法G:
ETE’E’+E|εTFT’T’T|εFPF’F’*F’|εP(E)|a|b|∧
(1)计算这个文法的每个非终结符的FIRST和FOLLOW。
(2)证明这个文法是LL
(1)的。
(3)构造它的预测分析表。
语义分析和中间代码生成:
1、语义分析和中间代码生成时所依据的是。
A、语法规则B、词法规则C、语义规则D、等价变换规则
2、终结符具有属性。
A、传递B、继承C、抽象D、综合
3、后缀式ab+cd+/可用表达式来表示。
A、a+b/c+dB、(a+b)/(c+d)C、a+b/(c+d)D、a+b+c/d
4、语法制导的翻译程序能同时进行和语义分析。
A、词法分析B、语法分析C、优化D、目标代码生成
5、四元式之间的联系是通过实现的。
A、指示器B、临时变量C、符号表D、程序变量
1、语法制导的翻译是基于属性文法的,属性有两类,即综合属性和继承属性。
2、在语法树中,一个结点的综合属性的值由其子结点的属性确定,而继承属性则由该结点的父结点或兄弟结点的某些属性确定。
3、语义分析阶段所生成的与源程序等价的中间表示形式可以有逆波兰表示、三元式表示和四元式表示等。
4、生成中间代码主要是为了使目标代码的优化容易实现。
1、给出下列表达式的逆波兰式:
(1)-a+b*(-c+d)
(2)a+b*(c-d)/e-f
(1)a-bc-d+*+
(2)abcd-*e/+f-
2、给出-(a+b)*(c+d)-(a+b+c)的三元式和四元式。
(其中单目运算—用@表示)
1(+,a,b)(+,a,b,T1)
2(@,1,_)(@,T1,_,T2)
3(+,c,d)(+,c,d,T3)
4(*,2,3)(*,T2,T3,T4)
5(+,a,b)(+,a,b,T5)
6(+,c,5)(+,T5,c,T6)
7(-,4,6)(-,T4,T6,T7)
优化:
1、下列优化方法不是针对循环优化进行的。
A、强度削弱B、删除归纳变量C、删除公共子表达式D、代码外提
2、对于一个基本块来说,正确的说法是。
A、只有一个入口语句和一个出口语句
B、有一个入口语句和多个出口语句
C、有多个入口语句和一个出口语句
D、只有多个入口语句和多个出口语句
数组元素的地址计算与数组的存储方式有关。
循环中的不变运算都可以提到循环外。
根据优化设计到的程序范围,优化可分为局部优化、循环优化和全局优化三个不同的级别。
局部优化是在基本块范围内进行的一种优化。
在优化中,可把循环中的不变运算提到循环外去,这种方法称为代码外提。
简答题
1、已知三地址代码序列为:
(1)i:
=1
(2)i:
=i+1
(3)j:
(4)j:
=j+1
(5)k:
=imodj
(6)ifk≠0goto(4)
(7)ifi≠jgoto(10)
(8)writeI
(9)writeln
(10)ifi<
10000goto
(2)
(11)halt
划分基本块,并画出流图
2、试把以下程序划分为基本块并作出其程序流图。
readC
A:
=0
B:
=1
L1:
=A+1
iFB≥CgotoL2
=B+1
gotoL1
L2:
writeA
halt
2、试构造以下基本块G的DAG
(1)T0:
=3.14
(2)T1:
=2*T0
(3)T2:
=R+r
(4)A:
=T1*T2
(5)B:
=A
(6)T3:
=2*T0
(7)T4:
(8T5:
=T3+T4
(9)T6:
=R-r
(10)B:
=T5*T6
已知如下翻译模式,用回填法给出a>
borc>
dande>
f的四元式序列,要求给出简单过程。
文法及其翻译模式如下:
(1)E→E1andME2{backpatch(E1.truelist,M.quad);
E.truelist:
=E2.truelist)
E.falselist:
=merge(E1.falselist,E2.falselist)
(2)E→E1orME2{backpatch(E1.falselist,M.quad);
=merge(E1.truelist,E2.truelist)
=E2.falselist}
(3)E1→id1relopid2{E.truelist:
=makelist(nextquad);
=makelist(nextquad+1);
Emit(‘j’relop.op‘,’id1.place‘,’id2.place‘,’‘0’);
Emit(‘j,-,-,0’)}
(4)M→ε{M.quad:
=nextquad}
四元式序列为:
100(j>
,a,b,0)
101(j,--,--,102)
102(j>
,c,d,104)
103(j,--,--,0)
104(j>
,e,f,0)
105(j,--,--,0)
有文法G(S):
S→A|B
A→aAb|c
B→aBb|d
试构造此方法的LR(0)项目集规范族。
1)将文法G拓广为文法G’
S’->
S
S->
A
B
A->
aAb
c
B->
aBb
d
2)列出LR(0)的所有项目:
1.S’->
•S5.A->
•aAb9.A->
•c13.B->
•aBb17.B->
•d
S•6.A->
a•Ab10.A->
c•14.B->
a•Bb18B->
d•
•A7.A->
aA•b11.S->
•B15.B->
aB•b
A•8.A->
aAb•12.S->
B•16B->
aBb•
3)用ε-CLOSURE办法构造文法G’的LR(0)项目集规范族:
I0:
S’->
•S,S->
•A,A->
•aAb,A->
•c,S->
•B,B->
•aBb,B->
I1:
S•
I2:
S->
A•
I3:
B•
I4:
A->
a•Ab,A->
•c,B->
a•Bb,B->
I5:
c•
I6:
B->
I7:
aA•b
I8:
aAb•
I9:
I10:
已知现在寄存器R,其中A是活跃变量,试将以下三地址代码翻译成汇编代码的形式。
T1:
=A+B
T2:
=T1*C
A:
=T2+D
目标代码序列为:
LDR,A
ADDR,B
MULR,C
ADDR,D
STR,A