[英]Construct finite automata
您是否同意在正则表达式中:
((a|b)*(e|c)*)*
a,b和c的组合是什么? 还是您会说c总是在a和b之后。
我始终喜欢通过语义描述正则表达式RE。 但是还有一条规则,即“分布式法律”之一,对于编写清理和优化的RE很有帮助:
(P | Q)* == (P*Q*)* == (P* | Q*)*
注: |
是联合运算, P | Q
P | Q
等于P | Q
P | 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
a | b | c | e
,并且在每次迭代中您都可以选择任何一个符号,这意味着任何符号都会出现在正则表达式中的任何其他符号之后–这意味着“ a”,“ b”,“ c”,“ e”的任何组合都是可能的。
它的FA非常简单:由单个状态Q 0组成,带有标记所有四个符号的自环。 如下:
__ || a, b, c, e ▼| ––►((Q0)) Q0 is both initial and final state
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.