当前位置:文档之家› 编译原理复习题目集答案

编译原理复习题目集答案

第4章词法分析
重点内容:正规式转化为DFA
a、正规式->NFA
b、NFA -> DFA(子集法)
c、DFA化简(分割法)
题目1:课件例题:
a、为R=(a|b)*(aa|bb)(a|b)*构造NFA
b、从NFA构造DFA的算法
c、化简
题目2:
4.7 例1:构造正规式相应的DFA:1(0|1)*101
按照以下三步:
(1)由正规表达式构造转换系统(NFA)
(2)由转换系统(NFA)构造确定的有穷自动机DFA
(3)DFA的最小化
答:(1)构造与1(0|1)*101等价的NFA
(2)将NFA转换成DFA:采用子集法,即DFA的每个状态对应NFA的一个状态集合:
除X,A外,重新命名其他状态:
1、将M 的状态分成非终态和终态集{X,A,B,C}和{D}。

2、寻找子集中不等价状态{X,A,B,C}=>{X},{A,B}{C}=>{X}{A}{B}{C},无需合并。

最后生成
DFA :
题目3:自习、书本练习4.7,参考答案见《z4 书本练习4.7.doc 》 已知文法G[S]:
S →aA|bQ A →aA|bB|b B →bD|aQ Q →aQ|bD|b E →aB|bF F →bD|aE|b 1、 构由于不可到达,去除E 、F 相关的多余产生式 2、 由新的G[S]构造NFA 如下
5、使用分割法化简以上DFA G:
5.1 令G={(0,1,3,4,6),(2,5)}// 分别为非终态和终态集
5.2 由{0,1,3,4,6}a={1,3},{0,1,3,4,6}b={3,2,5,6,4}
将{0,1,3,4,6}划分为 {0,4,6}{1,3},得G={(0,4,6),(1,3),(2,5)}
5.3 由{0,4,6}b={3,6,4},将之划分为{0},{4,6},得G={(0),(4,6),(1,3),(2,5)}
5.4 观察后,G中状态不可再分,为最小化DFA。

6、分别用 0,4,1,2代表各状态,DFA状态转换图如下:
造相应的最小的DFA
第5章自顶向下的语法分析
重点内容:LL(1)文法
a、去除左递归
b、LL(1)文法的判定(first、follow、select集)
c、预测分析表
d、使用栈和预测分析表对输入串的分析
题目1:课件例题:消除左递归+判定+分析
算术表达式文法G
E→E+T│T
T→T*F│F
F→(E)│I
d、分析输入串i+i*i#
(1)消除G的左递归得到文法G‘
E→TE '
E'→+TE'│ε
T→FT '
T'→*FT'│ε
F→(E)│i
(2)求出每个产生式的select集,G’是LL(1)文法
SELECT(E→TE' ) = { (,i }SELECT(E'→+TE' ) = { + } SELECT(E'→ε ) = { ),# }SELECT(T→FT' ) = { (,i } SELECT(T'→*FT' ) = { * }SELECT(T'→ε ) = { +,),# } SELECT(F→(E) ) = { ( }SELECT(F→ i ) = { i }
(3)依照选择集合把产生式填入分析表
注:表中空白处为出错
题目2:作业、习题5.1:消除左递归+判定+分析
G[S]:S->a|^|(T) T->T,S|S
d、分析输入串(a,a)#
文法G[S]:S->a|^|(T),T->T,S|S
(1)给出对(a,(a,a))的最左推导
(2)改写文法,去除左递归
(3)判断新文法是否LL1文法,如是,给出其预测分析表
(4)给出输入串(a,a)#的分析过程,判断其是否文法G的句子。

答:(1)对(a,(a,a))的最左推导为:
S=>(T)
=>(T,S)
=>(S,S)
=>(a,S)
=>(a,(T))
=>(a,(T,S))
=>(a,(S,S))
=>(a,(a,S))
=>(a,(a,a))
(2)改写文法为:
FIRST (→,S N) = {, }
FIRST (→ε) ={ε}
FOLLOW (N) ={)}
由于SELECT(N→,S N)∩SELECT(N→ε)={, }∩{)}=ᴓ
所以文法是LL(1)的。

(3)预测分析表:
可见输入串(a,a)#是文法的句子。

题目3:复习、书本5.6例1:判定+分析
G[S]:S→aH,H→aMd|d,M→Ab|ε,A→aM|e d、分析输入串aaabd#
(1)判断G[S]是否为LL(1)文法;若是,构造其预测分析表;
Select(H→aMd)={a} , Select(H→d)= {d} ;
Select(M→Ab)= {a,e}, Select(M→ε)= {d,b};
Select(A→aM)= {a} , Select(A→e)= {e}
相同左部产生式的select集的交集均为空,所以G[S]是LL(1)文法。

预测分析表:
(2)分析aaabd#是否G[S]的句子。

使用栈和预测分析表对输入串的分析:
第6章自底向上的语法分析
重点内容:算符优先文法
a、非终结符的firstvt集和lastvt集的计算
b、算符优先关系表
c、使用栈和算符优先关系表对输入串的归约题目1:课件例题:
文法:E→E+T|T
T→T×F|F
F→(E)|I
c、算符优先归约输入串i+i#
(1)求各非终结符的FIRSTVT集与LASTVT集
(2)计算算符优先关系表并说明此文法是否算符优先文法
(3)给出输入串i+i#的算符优先分析过程
优先关系表中无多重定义,此文法是算符优先文法
(3)对输入串i+i#的算符优先分析过程为:
题目2:作业、习题6.1、复习:
文法G[S]:S->a|^|(T) T->T,S|S
c、算符优先归约输入串(a,a)#
文法G[S]:S->a|^|(T),T->T,S|S
(1)计算G[S]的FIRSTVT、LASTVT
(2)改造算符优先关系表并说明G[S]是否算符优先文法
(3)给出输入串(a,a)#的算符优先分析过程,判断其是否文法G的句子。

答:文法展开为:S→a
S→ʌ
S→(T)
T→T,S
T→S
(2)算符优先关系表:
表中无多重入口,所以是算符优先(OPG)文法。

(3)对输入串(a,a)#的算符优先分析过程为:
题目3:自习、书本练习6.4,参考答案见《z6 书本练习6.4.doc》已知文法G[S]:
S→S;G S→G G→G(T) G→H H→a H→(S) T→T+S T→S
c、算符优先归约输入串a;(a+a)#
(1)构造算符优先关系表
FIRSTVT(S)={;}∪FIRSTVT(G) = {; , a , ( }
FIRSTVT(G)={ ( }∪FIRSTVT(H) = {a , ( }
FIRSTCT(H)={a , ( }
FIRSTVT(T) = {+} ∪FIRSTVT(S) = {+ , ; , a , ( }
LASTVT(S) = {;} ∪LASTVT(G) = { ; , a , )}
LASTVT(G) = { )} ∪ LASTVT(H) = { a , )}
LASTVT(H) = {a, }}
LASTVT(T) = {+ } ∪LASTVT(S) = {+ , ; , a ,} }
LASTVT(S)> ;
; < FIRSTVT(G)
由G→G(T…
LASTVT(G)> (
( < FIRSTVT(T)
由G→…T)
LASTVT(T)> )
由G→…(T)
( = )
由T→T+S
LASTVT(T)> +
+ < FIRSTVT(S)
由H→(S)
( < FIRSTVT(S)
LASTVT(S)> )
( = )
由S-> #S#
#< FIRSTVT(S)
LASTVT(S)> #
# = #。

相关主题