将有限状态机转换为正则表达式
Convert finite state machine to regular expression
是否有工具(或算法)可以将有限状态机转换为正则表达式?
(不是反过来,那会很容易)。
您没有具体说明您在做什么,但您可能想知道有一个名为 Ragel 的工具专门用于 FSM。它为多种语言生成代码,几年前我看的时候,将机器移植到其他语言并不难。
您可以使用 fsm2regex,一个可以完成这项工作的在线工具。
我认为我用过的最好的工具是greenery
. It is a FSM/regex conversion library for python. You can read more about the library here and the algorithm used is well described here。
例子
可以在网站上找到的模型可以这样转换:
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版本太棒了。
有几种算法可以执行此任务:来自 Brzozowski 和 Mc Cluskey 的 "state-elimination method"、线性方程组的求解、来自 McNaughton 和 Yamada 的方法等。它们在Automata and rational expressions 作者:雅克·萨卡罗维奇。
尤其是状态消除法,简单易懂。关键思想是您将构建一个由有理(也称为正则)表达式而不是字母标记的自动机。首先,确保您有一个初始状态和一个最终状态(如果需要,您可以添加新状态和自发转换)。然后选择一个状态s来消除,比如下图中的状态1。
然后考虑所有对 (p, q),其中 p 是前任(状态从其转移到图中的 s,0)和 q 是后继者(状态 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, a tool for rational expressions and automata. Here is a complete example you may reproduce at Vcsn Sandbox.
来尝试这个算法
我已经为 http://www.brics.dk/automaton/ Java 包实现了状态消除算法。该实现基于 Sipser, Michael 中说明的算法。计算理论导论。卷。 2. 波士顿:汤姆森课程技术,2006.
您可以在 https://github.com/julianthome/autorex 查看。很乐意得到一些反馈。
是否有工具(或算法)可以将有限状态机转换为正则表达式?
(不是反过来,那会很容易)。
您没有具体说明您在做什么,但您可能想知道有一个名为 Ragel 的工具专门用于 FSM。它为多种语言生成代码,几年前我看的时候,将机器移植到其他语言并不难。
您可以使用 fsm2regex,一个可以完成这项工作的在线工具。
我认为我用过的最好的工具是greenery
. It is a FSM/regex conversion library for python. You can read more about the library here and the algorithm used is well described here。
例子
可以在网站上找到的模型可以这样转换:
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版本太棒了。
有几种算法可以执行此任务:来自 Brzozowski 和 Mc Cluskey 的 "state-elimination method"、线性方程组的求解、来自 McNaughton 和 Yamada 的方法等。它们在Automata and rational expressions 作者:雅克·萨卡罗维奇。
尤其是状态消除法,简单易懂。关键思想是您将构建一个由有理(也称为正则)表达式而不是字母标记的自动机。首先,确保您有一个初始状态和一个最终状态(如果需要,您可以添加新状态和自发转换)。然后选择一个状态s来消除,比如下图中的状态1。
然后考虑所有对 (p, q),其中 p 是前任(状态从其转移到图中的 s,0)和 q 是后继者(状态 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, a tool for rational expressions and automata. Here is a complete example you may reproduce at Vcsn Sandbox.
来尝试这个算法我已经为 http://www.brics.dk/automaton/ Java 包实现了状态消除算法。该实现基于 Sipser, Michael 中说明的算法。计算理论导论。卷。 2. 波士顿:汤姆森课程技术,2006.
您可以在 https://github.com/julianthome/autorex 查看。很乐意得到一些反馈。