我厌倦了正则表达式。它丑陋、不可读且无法调试。然而,几十年来,数学家一直在使用有限状态机来设计正则表达式。
如果我对正则表达式感到恼火,我会手动将其绘制为有限状态机,然后必须将有限状态机转换为我今天使用的任何可怕的正则表达式语法。
有没有一个程序可以让我设计有限状态机并吐出一个正则表达式?
我厌倦了正则表达式。它丑陋、不可读且无法调试。然而,几十年来,数学家一直在使用有限状态机来设计正则表达式。
如果我对正则表达式感到恼火,我会手动将其绘制为有限状态机,然后必须将有限状态机转换为我今天使用的任何可怕的正则表达式语法。
有没有一个程序可以让我设计有限状态机并吐出一个正则表达式?
如果你懂 Python,可以试试greenery。该包fsm
适用于有限状态机,lego
适用于正则表达式对象。两者可以自由转换。
>>> from greenery import fsm
>>> x = fsm.fsm(
... alphabet={"1", "2"},
... states={"A", "B", "C", "D", "E"},
... initial="A",
... finals={"E"},
... map={
... "A": {"1": "C", "2": "A"},
... "B": {"1": "B", "2": "D"},
... "C": {"1": "E", "2": "C"},
... "D": {"1": "A", "2": "B"},
... "E": {"1": "C", "2": "D"}
... }
... )
>>> print(x.lego())
(1(11|2)*12(21*2)*1|2)*1(11|2)*1
我觉得我应该指出您的示例有限状态机既缺少初始状态又缺少任何最终状态,所以我猜到了。此外,任意 FSM 通常会转换为非常可怕的正则表达式,并且简化正则表达式在计算上很困难......
JFLAP 是用于试验形式语言主题的软件,包括非确定性有限自动机、非确定性下推自动机、多磁带图灵机、几种类型的语法、解析和 L 系统。除了为这些构建和测试示例之外,JFLAP 还允许人们尝试从一种形式到另一种形式的构造证明,例如将 NFA 转换为 DFA 到最小状态 DFA 到正则表达式或正则语法。