为什么在NFA上使用NFA

时间:2015-10-21 13:40:33

标签: regex dfa computation-theory compiler-theory nfa

我正在研究一些计算理论,正如暗示的那样,它是非常理论化的。

我可以很容易地从正则表达式转换为NFA到DFA,我可以理解。

但是,由于所有NFA都可以转换为DFA并且(我很确定)UNIX中的grep命令使用正则表达式来确定匹配的字符串,最常用的有限自动机,DFA或NFA是什么?

根据我的经验(并不多),在表示常规语言时,DFA通常更容易使用,并且也是确定性的,因此应始终选择NFA。

NFA分支到多个结果,需要递归函数,对我来说似乎更尴尬。

我知道编译器是有限自动机的另一种实际用途。

我的问题......为什么学习/使用两者。对我来说,DFA看起来非常好。

感谢您的回答!

2 个答案:

答案 0 :(得分:3)

DFA通常更快,更可扩展。确定和最小化NFA有时是昂贵的。因此,如果自动机仅使用一次,则可以跳过它。

NFA(Thompson-NFA,Glushkov-NFA,位并联NFA)的优点是:

  • 他们可以更简洁地表达
  • 他们可以记录子匹配(例如,用于正则表达式替换)
  • 它们可以即时翻译为非最小化的DFA

此外,Regex-NFA在常用编程语言中使用(Backtracking-NFA,例如Python,Perl,Java,.NET,而不是grep):

  • 甚至比上NFA更慢
  • 支持贪婪,不同意和积极的模式
  • 但可以使用lookaheads / lookbehinds
  • 并且可以使用反向引用(这些不能转换为DFA)

编译器几乎总是使用最小化的DFA来进行lexing。 Regex Search使用DFA或混合DFA / NFA(后者用于子匹配识别)。编程语言中使用的NFA类型是最强大的(关于功能),但也是最慢的。

答案 1 :(得分:0)

我认为将回归转换为NFA比使用DFA更简单。很难直接将回归转换为DFA。