140 likes | 255 Views
第三章 词法分析. 第1题 构造正规式相应的 DFA:1(0|1)*101. 由正规表达式构造有穷自动机,共分三步: 由正规表达式构造转换系统( NFA) 由转换系统( NFA) 构造确定的有穷自动机 DFA DFA 的最小化. 1(0|1)*101. X. Y. ( 0|1)*. 1. 0. 1. 1. 1. X. 2. 3. 4. Y. 0|1. 1. 0. 1. 1. ε. ε. 1. 5. X. 2. 3. 4. Y. 0. 1. 0. 1. 1. ε. ε. 1. 5.
E N D
第三章 词法分析 第1题 构造正规式相应的DFA:1(0|1)*101 • 由正规表达式构造有穷自动机,共分三步: • 由正规表达式构造转换系统(NFA) • 由转换系统(NFA)构造确定的有穷自动机DFA • DFA的最小化
1(0|1)*101 X Y (0|1)* 1 0 1 1 1 X 2 3 4 Y 0|1 1 0 1 1 ε ε 1 5 X 2 3 4 Y 0 1 0 1 1 ε ε 1 5 X 2 3 4 Y 1 (1)构造与1(0|1)*101等价的 NFA
0 ε ε 1 0 1 1 A0 A1 A2 A3 A4 A5 1 A6 (2)将NFA转换成DFA 采用子集法,即DFA的每个状态对应NFA的一个状态集合 构造DFA的状态集C,假定C={T0,T1,…Ti}, 其中T0= ε- closure(A0), 对于任何a∈Σ Tia= ε-closure(Move(Ti,a))
0 ε ε 1 0 1 1 A0 A1 A2 A3 A4 A5 1 A6 { } {A1,A2,A3}=T1 {A2,A3 }=T2 {A2,A4,A3}=T3 {A2,A3 }=T2 {A2,A4,A3}=T3 {A2,A5,A3}=T4 {A2,A4,A3}=T3 {A2,A3 }=T2 {A2,A4,A6,A3}=T5 {A2,A5,A3}=T4 {A2,A4,A3}=T3 Ti Ti0 Ti1 {A0} T0 {A1,A2,A3} T1 {A2,A3 } T2 {A2,A3,A4} T3 {A2,A3,A5} T4 {A2,A3,A4,A6} T5
Ti Ti0 Ti1 {A0} T0 0 0 1 {A1,A2,A3} T1 1 0 0 1 1 {A2,A3 } T5 T2 T0 T1 T2 T3 T4 1 {A2,A3,A4} T3 0 { } {A1,A2,A3}=T1 {A2,A3,A5} T4 {A2,A3 }=T2 {A2,A4,A3}=T3 {A2,A3,A4,A6} T5 1 {A2,A3 }=T2 {A2,A4,A3}=T3 {A2,A5,A3}=T4 {A2,A4,A3}=T3 {A2,A3 }=T2 {A2,A4,A6,A3}=T5 {A2,A5,A3}=T4 {A2,A4,A3}=T3 DFA的状态转换图
0 0 1 0 1 0 0 1 1 T0 T1 T2 T3 T4 1 T5 1 (3)化简DFA:分割法,把DFA的状态集分成一些不相交的子集,使得不同的两子集的状态是可区别的,同一子集的状态是等价的。 首先,将状态分成两个子集:一个由终态组成,一个由非终态组成: { T0,T1,T2,T3,T4 } { T5 } { T0,T1,T2,T3} { T4 } { T5 } { T0,T1,T2} {T3} { T4 } { T5 } { T0} {T1,T2} {T3} { T4 } { T5 }
0 0 1 0 1 0 0 1 1 T0 T1 T2 T3 T4 1 T5 T5 1 0 0 0 1 1 0 1 1 T0 T2 T3 T4 1 在等价状态子集{T1,T2}中选状态T2做代表,消去其他状态T1,把从消去状态T1射出和射入的弧都引到代表状态T2上 得到化简后的DFA:
Y ε 0 2 3 ε ε ε 1 0 1 1 ε 6 7 8 9 X 0 1 1 ε ε 4 5 ε 作业中的问题: • 只给出了NFA,没有转换成DFA,或者没有进行DFA的化简 • 按课本上的方法构造的NFA,这种方法引进的状态个数和标记为ε的边较多,给转换成DFA带来了麻烦,容易出错 与1(0|1)*101等价的NFA为:
0 1 0 1 1 5 X 3 4 Y 1 • 区分NFA和DFA: • NFA有标记为ε的边而DFA没有 • DFA中一个状态对应一个输入符,转向一个状态,而NFA中一个状态对应一个输入符,转向一个状态集合。 不是DFA
第2题 给出下述文法所对应的正则式: S → 0A | 1B A → 1S | 1 B → 0S | 0 • 将正规文法转换称正规式 • 将每条产生式改写为正规式 产生式到正则式的转换规则: • 用代入法解正规式方程组 • 最后只剩下一个开始符号定义的正则式,其中不含非终结符
1. 将每条产生式改写为正规式 由S → 0A | 1B 得 S=0A | 1B (用规则3:A→x A→y得 A=x|y) 由A → 1S | 1 得A=1S | 1 (用规则3) 由B → 0S | 0 得B=0S | 0 (用规则3) 2. 用代入法解正规式方程组,将A、B代入S解方程组 S = 0(1S|1) | 1(0S|0) =01S|01|10S|10=(01|10)S|(01|10) 用规则2:A→xA|y 得 A=x*y S = (01|10)*(01|10)
作业中的问题 正规文法到正规式可以直接转换,不用将正规文法转换成DFA,再将DFA转换成正规式 错误1:将(01|10)*(01|10)写成= (01|10)* 错误2:将(01|10)*(01|10)写成(01|10)+,在正规式中可以出现的算符只有‘.’,‘*’, ‘(’, ‘)’, ‘|’,没有‘+’
错误3:转换到这一步S = 01S|01|10S|10的时候, =(01S|01) | (10S|10) 由S=01S|01,得 S=(01)*(01) 由S=10S|10,得S=(10)*(10) 最终得正规式(01)*(01) | (01)*(01),是错误的 规则2 :A→xA|y 得A=x*y 规则3 :A→x|y (A→x A→y)得A=x|y 规则2和3都是描述“或”产生式如何转换,规则2中A递归定义,规则3不是,产生式递归定义的时候,产生式中的或关系,不能对应到正规式的或关系上 如规则2不能按规则3来转换,得A=x*x和 A=y,最终得正规式x*x|y。
从描述的语言上看: S→ 01S|01|10S|10,以及它的正确转换(01|10)*(01|10),描述的都是01和10,任意次序,任意多个组成的串,如10010110…, 而错误的转换(01)*(01) | (01)*(01),描述的是01组成的任意长的串,如010101…或者10组成的任意长的串101010…,与原文法描述的语言不等