1、3-5章 要点和习题讲解,在NFA-DFA的过程:首先确定化(子集法),然后最小化。在确定化的过程中是没有意义的,不需要继续另外标记和讨论,不作处理。DFA和NFA的区别: (1).DFA初态唯一,NFA初态不唯一; (2).映射:DFA中同一状态上射出的弧上的标记不能相同,NFA则可以相同。(此点常考,也是NFA之所以非确定的本质所在) (3).弧上的标记:NFA可以是字符串或者空子,但是DFA只能是单个字符。,第三章作业问题,chapter3,7.构造下列正规式相应的DFA。,步骤:,.根据正规式画出对应的状态转换图;,.根据状态转换图画出对应的状态转换矩阵;,.根据状态转换矩阵得到重命名
2、后的状态转换矩阵;,.根据重命名后的状态转换矩阵得出最后的DFA.,问题:将状态转换图与DFA混淆。,1(0|1)*101,.状态转换图,a,b,a,d,b,1(0|1)*101,a,1,(0|1)*,101,d,c,e,f,1,0,1,1,0,1,.状态转换矩阵,I,I0,I1,a,b,c,d,b,c,d,c,d,c,d,e,c,d,c,d,c,d,e,c,d,e,c,d,f,c,d,e,c,d,f,c,d,c,d,e,g,c,d,e,g,c,d,f,c,d,e,.重命名后的状态转换矩阵,S,0,1,A(始态),B,B,C,D,C,C,D,D,E,D,E,C,F(终态),F(终态),E,D,
3、A,B,1,0,C,1,D,0,1,0,E,1,0,1,0,1,.DFA,7. 问题:没构造出DFA;没过程;方法没掌握。(1) 1(0|1)*101 解1: 正规式对应的NFA:,(1) 正规式 1(0|1)*101,DFA:,初始: 0,1,2,3,4和5 0,1,2,3,40=2,40,1,2,3,41=1,3,5 划分为0,1,2,3和4 0,1,2,30=2,4 划分为0,1,2和3 0,1,21=1,3 划分为0和1,2 1,20=2 1,21=3 最后划分得5个子集:0, 1,2, 3, 4, 5,最小化DFA:,(3) 正规式 0*10*10*10*,DFA:,最小化DFA:,
4、NFA:,8、给出下面正规表达式,(3)包含奇数个1或奇数个0的二进制串。,0*1(0|10*1)* | 1*0(1|01*0)*,9、对下面情况给出DFA及正规表达式:,(1)0,1上的含有子串010的所有串。,正规式:(0 | 1)* 010 (0 | 1)*,14、构造一个DFA,它接受=0,1上所有满足如下 条件的字符串:每个1都有0直接跟在右边。,思路:先写出满足条件的正规式,由正规式构造NFA,再把NFA确定化和最小化。,满足条件的正规式:(0|10)*,正规式不同,则构造的NFA及确定化的DFA可能 不同,但最小化的DFA是唯一的。,最小化后的DFA:,14. 构造DFA, 它接
5、受=0,1上所有满足如下条件的字符串: 每个1都有0直接跟在右边,确定化,最小化,14.问题:没构造出DFA;没过程;方法没掌握。(1) 正规式: (10|0)*(2) NFA: 确定化:,DFA:,右线性正规文法到有穷自动机的转换方法,设给定一个右线性正规文法 G=(VN,VT,P,S),则相应的有穷自动机 M=(Q,f,q0,Z) (1)将VN中的每一个非终结符视作 M 中的一个状态, 并增加一个新终态 D,且 DVN, 令 Q=VND, Z=D, =VT, q0=S (2)对 AaB(A,BVN,aVT ),令f(A,a)=B。 构造弧(3)对 Aa(AVN,aVT ),令f(A,a)=
6、D。 构造弧这样构造的 M 是具有一个开始符号的 NFA,这个 NFA 能够且只能识别正规文法 G 所描述的语言。,左线性正规文法到有穷自动机的转换方法,设给定一个左线性正规文法 G=(VN,VT,P,S),则相应的有穷自动机 M=(Q,f,q0,Z) (1)将VN中的每一个非终结符视作 M 中的一个状态,并增加一个初始状态 q0,且 q0VN, 令 Q=VNq0,Z=S,=VT (将文法G的开始符号S看成终态) (2)对 ABa(A,BVN,aVT )令f(B,a)=A。 构造弧(3)对 Aa(AVN,aVT ),令f(q0,a)=A。 构造弧这样构造的 M 是具有一个开始符号的 NFA,这
7、个 NFA 能够且只能识别正规文法 G 所描述的语言。,有穷自动机到正规文法的转换方法,设给定有穷自动机 M=(Q,f,q0,Z),按照下述方法可以从 M 构造出相应的正规文法 G=(VN,VT,P,S), 使得L(M)=L(G) (1)令 VN=Q,VT=,S=q0 (2)若f(A,a)=B且BZ时, 则将规则 AaB 加到P中。 (3)若f(A,a)=B且BZ时,则将规则 AaBa 或 AaB, B 加到P中。 (4)若文法的开始符号 S 是一个终态,则将规则 S 加到P中。,15、给定右线性文法G:求一个与G等价的左线性文法。,S 0S | 1S | 1A | 0B A 1C | 1 B
8、 0C | 0 C 0C | 1C | 0 | 1,GZ: Z Z0|Z1|B0|A1 B A0 | 0 A B1 | 1,确定化、最小化后的DFA为:,15.问题:没转换过程;转换方法没掌握。S0S|1S|1A|0BA1C|1B0C|0C0C|1C|0|1,GRFA:,FA GL : fA1|B0|C1|C0AS1|1BS0|0CA1|B0|C1|C0SS0|S1|1|0,chapter4,2.(1)计算FIRST和FOLLOW (2)证明此文法是LL(1) (3)预测分析表 (4)递归下降程序,FIRST(E)=(,a,b, FIRST(E)=+, FIRST(T)=(,a,b, FIRS
9、T(T)=(,a,b, FIRST(F)=(,a,b, FIRST(F)=*, FIRST(P)=(,a,b,FOLLOW(E)=#,) FOLLOW(E)=#,) FOLLOW(T)=+,),# FOLLOW(T)=+,),# FOLLOW(F)=(,a,b,+,),# FOLLOW(F)=(,a,b,+,),# FOLLOW(P)=*,(,a,b,+,),#,(2)考虑下列产生式:,FIRST(+E)FIRST()=+= FIRST(+E)FOLLOW(E)=+#,)= FIRST(T)FIRST()=(,a,b,= FIRST(T)FOLLOW(T)=(,a,b,+,),#= FIRST
10、(*F)FIRST()=*= FIRST(*F)FOLLOW(F)=*(,a,b,+,),#= FIRST(E)FIRST(a) FIRST(b) FIRST()= 所以,该文法式LL(1)文法.,对每个文法符号 XVTVN,构造FIRST(X)。,若XVT,则 FIRST(X)=X。 若XVN,且有规则Xa,aVT,则aFIRST(X)。 若XVN,且有规则X,则FIRST(X)中。 若有规则XY1Y2Yn,对任意的i(1in), 当Y1Y2Yi-1都是非终极符且Y1Y2Yi-1= (即对任何j(1ji-1),FIRST(YJ)都含有), 则把 FIRST(Yi)中的所有非-元素加到 FIR
11、ST(X)中; 特别地,若Y1Y2Yn=(即所有的FIRST(Yj)中均含有,1jn),则FIRST(X)。 反复使用上面的规则,直到每个FIRST集不再增大为止,对每个非终极符 AVN 构造FOLLOW(A),对文法的开始符号 S,置#于FOLOOW(S)中; 若AB 是一个规则,则把FIRST()-加到FOLLOW(B)中; 若AB 是一个规则, 或AB 是一个规则,而 =,即FIRST(),则把FOLLOW(A)加至FOLLOW(B)中。 反复使用上面的规则,直到每个非终结符的FOLOOW集 不再增大为止。,*,对文法G的每个非终极符A及其任意候选都构造出FIRST()和FOLLOW(A
12、)之后,就可以用它们来构造分析表 MA,a。(1)对文法G的每个产生式A ,执行第二步和第三步;(2)对每个终极符a FIRST( ),把A 加至MA,a中;(3)若 FIRST(),则对任何b FOLLOW(A),把A 加至MA,a中;(4)把所有无定义的MA,a标上“出错标志”。 结论:一个文法G的预测分析表M不含多重入口,当且仅当该文法为LL(1)文法。,预测分析表的构造,procedure E; beginif sym=( or sym=a or sym=b or sym= then begin T; E endelse error end procedure E; beginif s
13、ym=+ then begin advance; E endelse if sym) and sym# then error end procedure T; beginif sym=( or sym=a or sym=b or sym= then begin F; T endelse error end procedure T; beginif sym=( or sym=a or sym=b or sym= then T else if sym=* then error end,procedure F; beginif sym=( or sym=a or sym=b or sym= then
14、 begin P; F endelse error end procedure F; beginif sym=* then begin advance; F end end procedure P; beginif sym=a or sym=b or sym= then advanceelse if sym=( thenbeginadvance; E;if sym=) then advanceelse errorendelse error end;,chapter5,1、令文法G1为:EE+T | TTT*F | FF(E) | i证明E+T*F是它的一个句型,指出这个句型的所有 短语、直接短
15、语和句柄。,T*F是句型E+T*F相对于T的短语,E+T*F句型E+T*F相对于E的短语,T*F是句型E+T*F相对于T的直接短语,T*F是句柄,2、考虑下面的表格结构文法G2: Sa | | (T) T T,S | S,(1)给出(a,(a,a)和(a,a),(a),a)的最左和最右推导。,(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),(a,a),(a),a)的最左推导: S (T) (T,S) (S,S) (T),S) (T,S),S) (T,S,S),S) (S,S,S)
16、,S) (T,S),S,S),S) (S,S),S,S),S) (a,S),S,S),S) (a,a),S,S),S) (a,a),S),S) (a,a),a),S) (a,a),a),a),(a,a),(a),a)的最右推导: S (T) (T,S) (S,S) (S,a) (T),a) (T,S,S),S) (S,S,S),S) (T,S),S,S),S) (S,S),S,S),S) (a,S),S,S),S) (a,a),S,S),S) (a,a),S),S) (a,a),a),S) (a,a),a),a),(a,(a,a)的最右推导: S (T) (T,S) (T,(T) (T,(T,
17、S) (T,(T,a) (T,(S,a) (T,(a,a) (S,(a,a) (a,(a,a),2)指出(a,a),(a),a)的规范归约及每一步的句柄。,S,(,T,),T,S,a,(,T,),S,T,S,T,S,(,T,),S,a,(,T,),S,T,S,a,S,a,a,Sa,(S,a),(a),a),S,TS,(T,a),(a),a),a,Sa,(T,S),(a),a),T,S,TT , S,(T),(a),a),(T),S(T),(S,(a),a),S,TS,(T,(a),a),S,(T,S,(a),a),T,S,TT , S,根据这个规范规约,给出“移进归约”的过程, 并给出它的语法
18、树的自下而上的构造过程。,符号栈,输入串: ( ( ( a , a ) , , ( a ) ) , a ) #,S,(,T,),T,S,a,(,T,),S,T,S,T,S,(,T,),S,a,(,T,),S,T,S,a,S,a,(,(,(,a,S,T,a,S,S,),T,S,T,(,a,S,T,),S,),S,T,a,S,T,),S,3、(1)计算练习2文法G2的FIRSTVT和LASTVT。 G2: Sa | | (T) T T,S | S,FIRSTVT(S)= a, ,( ,FIRSTVT(T)=, , a, ,(,LASTVT(S)=a, ,),LASTVT(T)=, , a, ,),
19、1、文法是算术文法,且不含产生式。 2、由优先关系矩阵可知,任何两个终结符之间的优先关系不多于一种。 综上,该文法是算术优先文法。,2019/3/28,33,构造 FirstVT(A) 的规则: 若有规则 Aa. 或 ABa., 则 aFirstVT(A) 若 aFirstVT(B),且有产生式AB., 则 aFirstVT(A) 构造 LastVT(A) 的规则: 若有产生式 A.a 或P.aB, 则 aLastVT(A) 若 aLastVT(B),且有产生式 A.B, 则 aLastVT(A),FirstVT(A) 、LastVT(A)的构造,2019/3/28,34,按步骤构造如下: (
20、1)逐条扫描产生式,因有产生式F(E),则有( = )。 (2)寻找终结符在左边,非终结符在右边的符号对有 EE+T +T 则 + + TT*F T* 则 LastVT(F) * F(E) E) 则 LastVT(E) ) (3)# #, # = #。,【例(续)】构造该文法的算符优先关系表。,输入串(a,(a,a)的算符优先过程。,(,a,(,a,a,),),#,a,S,#(S,(a,a)#,a,S,#(S,(S,a)#,a,S,#(S,(S,S)#,S,S,T,#(S,(T)#,(T),S,#(S,S)#,S,S,T,#(T)#,(T),S,#S#,确认!,问题:没有依据最左素短语进行规约,(1)LR(0)文法:栈内一旦形成句柄就可以规约。不存在移近-规约,规约-规约的冲突。(不考察待输入项,形成句柄就规约。) (2)SLR文法:可根据待规约的非终结符的FOLLOW集来解决移近-规约冲突,和部分规约-规约冲突。(根据待输入项进行规约或移近。) (3)LR(1)文法:根据规范句型的活前缀进行规约处理规约-规约冲突。(也就是说结合栈中的串和待输入项进行规约。) (4)LALR文法:主要来处理LR(1)文法多项目集的问题。方法是合并同心集。如果同心集合并以后出现了规约-规约冲突则不是LALR文法。显然其功能不如LR(1)强大。,