[英]Convert finite state machine to regular expression
是否有將有限狀態機轉換為正則表達式的工具(或算法)?
(不是相反,這很容易)。
有幾種算法可以執行此任務:來自 Brzozowski 和 Mc Cluskey 的“狀態消除方法”、線性方程組的分解、來自 McNaughton 和 Yamada 的方法等。它們在Automata 和有理表達式中得到了很好的描述雅克·薩卡羅維奇
特別是狀態消除方法很容易理解。 關鍵思想是您將構建一個由有理(也稱為正則)表達式而不是字母標記的自動機。 首先,確保您有一個初始狀態和一個最終狀態(如有必要,您可以添加新狀態和自發轉換)。 然后選擇要消除的狀態 s,例如下圖中的狀態 1。
然后考慮所有對 (p, q),其中 p 是前驅(轉移到達 s 的狀態,圖中為 0)和 qa 后繼(狀態 2)。 對於每個這樣的對 (p, q),添加從 p 到 q 的轉換,其標記為 E(p, q) + E(p, s)E(s, s)*E(s, q) 其中 E(p , s) 的意思是“標記從 p 到 s 的轉換的表達式。處理完所有 (p, q) 后,移除狀態 s。在前面的示例中:
這樣做直到消除所有內部狀態(即保留初始狀態和最終狀態),然后讀取從初始狀態到最終狀態的轉換結果(此處為 d+ab*c)。
您可以使用Vcsn來玩弄這個算法,這是一種用於有理表達式和自動機的工具。 這是您可以在Vcsn Sandbox 上重現的完整示例。
我相信我用過的最好的工具是greenery
。 它是一個用於 Python 的 FSM/regex 轉換庫。 你可以閱讀更多關於圖書館在這里和所使用的算法有很好的描述在這里。
可以在網站上找到的模型可以這樣轉換:
from greenery import fsm, lego
A, B, C, D, E = range(5)
a, b = 'a', 'b'
# create the FSM
machine = fsm.fsm(
alphabet = {a, b},
states = {A, B, C, D, E},
initial = A,
finals = {C, E},
map = {
A : {a: B, b: D},
B : {a: C, b: E},
C : {a: C, b: E},
D : {a: B, b: D},
E : {a: B, b: D}
},
)
# convert it to regex
rex = lego.from_fsm(machine)
輸出如下:
>>> print(machine)
name final? a b
------------------
* 0 False 1 3
1 False 2 4
2 True 2 4
3 False 1 3
4 True 1 3
>>> print(rex)
b*a((a*(a|b+))?ba)*(a+b?|b)
PYPI上的版本斷言有些問題,github版本內存有些問題,但是python 3.x + github版本的組合很棒。
您可以使用fsm2regex ,這是一個完成這項工作的在線工具。
您沒有指定您在做什么,但您可能想知道有一個名為Ragel的工具專門研究 FSM。 它為多種語言生成代碼,當我幾年前查看時,將機器移植到其他語言並不太難。
我已經為http://www.brics.dk/automaton/Java包實現了狀態消除算法。 該實現基於Sipser, Michael 中說明的算法。 計算理論導論。 卷。 2. 波士頓:湯姆森課程技術,2006 年。
您可以在https://github.com/julianthome/autorex 上查看。 很高興得到一些反饋。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.