【发布时间】:2012-06-05 14:47:55
【问题描述】:
我必须在 Java 中通过自动机实现以下操作:
- 串联
- 克莱恩之星
- 联合
- 十字路口
如果自动机是 NFA,这些操作会更容易。我喜欢以下链接Modelling a Finite Deterministic Automaton via this data 中给出的实现,但我认为这在建模 NFA 时不太适合,因为键唯一性限制。你会推荐我任何对 NFA 建模的解决方法吗?
【问题讨论】:
我必须在 Java 中通过自动机实现以下操作:
如果自动机是 NFA,这些操作会更容易。我喜欢以下链接Modelling a Finite Deterministic Automaton via this data 中给出的实现,但我认为这在建模 NFA 时不太适合,因为键唯一性限制。你会推荐我任何对 NFA 建模的解决方法吗?
【问题讨论】:
作为曾经实际执行过一次这些操作的人(在构建扫描仪生成器时),我建议将自动机构建为 NFA,然后使用子集构造或 Thompson 算法等算法将其转换为 DFA。这使得将自动机组合在一起的逻辑简单而优雅,而不会牺牲生成匹配自动机的速度。
希望这会有所帮助!
【讨论】:
我建议使用 DFA。尽管在纸面上形成 NFA 可能更容易,但由于考虑到 epsilon-jump,检查一个有效的字符串与 NFA 相比将比验证一个 DFA 更复杂。
就它们建模而言,您应该能够只用几个类编写自己的。想想 DFA/NFA 的组成:
- 开始状态
- 状态集(其中一些是“接受”状态)
- 一组过渡
【讨论】: