NFA的状态转换图? 正规式nfa状态图
- 编译原理:怎么用子集法将NFA转换成DFA? 用图4.16的NFA举例子
- 编译原理NFA转DFA ,DFA的状态怎么确定?下图红框框里的是怎么求来的?求解释!谢谢!
- DFA ,NFA,状态转换图 和词法分析究竟有什么关系
- 有限自动机的状态转换图显示程序的实现
编译原理:怎么用子集法将NFA转换成DFA? 用图4.16的NFA举例子
这里你要弄清子集法中,每一行,指的是变迁。比如第一行,代表状态0,画一根线到状态1,因此第1个0是指这个变迁的起点状态0,第3个1是指变迁的终点状态1。
同理,第2行是指从状态1出发,有2个变迁,即第一个是状态1指向状态1(自己),第2个变迁是从状态1到状态1和2。
这样第3行就表示如果从状态{1,2}开始,输入是0和1时的变迁分别是什么,依此类推。
你红的圈出来的就是NFA所有可能的状态和状态组合。
编译原理NFA转DFA ,DFA的状态怎么确定?下图红框框里的是怎么求来的?求解释!谢谢!
先以0开始,经过任意个ε得到的结点就是第一个状态,这道题没有ε就是{0},
看图片直观点,0因为是空,所以不用想下,重复的也不用向下。
就可以把图画出来了。
DFA ,NFA,状态转换图 和词法分析究竟有什么关系
既然你都知道它们是怎么回事儿了,怎么会不明白它们和词法分析程序的关系呢?
简单点儿说,词法分析就是进行正则表达式匹配。词法分析程序就是根据要匹配的正则表达式生成它的NFA或者DFA,再将待匹配的字符串放到这些NFA或者DFA中进行处理,从而分析出输入字符串是否匹配给定的正则表达式。
有限自动机的状态转换图显示程序的实现
有限自动机FA
描述程序设计语言中的单词字,进一步为词法分析程序的自动构造寻找特殊的方法和工具。
主要内容:
确定有限自动机DFA
确定有限自动机DFA的实现
非确定有限自动机NFA
NFA到DFA的转换
DFA的化简
确定有限自动机DFA
确定有限自动机(DFA:Deterministric Finite Automata ) 为一个五元组(∑,SS,S0,f,TS),其中:
■∑是一个有穷字母表,它的每个元素称为一个输入字符;
■SS是一个有穷集,它的每个元素称为一个状态;
■S0∈ SS是唯一的一个初始状态;
■f是在SS× ∑→ SS上的转换函数
■TS?SS,是一个终止状态集,又称为接受状态集
DFA的两种表示方式
状态转换图:
结点表示状态,转换边表示转换函数,边的箭头方向指向转换函数中定义的转换方向。标识出初始状态和终止状态。
状态转换表:
可用二维数组描述。标识出初始状态和终止状态。
Trans( SI ,a)= SJ
一个DFA的例子:
DFA M=({a,b},{S,U,V,Q}, S,f,{Q}),其中f定义为:
f ( S, a )=U f ( V, a )=U
f ( S, b )=V f ( V, b )=Q
f ( U, a )=Q f ( Q, a )=Q
f ( U, b )=V f ( Q, 1 )=Q
例子的状态转换图和状态转换表
DFA接受的字符串
对于∑*中的任何字符串t,若存在一条从初始结点到某一终止结点的路径,且这条路上所有弧的标记符连接成的字符串等于t,则称t可为DFA M所接受(识别)。
DFA M 所能接受的字符串的全体记为L(M).
DFA的确定性
初始状态唯一。
转换函数f:SS×∑→SS是一个单值函数,也就是说,对任何状态S∈SS,和输入符号a ∈ ∑, f(S,a)唯一地确定了下一个状态。即至多确定一个状态。
没有空边。即没有输入为ε(λ)
DFA的实现1
状态转换表的形式:
1.当前状态State置为初始状态
2.读一个字符 → CurrentChar
3.如果CurrentChar≠Eof并且T(State,CurrentChar)≠error
则当前状态转为新的状态T(State,Current),读下一字符。
重复第3步工作。
4.如果当前字符为Eof并且当前状态属于终止状态,则接受当前字符串,程序结束。否则报错
特点:程序短小,但占用存储空间多
DFA的实现2
状态转换图的形式:
■每个状态对应一个带标号的case语句
■转向边对应goto语句
Li: case CurrentChar of
a :goto Lj
b : goto Lk
other : Error( )
特点:程序长,但占用存储空间少
非确定有限自动机NFA
定义1:一个非确定有限自动机(NFA)A是一个五元组A=(∑,SS,S0,f,TS).其中
■∑是字母表
■SS是状态集
■S0是初始状态集
■f是转换函数,但不要求是单值的
■f: SS × (∑∪{λ}) → 2SS
■TS是终止状态集
定义2:设A是一个NFA,A= (∑,SS,S0,f,TS)
则定义L(A)为从任意初始状态到任意终止状态所接受的字符串。
L(A)={β|s0=>βs’, s0∈ S0,s’∈TS}
定义3:设A1和A2是同一个字母表上的自动机,如果有L(A1)=L(A2),则称A1和A2等价。
NFA到DFA的转换
定理1 对于每一个非确定自动机A,存在一个确定自动机A’,使得L(A)=L(A’).
转换:
符号合并: 同一状态的不同输出边标有相同的字符。
λ合并: 含有λ边
符号合并:A:NFA, A’:FA
1.令A’的初始状态为S0’=[S1,S2,…Sk],其中S1…Sk是A的全部初始状态。
2.若S’=[S1,…,Sm]是A’的一个状态,a∈∑则定义
f’(S’,a)=f(S1,a)∪f(S2,a)…∪f(Sm,a)
3.重复步骤直至不出现新的状态为止。
4.若S’=[S1,…,Sn]是A’的一个状态,且存在一个Si是A的终止状态,则令S为A’的终止状态。
λ合并 (Close(S))
1.对S状态寻找λ边,如果有令Ss={S}
2.对任意状态Si∈Ss,如果有:f(Si,λ)= Sj
则消除λ边:Ss= Ss∪Sj
重复上述操作直至没有λ边
3.对a∈∑ f(Ss,a)= ∪ f(Sk,a)
Ss={S1,…,Sm},k=1,…,m.
4.如果Ss中包含初始状态则Ss也为初始状态,
如果有终止状态,则Ss为终止状态。
NFA到DFA的转换过程:
1. NFA初始状态集的λ合并集作为DFA的初始状态。
2. 对DFA中一状态S,对a∈∑,进行符号合并和λ合并得到的状态设为S’,定义DFA的转换函数为f(S,a)=S’.
3. 直至没有新状态产生为止。
上面的例子从NFA转化为DFA
DFA的化简(极小化)
状态等价
对DFA中的两个状态S1和S2,如果将它们看作是初始状态,所接受的符号串相同,则定义S1和S2是等价的。
方法
状态合并法
状态分离法
DFA的化简
状态合并法(状态吸收方法)
寻找等价状态S1和S2
如果S2为初始状态,则S1和S2对调
S2的出现修改为S1
删除状态S2。
状态分离法
初始化为两个不等价状态集组:非终止状态组和终止状态组。
对每组中的某个状态分离出与之不等价的状态组,直至所有状态组内部状态都等价为止。
正则表达式与有限自动机等价
定理:对任一确定有限自动机A,存在一正则表达式e,使得L(A)=L(e),反之亦然。
关系图:
正则表达式到NFA的转换规则
首先扩展转换图:
DFA到正则表达式的转换规则
词法分析器的工作过程
词法分析器的设计
人工构造词法分析器过程:
1.确定词法分析器的接口,即确定词法分析器是作为语法分析的一个子程序还是作为独立一遍。
2.确定单词分类和Token结构。
3.根据2步,构造每一类单词的描述。
正则表达式→NFA→DFA
4.根据3步设计算法实现DFA。
利用工具自动生成:ScanGen Lex
单元总结
两个工具: 有限自动机、正则表达式
三个算法: 正则表达式到FA的转换
NFA到DFA的转换
DFA的化简
一个实现: DFA的实现