形式系统的Regular Expression NFA

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了形式系统的Regular Expression NFA相关的知识,希望对你有一定的参考价值。

参考技术A

将正规表示式(Regular Expression)转化成NFA之演算法.
输入:定义于文字集(N T)上之正规表示式R.
输出:一个可以接受正规表示式R所定义之语言的NFA.
(1)对 所建立的NFA.
(2)对终端符号中a所建立的NFA为
每次需要一个新的状态(State)时,则给此新的状态一个新的编号,则不会有两个状能具有相同的编号.
Regular Expression NFA(cont'd)
Regular Expression NFA(cont'd)
(3)利用上述两种基本正规表示式(Basic Regular Expression)的NFA建构法,则可用此两者将复合正规表示式(Compound Regular Expression) 建构成NFA.根据下述的转换规则便可顺利的将正规表示式R建立成一个完整的NFA.
首先,必须立一个初始状态(Initial State)Si及一个终止状态(Final State) Sf.
若是有R1│ R2这类型的复合正规表示式,则所建构的NFA如下:
Regular Expression NFA(cont'd)
若是有R1 R2这类型的复合正规表示式,则所建构的NFA如下:
Regular Expression NFA(cont'd)
若是有R1*这类型的复合正规表示式,则所建构的NFA如下:
Regular Expression NFA(cont'd)
例:将正规表示式R=(0│1)*01转换成NFA.
首先分解正规表示式R为基本成分如下:依据上图之架构分别求其基本NFA(Primitive NFA)与复合NFA(Compound NFA).
Regular Expression NFA(cont'd)
(1)对第一个基成分(Primitive Component) R1,即对第一个终端符号0所建构之基本NFA如下:
(2)同理,对R2所建构之基本NFA为:
Regular Expression NFA(cont'd)
(3)对R3= R1│ R2所建构之复合NFA如下:
(4)因为R4=(R3),所以R4之NFA与R3之NFA完全相同.
Regular Expression NFA(cont'd)
(5)对R5= R4*所建构之复合NFA如下:
Regular Expression NFA(cont'd)
(6)对R6=0所建构之基本NFA如下:
:取用状态7'是便于稍后合并时无需再修改其他状态之值.
Regular Expression NFA(cont'd)
(7) R7= R5 R6所建构之基本NFA如下:
:状态7与状态7'合并成状态7.
Regular Expression NFA(cont'd)
(8)重上述之步骤,建构R9=(0│1)*01之NFA如下:
NFA DFA
一般Input Symbol含有 (空字串)者
Step 1:一个名为N之NFA欲化为名为D之DFA, D之初始状态(initial state)是包含初状态s0之集合,故将此state s0加入 -CLOSURE(s0)中,从s0可经由input symbol为 而到达之state均加入此 -CLOSURE(s0)中,此集合即为此DFA之initial state,设其为marked state .
Step 2: 对已marked state中元素,对每一input symbol a( ) si marked state,若f(si, a)=sj,将所有成集合T而 -CLOSURE(T),若不等于已有的state,则设为unmarked state.
Step 3:寻找下一个unmarked state,设其为marked stated,重复step ,直到无unmarked state为止.
NFA DFA
NFA DFA
Step 4: 由上述步骤可求得一个Transition Table,若其含原NFA之initial state(or finial state),则此state就是initial state(or finial state) .
Step 5:依Transition Table求Transition diagram即为所求.
NFA DFA
NFA DFA
NFA DFA
NFA DFA
NFA DFA
NFA DFA
NFA DFA
NFA DFA
NFA DFA
NFA DFA
由NFA转换所得之DFA,其中的某些态可以再合并成为一个状态,至于如何将DFA之状态数最小化(Minimize)其处理方式有下述三个步骤:
步骤一:将DFA中所有状态所形成之状态群(Group)G分割成终止状态群F与非终止状态群(G-F).
步骤二:藉由下述之分裂程序(Procedure SPLIT)对所有的状态群做分裂(Split)处理.任一状态群若因分裂程序处理而产生状态群分裂,则继续对该分裂之奖态群做分裂处理,直至所有的状态群皆无法再分裂为止.
DFA 最小化
DFA 最小化(cont'd)
步骤三:令每个状态群为一个新的状态(State).
步骤四:删除所有的死亡状态(Dead States);即该状态非初始状态,而且无法自其他状态到达之状态.
DFA 最小化(cont'd)
Procedure SPLIT
begin
for each group G of P do
begin
partition G into subgroups such that two states s and t of G are
in the same subgroup if and only for all input symbol a, states s
and t have transitions to states in the same group of P;
replace all subgroups that formed in P;
end
end
DFA 最小化(cont'd)
Example
DFA 最小化(cont'd)
DFA 最小化(cont'd)
步骤一:将状态A,B,C,D,E分割成非终止状态群A,B,C,D与终止状态群.
步骤二:由于终止状态群仅含有一个状态E,故无须再分裂.状态A,B,C,D经分裂程序处理,得知状态A,B,C,D对输入符号0皆转移(Transite)至状态B(属于同一状态群A,B,C,D中).但对于输入符号1而言,状态群A,B,C,D中仅有状态D会转移至状态群,而状态A,B,C则均会转移至状态群C,D中,故将状态群A,B,C,D分裂成A,B,C与两个状能群.由于状态群仅含有一个状态D,故无须再分裂.再对状态群A,B,C做分裂处理,对于输入符号0状态A,B,C均转移至状态B,但对输入符号1,仅有状态B会转移至状态D(即状态群中),故再将状态群A,B,C分裂成A,C,.至此,无法再分裂了.
DFA 最小化(cont'd)
步骤三:令每一个状态群为一新的状态.
A,C=S1
令A,C=S1
= S2
= S3
= S4
步骤四:无任何死亡状态,故不须删除任何一个状态.
由上可得到的转移表(Transition Table)为
最后,求得最小状态数之DFA为
FA Regular Grammar
将有限自动机(Finite Automata)转成正规文法(Regular Grammar)之方法:
(1)若状态A对于输入的终端符号a会到达状能B,而且状态B并非终止状态(Final State),则其正规文法为A aB.
(2)若状态A对于输入的终端符号a会到达状态B,而且状态(Final State),则其正规文法A a, A aB.
(3)若状态A对于输入的终端符号a会到达状态A本身,而且状态A既是初始状态(Initial State)亦是终止状态,则其正规文法为A ,A a与A aA.
例:
则其正规文法为G=,N=S,A,B,C,T=0,1,P=
S , A 0C, B 0C, C 0C,
S 0, A 1C, B 1B, C 1C
S 0A, B 1,
S 1,
S 1B,
根据上面之文法,可求得相对应之语言为L(G)=0,1*.

以上是关于形式系统的Regular Expression NFA的主要内容,如果未能解决你的问题,请参考以下文章

如何在第 n 次出现管道“|”后获取字符或字符串ORACLE 中使用 REGULAR_EXPRESSION 的符号?

Extended Regular Expression 扩展正则的使用

leetcde 10 Regular Expression Matching

[LeetCode] Regular Expression Matching

Regular Expression Matching - LeetCode

10. Regular Expression Matching