最近我一直在思考有限状态机(FSMs),以及我如何在软件中实现它们(编程语言并不重要)。
我的理解是,确定性有限状态机广泛应用于解析器/词法分析器、编译器等领域,但是非确定性有限状态机有什么问题呢?
我知道可以将所有非确定性有限状态机转换为确定性有限状态机(甚至可以通过编程实现)。这不是我的重点。我也想象到,非确定性有限状态机实现起来要复杂得多。
无论如何,实现非确定性有限状态机有任何意义吗?有我不知道的任何特殊应用吗?有哪些原因可以这样做?也许优化和专门的非确定性有限状态机更快?
最近我一直在思考有限状态机(FSMs),以及我如何在软件中实现它们(编程语言并不重要)。
我的理解是,确定性有限状态机广泛应用于解析器/词法分析器、编译器等领域,但是非确定性有限状态机有什么问题呢?
我知道可以将所有非确定性有限状态机转换为确定性有限状态机(甚至可以通过编程实现)。这不是我的重点。我也想象到,非确定性有限状态机实现起来要复杂得多。
无论如何,实现非确定性有限状态机有任何意义吗?有我不知道的任何特殊应用吗?有哪些原因可以这样做?也许优化和专门的非确定性有限状态机更快?
我的建议是:看一下Adrian Thurstons Ragel的手册。
有简单的方法可以直接生成DFA,但我认为它们只支持有限范围的运算符 - 基本上是EBNF中常见的操作符。Ragel使用非确定性方法从简单的自动机组合成复杂的自动机,然后使用epsilon消除和最小化来创建高效的确定性自动机。无论您需要多少奇怪的运算符,转换为最小确定性自动机始终是相同的,并且每个运算符实现都通过使用非确定性方法保持简单。
通常创建一个NFA然后使用它会更容易(唯一的区别是你持有一组状态而不是一个状态)。如果你想要快速,可以制作DFA,但不要忘记,这样做的时间是指数级的(因为结果自动机可能会指数级增长!)。
另一方面,如果你想要创建一个补充语言,你没有选择,你需要一个确定性变量。
这就是为什么否定在正则表达式引擎中不存在的原因,只存在于类([^...])中,在那里你可以确信自动机是确定性的。
如果我错了,请纠正我,但是从我的编译器课程中我记得有时候你根本不能使用DFA,因为它会导致状态的“爆炸”。
Cayuga在复杂事件处理方面使用了非确定性有限状态机。看起来他们称之为“具有状态的发布/订阅事件监控”,但我认为这是CEP。
我相信他们的一些论文甚至讨论了为什么要使用自动机模型。你可能想在他们的网站上找找。
...... Cayuga自动机,扩展自标准的非确定性有限自动机。