北方工业大学编译原理习题集Word格式.docx
- 文档编号:15994761
- 上传时间:2022-11-17
- 格式:DOCX
- 页数:45
- 大小:229.34KB
北方工业大学编译原理习题集Word格式.docx
《北方工业大学编译原理习题集Word格式.docx》由会员分享,可在线阅读,更多相关《北方工业大学编译原理习题集Word格式.docx(45页珍藏版)》请在冰豆网上搜索。
01DD=>
012D=>
0127
DD=>
3D=>
34
DDD=>
5DD=>
56D=>
568
句子0127、34和568的最右推导:
N7=>
ND7=>
N27=>
ND27=>
N127=>
D127=>
N4=>
D4=>
N8=>
ND8=>
N68=>
D68=>
7、写一个文法,使其语言是奇数集,且每个奇数不以0开头。
本题要构造一个文法,由它产生的句子是奇数,且不以0开头。
也就是说它的每个句子都以1、3、5、7、9中某数结尾。
如果数字只有一位,则满足要求;
如果有多位,则要求第一位不能是0;
而中间有多少位,每位是什么数字则没有要求。
因此我们可以把这个文法分3部分完成,分别用3个非终结符来产生句子的第一位、中间部分和最后一位。
引入几个非终结符,其中,一个用作产生句子的开头,可以是1到9中的数,不包括0;
一个用来产生句子的结尾,为奇数;
另一个则用来产生以非0整数开头后面跟任意多个数字的数字串,进行分解之后,这个文法就很好写了。
G(S):
A→2∣4∣6∣8∣D
B→A∣0
C→CB∣A
D→1∣3∣5∣7∣9
S→CD∣D
8、令文法为E→T∣E+T∣E-T
T→F∣T*F∣T/F
F→(E)∣i
(1)给出i+i*i、i*(i+i)的最左推导和最右推导;
(2)给出i+i+i、i+i*i和i-i-i的语法树。
解:
(1)最左推导为:
E=>
E+T=>
T+T=>
F+T=>
i+T=>
i+T*F=>
i+F*F=>
i+i*F=>
i+i*i
T=>
T*F=>
F*F=>
i*F=>
i*(E)=>
i*(E+T)=>
i*(T+T)
=>
i*(F+T)=>
i*(i+T)=>
i*(i+F)=>
i*(i+i)
最右推导为:
E+T=>
E+T*F=>
E+T*i=>
E+F*i=>
E+i*i=>
T+i*i=>
F+i*i=>
F*(E)=>
F*(E+T)=>
F*(E+F)=>
F*(E+i)
F*(T+i)=>
F*(F+i)=>
F*(i+i)=>
(2)语法树:
9、证明下面的文法是二义的:
S→iSeS∣iS∣i
根据文法二义性定义,如果要证明该文法是二义的,必须找到一个句子,使该句子具有两个不同的最右推导或两个不同的语法树。
我们首先分析这个文法,根据我们对程序语言的了解,不难发现这个文法应该是用来表示if…else…结构的(用“i”表示“if”或语句集,用e代表else)。
因此我们就要到if…else…结构中去找二义性。
我们知道,程序语言一般都规定else部分是和它前面离它最近的没有被匹配的if语句进行匹配。
而上面的这个文法体现不出这种限制,因此我们可以找这样一个句子,在else前面有两个if(如句子iiiei),else和不同的if进行匹配时就会产生不同的语义。
考虑句子iiiei,存在如下两个最右推导:
S=>
iSeS=>
iSei=>
iiSei=>
iiiei
iS=>
iiSeS=>
由此该文法是二义的。
10、把下面文法改为无二义的:
S→SS∣(S)∣()
本题给出的文法是二义的,关键在于S→SS是产生二义性的根源。
我们将该产生式改造成等价的递归结构,消除二义性。
S→TS∣T,T→(S)∣()
11、给出下面语言的相应文法:
L1={anbnci∣n≥1,i≥0},
L2={aibncn∣n≥1,i≥0}
L3={anbnambm∣n,m≥0}
L4={1n0m1m0n∣n,m≥0}
语言L1要求a和b的个数一样多,且至少为一个;
c的个数为0个以上。
因此我们可用一个非终结符去生成anbn串,用另外一个非终结符去生成ci。
语言L2要求b和c的个数一样多,因此可用一个非终结符去生成bncn,而使用另外一个非终结符去生成ai。
因此可以模仿L1生成L2。
对于L3,可将anbnambm分两段考虑,即anbn和ambm,然后用两个非终结符分别去产生他们。
L4不能采用分段处理的方式,它要求中间的0和1的个数相同,而且一前一后的0和1的个数相同。
对于这种题型我们可以采用从里向外扩展的方式进行,即先用一个非终结符生成处于中间的m个0和m个1,然后,使用另外一个非终结符在该串的基础上扩充前后的n个0和n个1。
L1的文法:
S→AC;
A→aAb∣ab;
C→cC∣ε
L2的文法:
S→AB;
A→aA∣ε;
B→bBc∣bc
L3的文法:
A→aAb∣ε;
B→aBb∣ε
L4的文法:
S→1S0∣A;
A→0A1∣ε;
第三章词法分析
1、编写一个对于Pascal源程序的预处理程序。
该程序的作用是,每次被调用时都将下一个完整的语句送进扫描缓冲区,去掉注释行,同时要对源程序列表打印。
2、请给出以下C++程序段中的单词符号及其属性值。
intCInt:
:
nMulDiv(intn1,intn2)
{
if(n3==0)return0;
elsereturn(n1*n2)/n3;
}
3、用类似C或Pascal的语言编写过程GetChar,GetBC和Concat。
4、用某种高级语言编写并调试一个完整的词法分析器。
5、证明3.3.1中关于正规式的交换律、结合律等五个关系。
6、令A、B和C是任意正规式,证明以下关系成立:
A∣A=A
(A*)*=A*
A*=ε∣AA*
(AB)*A=A(BA)*
(A∣B)*=(A*B*)*=(A*∣B*)*
A=b∣aA当且仅当A=a*b
证明:
(1)、A∣A=A
L(A∣A)=L(A)∪L(A)=L(A),所以有A∣A=A。
(2)、(A*)*=A*
(3)、A*=ε∣AA*
通过证明两个正规式所表示的语言相同来证明两个正规式相等。
L(ε∣AA*)=L(ε)∪L(A)L(A*)=L(ε)∪L(A)(L(A))*
=L(ε)∪L(A)((L(A))0∪(L(A))1∪(L(A))2∪(L(A))3∪…)
=L(ε)∪(L(A))1∪(L(A))2∪(L(A))3∪(L(A))4∪…
=(L(A))*=L(A*)
即:
L(ε∣AA*)=L(A*),所以有:
A*=ε∣AA*
(4)、(AB)*A=A(BA)*
利用正规式的分配率和结合律直接推导。
(AB)*A=((AB)0∣(AB)1∣(AB)2∣(AB)3∣…)A
=εA∣(AB)1A∣(AB)2A∣(AB)3A∣…
=Aε∣A(BA)1∣A(BA)2∣A(BA)3∣…
=A(ε∣(BA)1∣(BA)2∣(BA)3∣…)
=A(BA)*
(AB)*A=A(BA)*
(5)、(A∣B)*=(A*B*)*=(A*∣B*)*
证明:
先证(A∣B)*=(A*B*)*
因为L(A)
L(A)*L(B)*,L(B)
L(A)*L(B)*
故:
L(A)∪L(B)
于是由本题第二小题结论可知(L(A)∪L(B))*
(L(A)*L(B)*)*①
又L(A)
L(A)∪L(B),L(B)
L(A)∪L(B)
L(A)*
(L(A)∪L(B))*
L(B)*
因此有:
L(A)*L(B)*
(L(A)∪L(B))*(L(A)∪L(B))*=((L(A)∪L(B))*)2
故(L(A)*L(B)*)*
((L(A)∪L(B))*)*
由本题第二小题得:
((L(A)∪L(B))*)*=(L(A)∪L(B))*
故得:
(L(A)*L(B)*)*
(L(A)∪L(B))*②
则由①②得:
(L(A)∪L(B))*=(L(A)*L(B)*)*
由于L((A*B*))*=(L(A*B*))*=(L(A*)L(B*))*=(L(A)*L(B)*)*
即有(L(A)∪L(B))*=L((A*B*))*③
而(A|B)*对应的语言为(L(A)∪L(B))*,且(A*B*)*对应的语言为L((A*B*))*
则根据③得(A|B)*=(A*B*)*
再证:
(A*|B*)*=(A*B*)*
因为:
A,B是任意正规式,由以上结论得:
(A*|B*)*=((A*)*(B*)*)*
又由本题第二小题目的结论可得:
(A*)*=A*,(B*)*=B*
因此,(A*|B*)*=(A*B*)*
综合上述两种结论,最后得:
(A∣B)*=(A*B*)*=(A*∣B*)*
(6)、A=b∣aA当且仅当A=a*b
7、构造下列正规式相应的DFA
1(0∣1)*101
1(1010*∣1(010)*1)*0
0*10*10*10*
(00∣11)*((01∣10)(00∣11)*(01∣10)(00∣11)*)*
(1)、1(0∣1)*101
第一步:
根据正规式构造NFA,先引入初始状态X和终止状态Y:
再对该转换图进行分解,得到分解后的NFA如下图:
第二步:
对NFA进行确定化,获得状态转换矩阵:
状态
1
{X}
Ø
{1,2,3}
{2,3}
{2,3,4}
{2,3,5}
{2,3,4,Y}
根据转换矩阵获得相应的DFA:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 北方工业 大学 编译 原理 习题集