[英]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.