我的所有教科书都使用相同的算法来生成给定正则表达式的DFA:首先,制作一个可以识别正则表达式语言的NFA,然后使用子集(也称为“ powerset”)构造将NFA转换为等效的DFA( (可选)最小化DFA)。我也曾经听过一位教授提到其他算法。有人知道吗?也许是直接从正则表达式转换为DFA而没有中间NFA的代码?
我的所有教科书都使用相同的算法来生成给定正则表达式的DFA:首先,制作一个可以识别正则表达式语言的NFA,然后使用子集(也称为“ powerset”)构造将NFA转换为等效的DFA( (可选)最小化DFA)。我也曾经听过一位教授提到其他算法。有人知道吗?也许是直接从正则表达式转换为DFA而没有中间NFA的代码?
Answers:
有多种将正则表达式转换为有限自动机的算法。您可以直接从正则表达式转到DFA,而无需先生成任何其他自动机,而是在生成自动机时隐式地进行子集构造。直接获得确定性自动机的另一种选择是使用导数方法。
检查正则表达式是否表示包含所有字符串的语言是一个完整的PSPACE问题(请参阅此答案作为参考)。检查DFA是否接受该语言可以在多项式时间内完成,因此,如果您直接从正则表达式转到DFA,则可能会出现问题。
我对文献的理解是,我们可以选择允许我们定位爆炸的翻译。意思是,从正则表达式到有限自动机有多种方法,并且首选线性或多项式方法。通常,指数成本被推入自动机的确定中。
在确定正则表达式的子族方面已经进行了很多工作,我们可以从这些子族中有效地生成DFA。此工作线取决于您使用的翻译。意思是,您修复了从正则表达式到NFA的映射,并尝试表征映射到DFA的正则表达式。
从正则表达式中自动机的标准构造不是此类工作中的首选构造。选择的构造会产生与正则表达式的结构极为相似的自动机。这些构造使用正则表达式的派生概念。
正则表达式的派生,JA Brzozowski。1964年。
正则表达式和有限自动机构造的偏导数,V。Antimirov。1995年。
如果您将自动机的状态视为从该状态接受的所有字符串的表示形式,则(偏)导数可让您将正则表达式视为state。与标准教科书结构相反,该教科书结构直观地将正则表达式视为自动机,而不是状态。
从正则表达式到确定性自动机,G。Berry和R. Sethi,1986年。
Berry和Sethi明确讨论了正则表达式与自动机状态和确定性之间的对应关系,他们将Brzozowski导数的概念与区分同一符号出现的想法结合在一起,从而将基于语法的正则表达式转换为有限元自动机。
一种明确的常规语言,A。Brüggemann-Klein和Derick Wood,1998年。
本文以Brüggemann-Klein的早期工作为基础,并研究了可以使用导数在多项式时间内生成DFA的情况。本文后面有大量工作。从Web技术的角度来看,这是很重要的,因为可以有效操纵的正则表达式(也称为DFA)对于处理SGML和XML很重要。
研究确定性正则表达式的其他特殊情况有很多工作。最近的一篇论文研究何时可以在线性时间内解决其中一些问题,该研究始于2012年。
线性时间中的确定性正则表达式,Benoit Groz,Sebastian Maneth,Slawomir Staworko。2012。