簡體   English   中英

如何將正則表達式轉換為有限的 state 機器?

[英]How to convert regular expression to finite state machine?

讓正則表達式;

r = (a*|(ab)*)b*

將此表達式轉換為有限 state 機器的規則是什么?

轉換通用正則表達式的規則可以在文獻中找到(例如 Aho 等人的“編譯器:原理、技術和工具”),但是需要大量的努力來編寫它。 目前,許多開源實現可用於此任務以及有限狀態機和傳感器上的其他操作,例如 openFST、SFST、Foma 和 HFST(這是三者的通用接口)。 它們可作為獨立程序、庫和通過例如 Python 使用。 下面的示例表達式是使用 hfst-xfst 獨立程序編譯的(有關更多信息,請參見http://hfst.github.io/ )。

$ hfst-xfst
hfst[0]: regex [a*|[a b]*]b* ;
? bytes. 6 states, 10 arcs, ? paths
hfst[1]: print net
Sfs0:   b -> fs1, a -> fs2.
fs1:    b -> fs1.
fs2:    b -> fs3, a -> fs4.
fs3:    b -> fs1, a -> s5.
fs4:    b -> fs1, a -> fs4.
s5: b -> fs3.
hfst[1]: 

給定的正則表達式

r = (a*|(ab)*)b*

給定的正則表達式可以分解為多個部分,並且可以再次組合在一起,以便於設計 DFA 讓我們將正則表達式分解為 a*、ab、(ab) 、b 、a+b、a+((ab) ), (a |(ab) )b

現在 a* 可以變成有限自動機a*

現在 ab 可以制作為

抗體

b* 可以做成b*

通過將 ab 和 b* 加入一個自動機,我們得到 (ab)* 作為(ab)*

現在 a+b 作為a+b現在 a+b 和 (ab)* 可以通過在 a+b 中放置 (ab)* 代替 b 來組合,然后我們得到 a+((ab) ) a+((ab)*)現在 a+((ab) ) 和 b* 可以使用 ab 方法連接,並產生所需的結果有限 state 自動機。 結果轉換為 (a*|(ab) )b

正則表達式到有限state機器的轉換規則為:

1.將表達式分成幾個部分,使其易於理解並添加它們 2.為這些部分表達式制作Finte state機器。 3.將這些部分表達式一一連接。 4.然后我們得到最終的 NFA。 5.如果我們想得到 DFA,那么通過使用 ε-closure 方法將 NFA 轉換為等效的 DFA。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM