是否有工具(或算法)将有限状态机转换为正则表达式?
(不是相反,这很容易)。
答案 0 :(得分:11)
有几种算法可以执行此任务:"状态消除方法"来自Brzozowski和Mc Cluskey,线性方程组的解析,McNaughton和Yamada等的方法。他们在Jacques Sakarovitch的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来玩这个算法,这是一个理性表达和自动机的工具。以下是您可以在Vcsn Sandbox重现的完整示例。
答案 1 :(得分:1)
您没有指定您正在做的事情,但您可能想知道有一个名为Ragel的工具专门用于FSM。它为一系列语言生成代码,几年前我看,将机器移植到其他语言并不困难。
答案 2 :(得分:0)
您可以使用fsm2regex,这是一个完成这项工作的在线工具。
答案 3 :(得分:0)
我相信我使用过的最好的工具是greenery
。它是python的FSM / regex转换库。您可以阅读有关库here的更多信息,并且使用的算法已得到很好的描述here。
可以在网站上找到的模型可以这样转换:
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查看。很乐意得到一些反馈。
祝福和亲切的问候, 儒略