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

时间:2016-04-25 23:50:06

标签: regex algorithm fsm

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

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

5 个答案:

答案 0 :(得分:11)

有几种算法可以执行此任务:"状态消除方法"来自Brzozowski和Mc Cluskey,线性方程组的解析,McNaughton和Yamada等的方法。他们在Jacques Sakarovitch的Automata and rational expressions中有很好的描述。

特别是状态消除方法很容易理解。关键的想法是你要构建一个由理性(也就是常规)表达而不是字母标记的自动机。首先,确保您有一个初始状态和一个最终状态(如果需要,您可以添加新状态和自发转换)。然后选择要消除的状态s,如下图所示的状态1.

A simple automaton

然后考虑所有的夫妻(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。在前面的例子中:

An automaton labeled by regexps

在消除所有内部状态(即保持初始状态和最终状态)之前执行此操作,然后只读取从初始状态到最终状态(此处为d + ab * c)的转换结果。

你可以使用Vcsn来玩这个算法,这是一个理性表达和自动机的工具。以下是您可以在Vcsn Sandbox重现的完整示例。

A complete run of the state elimination method

答案 1 :(得分:1)

您没有指定您正在做的事情,但您可能想知道有一个名为Ragel的工具专门用于FSM。它为一系列语言生成代码,几年前我看,将机器移植到其他语言并不困难。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我相信我使用过的最好的工具是greenery。它是python的FSM / regex转换库。您可以阅读有关库here的更多信息,并且使用的算法已得到很好的描述here

实施例

FSM

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

uint8_t

输出如下:

int ftoi_truncate(float f) { return f; }
    cvttss2si       eax, xmm0
    ret

int dtoi(double d) { return nearbyint(d); }
    cvtsd2si        eax, xmm0   # only with -ffast-math, though.  Without, you get a function call :(
    ret

注意

PYPI上的版本在断言方面存在一些问题,而github版本在内存方面存在一些问题,但组合python 3.x + github版本非常棒。

答案 4 :(得分:0)

我已经为http://www.brics.dk/automaton/ Java包实现了状态消除算法。该实现基于 Sipser,Michael中所示的算法。计算理论导论。卷。 2.波士顿:Thomson Course Technology,2006

您可以在https://github.com/julianthome/autorex查看。很乐意得到一些反馈。

祝福和亲切的问候,   儒略