编译重点题.docx
- 文档编号:29517362
- 上传时间:2023-07-24
- 格式:DOCX
- 页数:31
- 大小:580.43KB
编译重点题.docx
《编译重点题.docx》由会员分享,可在线阅读,更多相关《编译重点题.docx(31页珍藏版)》请在冰豆网上搜索。
编译重点题
●对下列错误信息,请指出可能是编译的哪个阶段(词法分析、语法分析、语义分析、代码生成)报告的。
(1)else没匹配的if
(2)数组下标越界
(3)使用的函数没定义(4)在数中出现非数字字符
解:
●文法G=({A,B,S},{a,b,c},P,S),其中P:
S→Ac|aB,A→ab,B→bc。
写出L(G[S])的全部元素。
解:
L(G[S])={abc}
●文法G[N]:
N→D|ND,D→0|1|2|3|4|5|6|7|8|9。
G[N]的语言是什么。
解:
长度至少为1的任意的数字串。
●为只包含数字、加号和减号的表达式,例如9-2+5,3-1,7等构造一个文法。
解:
G[E]:
E→D|E+E|E-E
D→0|1|2|3|4|5|6|7|8|9
●已知文法G[Z]:
Z→aZb,Z→ab。
写出L(G[Z])的全部元素。
解:
L(G[Z])={anbn|n≥1}
●写一文法,使其语言是偶正整数的集合,分别要求:
(1)允许0打头;
(2)不允许0打头。
解:
(1)文法G1[S]为:
S→AB,A→ε|D|DA,B→0|2|4|6|8,D→0|1|2|3|4|5|6|7|8|9
(2)文法G2[S]为:
S→C,S→EAB,A→ε|D|DA,B→0|2|4|6|8,C→2|4|6|8
D→0|1|2|3|4|5|6|7|8|9,E→1|2|3|4|5|6|7|8|9
●以下文法是否为二义文法?
解:
由于对于文法G[S]的一个句子abc,存在以下两个不同的最右推导:
最右推导1:
;最右推导2:
。
所以该文法为二义文法。
●考虑以下的上下文无关文法:
(1)说明aa+a*的推导过程,并构造相应的语法树。
(2)该文法描述的语言是什么?
解:
(1)
;
(2)*和+运算的逆波兰式。
●文法
(1)该文法描述的语言是什么?
(2)该文法是否为二义文法?
说明理由。
解:
(1)任意匹配的括号串。
(2)由于对于该文法的一个句子()(),存在以下两个不同的最右推导:
最右推导1:
最右推导2:
。
所以该文法为二义文法。
●对于文法G[E]:
。
证明
是它的一个句型,指出此句型的所有的短语、直接短语和句柄。
解:
按照句型的定义,由于存在推导
,所以
是该文法的一个句型。
通过构造该句型的语法树,可以直观地看出句型的所有的短语、直接短语和句柄。
该句型的语法树如下:
;所有的短语:
、
;所有的直接短语:
;句柄:
。
●一个上下文无关文法生成句子abbaa的推导树如下:
(1)给出该句子的最左推导和最右推导。
(2)该文发的产生式集合P可能哪些元素?
(3)给出该句子的所有短语、直接短语和句柄。
(1)最左推导:
最右推导:
(2)该文发的产生式集合P可能的元素:
、
、
、
、
、
。
(3)所有短语:
abbaa、a、bb、aa、ε、b;所有直接短语:
a、ε、b;句柄:
a。
●给出生成下述语言的3型文法:
(1)
;
(2)
;(3)
解:
(1)该语言可以使用如下自动机表示:
;然后再转换为如下的文法表示:
(2)该语言可以使用如下自动机表示:
;然后再转换为如下的文法表示:
(3)该语言可以使用如下自动机表示:
;然后再转换为如下的文法表示:
●已知NFA=({x,y,z},{0,1},M,{x},){z}),其中M(x,0)={z},M(y,0)={x,y},M(z,0)={x,z},M(x,1)={x},M(y,1)={},M(z,1)={y},构造相应得DFA。
解:
●将以下的NFA确定化。
解:
先将NFA确定化:
重新命名状态子集,令VQ为A、QU为B、VZ为C、V为D、QUZ为E、Z为F。
●分别将下面的NFA确定化和最小化。
(1)
(2)
解:
(1)
M={1}∪{0,01};显然,状态0和01为等价状态。
删除状态01得到:
(2)该自动机已经是DFA:
M={0}∪{1,2,3,4,5}
·
{1,2,3,4,5}按照a可划分为{1,2,3,5}∪{4}
M={0}∪{1,2,3,5}∪{4}
·
{1,2,3,5}按照b可划分为{1,5}∪{2,3}
M={0}∪{1,5}∪{2,3}∪{4}
·
{2,3}按照a可划分为{2}∪{3}
M={0}∪{1,5}∪{2}∪{3}∪{4}
已不可再划分,所以,状态1和5为等价状态,删除5得到最小DFA为:
●构造一个DFA,它接受∑={0,1}上所满足如下条件的字符串:
每个1都有0直接跟在右边。
然后构造该语言的正则文法。
解:
该语言使用正规式可描述为:
(10|0)*。
给文法G[S]:
;构造相应的最小DFA。
解:
相应的NFA为:
确定化:
M={S,A,Q,D,B}∪{BZ,DZ}
·
{S,A,Q,D,B}按照b可划分为{S,D,B}∪{A,Q}
M={S,D,B}∪{A,Q}∪{BZ,DZ}
·
{S,D,B}按照b可划分为{S}∪{D,B}
M={S}∪{D,B}∪{A,Q}∪{BZ,DZ}
已不能再划分,所以,状态D与B、A与Q、BZ与DZ分别为等价状态。
删除D、Q和DZ得到最简
●给出下述文法对应的正规式:
解:
已知文法G[S]:
S→aH,H→aMd|d,M→Ab|ε,A→aM|e
①判断G[S]是否为LL
(1)文法,若是,构造相应的预则分析表。
②若G[S]为LL
(1)文法,给出输入串aaabd#的分析过程,并说明该串是否为G[S]的句子。
解:
①【第1步】求出能推导出ε的非终结字符。
【第2.1步】计算每一个终结或非终结字符X的FIRST集合:
First(S)={a};First(H)={a,d};First(M)=first(A)∪{ε}={a,e,ε};First(A)={a,e}
【第2.2步】计算每一个产生式右部的FIRST集合:
First(aH)={a};First(aMd)={a};First(d)={d};First(Ab)=first(A)={a,e}
First(ε)={ε};First(aM)={a};First(e)={e}
【第3步】计算每一个非终结字符X的FOLLOW集合:
Follow(S)={#};Follow(H)=follow(S)={#};Follow(M)={d}∪follow(A)={b,d};Follow(A)={b}
【第4步】计算每一个产生式的SELECT集合:
Select(S→aH)={a};Select(H→aMd)={a};Select(H→d)={d};Select(M→Ab)=first(Ab)={a,e}
Select(M→ε)=follow(M)={b,d};Select(A→aM)={a};Select(A→e)={e}
【第5步】判别是否为LL
(1)文法:
由于:
Select(H→aMd)∩Select(H→d)=Φ;Select(M→Ab)∩Select(M→ε)=Φ
Select(A→aM)∩Select(A→e)=Φ
所以,该文法为LL
(1)文法。
②
●文法G[S]:
①试对G[S]进行改写,并判断改写后的文法是否为LL
(1)文法?
②通过这个例子,能够说明什么?
解:
①文法存在间接左递归,应该先将间接左递归转换为直接左递归。
有以下两种转换方法:
转换方法1:
将
代入
中的A,将间接左递归转换为直接左递归后,文法转换为:
消除关于S的直接左递归后,文法转换为:
由于
;所以,改写以后的文法为LL
(1)文法。
转换方法2:
将
代入
中的S,将间接左递归转换为直接左递归后,文法转换为:
消除关于A的直接左递归后,文法转换为:
由于
;
;所以,改写以后的文法不是LL
(1)文法。
②这个例子表明:
·
消除左递归后,文法不一定能够成为LL
(1)文法,无左递归只是LL
(1)文法的必要条件。
·
以不同的消除左递归方法得到的各文法,有些是LL
(1)文法,有些则不是。
●对文法G[S]:
(1)给出
和
的最左推导。
(2)判断文法是否为LL
(1)文法,若不是,将文法改写为LL
(1)文法。
(3)给出预测分析表。
(4)给出输入串
的分析过程,并说明该串是否为G的句子。
解:
(1)
(2)文法中存在左递归,故G不是LL
(1)文法。
消除左递归后,文法为:
;显然,所以改写以后的文法是LL
(1)文法。
(3)
(4)
●对下面的文法G:
(1)计算每个非终结字符的FIRST集和FOLLOW集。
(2)证明此文法为LL
(1)文法。
(3)构造预测分析表。
解:
(1)
由于:
First(E)=first(T);First(E’)={+,ε};First(T)=first(F);First(T’)=first(T)∪{ε};
First(F)=first(P);First(F’)={*,ε};First(P)={(,a,b,
};
所以:
First(E)=first(T)=first(F)=first(P)={(,a,b,
};First(E’)={+,ε};
First(T)=first(F)=first(P)={(,a,b,
};First(T’)=first(T)∪{ε}={(,a,b,
ε};
First(F)=first(P)={(,a,b,
};First(F’)={*,ε};First(P)={(,a,b,
};
Follow(E)=follow(E’)∪{)}∪{#}=follow(E’)∪{),#};Follow(E’)=follow(E);
Follow(T)=[(first(E’)-{ε})∪follow(E)]∪follow(T’)={+}∪follow(E)∪follow(T’);
Follow(T’)=Follow(T);Follow(F)=[(first(T’)-{ε})∪follow(T)]={(,a,b,
}∪follow(T);Follow(F’)=Follow(F)∪Follow(F’)=Follow(F);
Follow(P)=(first(F’)-{ε})∪follow(F)={*}∪follow(F);
第1次迭代,设Follow(E)={),#}
Follow(E’)=follow(E)={),#}
Follow(T)={+}∪follow(E)∪follow(T’)={+,),#}∪follow(T’)
再设Follow(T)={+,),#}
Follow(T’)=Follow(T)={+,),#}
Follow(F)={(,a,b,
}∪follow(T)={(,a,b,
+,),#}
Follow(F’)=Follow(F)={(,a,b,
+,),#}
Follow(P)={*}∪follow(F)={(,a,b,
+,*,),#}
第2次迭代
Follow(E)=follow(E’)∪{),#}={),#}∪{),#}={),#}与第1次迭代结果相同
Follow(E’)=follow(E)={),#}与第1次迭代结果相同
Follow(T)={+}∪follow(E)∪follow(T’)={+}∪{),#}∪{+,),#}={+,),#}与第1次迭代结果相同
Follow(T’)=Follow(T)={+,),#} 与第1次迭代结果相同
Follow(F)={(,a,b,
}∪follow(T)={(,a,b,
}∪{+,),#}={(,a,b,
+,),#}与第1次迭代结果相同
Follow(F’)=Follow(F)={(,a,b,
+,),#}与第1次迭代结果相同
Follow(P)={*}∪follow(F)={*}∪{(,a,b,
+,),#}={(,a,b,
+,*,),#}与第1次迭代结果相同
由于两次迭代结果相同,故迭代结束。
(3)
由于任何具相同左部的产生式的select集的交集均为空,所以,该文法为LL
(1)文法。
(4)
●判断下述文法G[S]是否为LL
(1)文法;若是,构造LL
(1)分析表。
解:
由于
所以
由于任何具相同左部的产生式的select集的交集为空,所以,该文法为LL
(1)文法。
以下为LL
(1)分析表:
●已知布尔表达式文法G[B]为:
;其中:
o表示or;a表示and;n表示not;t表示true;f表示false。
(1)G[B]是否为算符优先文法?
(2)若G[B]是算符优先文法,给出串ntofat的分析过程。
解:
(1)
;
;
;
;
;
。
优先关系:
(2)
●已知文法G[S]为:
(1)计算G[S]的给非终结字符的FirstVT和LastVT。
(2)构造G[S]的优先关系矩阵,并说明该文法是否为算符优先文法。
(3)计算G[S]的优先函数。
(4)给出输入串(a,a)和(a,(a,a))的算符优先分析过程。
(5)给出输入串(a,a)和(a,(a,a))的最右推导和规范归约过程。
(6)根据(4)和(5),说明算符优先归约和规范归约的区别。
解:
(1)
(2)(3)
(4)
(5)
(6)区别在于:
算符优先分析是将句型中的句柄(实际上是最左素短语)归约为一个任意的非终结字符,因而不存在单非终结字符的归约,所以归约速度要快于规范归约。
●文法G[S]:
(1)给出(+(i(的规范推导。
(2)指出F+Fi(的短语、句柄和素短语。
(3)G[S]是否为OPG?
若是,给出句子(+(i(的分析过程。
解:
(1)
(2)
;短语:
F+Fi(、F+F、F、(;句柄:
F;素短语:
F+F、(
(3)
由于优先关系唯一,所以是OPG。
●已知文法G[S]为:
(1)构造G[S]的算符优先关系矩阵,并判断是否为算符优先文法。
(2)给出句型
的短语、句柄、素短语和最左素短语。
(3)给出
和
的算符优先分析过程,说明它们是否为G[S]的句子。
(4)给出
和
的最右推导过程,说明它们是否为G[S]的句子。
(5)由(3)和(4)说明了算符优先分析的那些缺点。
(6)算符优先分析和规范归约过程都是最右推导的逆过程吗?
解:
(1)
由于优先关系唯一,所以该文法为算符优先文法。
(2)
(3)(4)
(5)不能识别某些错误的句子。
(6)不是。
●设文法G[S]为:
(1)该文法是否为SLR
(1)文法?
(2)若是,构造其SLR
(1)分析表。
(3)给出输入串baab的分析过程。
解:
(1)得到该文法的拓广文法G'[S']如下,
然后构造该文法的LR(0)项目集规范族:
I0和I5均存在以下的移入-归约冲突:
计算follow(A)=[first(B)-{ε}]∪follow(S)∪{b}={b,#},
由于follow(A)∩{a}=Φ,所以I0和I5的移入-归约冲突可由SLR
(1)解决。
I2和I3均存在以下的移入-归约冲突:
计算follow(B)=follow(S)∪{a}={a,#},
由于follow(B)∩{b}=Φ,所以I2和I3的移入-归约冲突可由SLR
(1)解决。
由于所的冲突都可以由SLR
(1)解决,所以该文法为SLR
(1)文法。
(2)SLR
(1)分析表
状态
ACTION
GOTO
a
b
#
S
A
B
0
S3
R3
R3
1
2
1
acc
2
r5
S5
r5
4
3
r5
S5
r5
6
4
r1
5
S3
r3
r3
7
6
S8
7
S9
8
r2
r2
9
r4
r4
(3)对输入串baab的分析过程
●已知文法
判断该文法是否为SLR
(1)文法,若是,请构造相应的分析表,并给出串ab的分析过程。
解:
在I0和I2中均存在以下的移入-归约冲突
计算Follow(A)={b,d,#},由于
,所以,该文法为SLR
(1)文法。
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
对输入串ab的分析过程
步骤
状态栈
符号栈
输入串
ACTION
GOTO
1
0
#
ab#
S2
2
02
#a
b#
r3
3
3
023
#aA
b#
S5
4
0235
#aAb
#
r2
1
5
01
#A
#
acc
●考虑文法
(1)列出这个文法的所有LR(0)项目。
(2)构造识别这个文法活前缀的NFA,把这个NFA确定化为DFA。
(3)该文法是否为SLR
(1)文法?
若是,构造它的SLR
(1)分析表。
(3)该文法是否为LR
(1)文法或LALR
(1)文法?
解:
(1)
(2)
(3)
计算follow(A)={a,b},由于
,
所以J5的移入-归约冲突不可由SLR
(1)解决。
故该文法不是SLR
(1)文法。
(4)可以证明该文法为二义性文法,比如句子abab存在以下两个不同的最右推导:
而任何二义性文法不会是任何LR文法。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 点题