构造有限自动机

时间:2014-04-05 02:49:45

标签: regex finite-automata dfa nfa

您是否同意正则表达式:

((a|b)*(e|c)*)* 

是a,b和c的任意组合?或者你会说c总是在a和b之后。

1 个答案:

答案 0 :(得分:1)

通过我总是喜欢在语义上描述正则表达式RE。但是也有一个规则,即“分布式法则”,这对编写清理和优化RE很有帮助:

(P | Q)*  ==  (P*Q*)*  == (P* | Q*)*

注意:|是联合操作,P | QP | Q相同。这里P,Q是正则表达式。

所以你表达了:

  
     ((a|b)*(e|c)*)*       # P = (a|b)*  and Q = (e|c)*
=>   ((a|b) | (e|c))*      # (P* | Q*)* = (P | Q)*

正如我在工会订单中所说的那样重要,所以( )在这里是多余的。和

     ((a|b) | (e|c))*     
=>   (a | b | c | e)*

现在*表示重复应用*的某些模式的任意次数。在上面的表达式*应用于a | b | c | e,并且在每次迭代中,您可以选择任何一个符号,这意味着任何符号都可以出现在正则表达式中的任何其他符号之后 - 这意味着“a”,'''的任意组合。 b','c','e'是可能的。

它的FA很简单:由单个状态Q 0 组成,自循环标记所有四个符号。如下:

  
     __
     ||  a, b, c, e 
     ▼| 
––►((Q0))

Q0 is both initial and final state