首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将有限状态机转换为正则表达式

将有限状态机转换为正则表达式
EN

Stack Overflow用户
提问于 2016-04-25 23:50:05
回答 5查看 14K关注 0票数 12

是否有工具(或算法)将有限状态机转换为正则表达式?

(不是相反,这很容易)。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-04-27 07:57:28

完成这一任务的算法有几种: Brzozowski和Mc Cluskey的“状态消除法”、线性方程组的分辨率、McNaughton和Yamada的方法等,这些算法在雅克·萨卡洛维奇的“自动机与有理表达式”中有很好的描述。

尤其是状态消除方法,很容易理解。关键的想法是,您将构建一个由rational (也称为正则)表达式而不是字母标记的自动机。首先,确保您有一个初始状态和一个最终状态(如果需要,您可以添加新的状态和自发的转换)。然后选择要消除的状态,例如下图中的状态1。

然后考虑所有的配对(p,q),其中p是一个前驱体(图中的过渡达到s,0的状态)和q是一个继承者(状态2)。对每对这样的夫妇(p,q)加一个从p到q的过渡,它由E(p,q) + E(p,s)E( s,s)*E( s,s)标记为E(s,s)*E(s,s),其中E(p,s)的意思是“标记从p到s的过渡的表达式。一旦你处理了所有的夫妻(p,q),移除状态s。在前面的例子中:

这样做,直到消除了所有内部状态(即保留初始状态和最终状态),并读取从初始状态到最终状态的转换结果(此处为d+ab*c)。

您可以使用Vcsn来玩这个算法,这是一个用于rational表达式和自动机的工具。下面是一个完整的示例,您可以在Vcsn砂箱上进行复制。

票数 17
EN

Stack Overflow用户

发布于 2016-04-26 14:07:42

我相信我使用过的最好的工具是greenery。它是用于python的FSM/regex转换库。您可以阅读更多关于库这里的信息,所使用的算法是很好描述的这里

示例

可以在网站上找到的模型可以这样转换:

代码语言:javascript
复制
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)

输出如下:

代码语言:javascript
复制
>>> 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版本在内存方面也有一些问题,但是Python3.x+ github版本的组合非常棒。

票数 4
EN

Stack Overflow用户

发布于 2016-04-26 00:30:43

您可以使用fsm2regex,一个在线工具来完成这项工作。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36853077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档