【问题标题】:Modeling DFA and NFA using HashMap Implementation使用 HashMap 实现对 DFA 和 NFA 建模
【发布时间】:2012-06-05 14:47:55
【问题描述】:

我必须在 Java 中通过自动机实现以下操作:

  • 串联
  • 克莱恩之星
  • 联合
  • 十字路口

如果自动机是 NFA,这些操作会更容易。我喜欢以下链接Modelling a Finite Deterministic Automaton via this data 中给出的实现,但我认为这在建模 NFA 时不太适合,因为键唯一性限制。你会推荐我任何对 NFA 建模的解决方法吗?

【问题讨论】:

    标签: java dfa nfa


    【解决方案1】:

    作为曾经实际执行过一次这些操作的人(在构建扫描仪生成器时),我建议将自动机构建为 NFA,然后使用子集构造或 Thompson 算法等算法将其转换为 DFA。这使得将自动机组合在一起的逻辑简单而优雅,而不会牺牲生成匹配自动机的速度。

    希望这会有所帮助!

    【讨论】:

    • 谢谢。您如何考虑对 NFA 进行建模?哪种数据结构最适合我的目的?是否有可能使用 HashMap 或者我应该寻找其他选项?
    • 我建议有一个代表每个州的类。然后,每个状态存储一组通过 epsilon 转换可到达的所有状态,以及从符号到状态集的映射,对于该映射,在符号上存在进入该状态的转换。
    • java.dzone.com/articles/design-patterns-state 进行了一次精彩的讨论,使用 Java 并实现了刚才建议的状态设计模式 templatetypedef。
    • 汤普森算法用于将正则表达式转换为 NFA
    【解决方案2】:

    我建议使用 DFA。尽管在纸面上形成 NFA 可能更容易,但由于考虑到 epsilon-jump,检查一个有效的字符串与 NFA 相比将比验证一个 DFA 更复杂。

    就它们建模而言,您应该能够只用几个类编写自己的。想想 DFA/NFA 的组成:
    - 开始状态
    - 状态集(其中一些是“接受”状态)
    - 一组过渡

    【讨论】:

    • 感谢您的回复。我使用 NFA 执行此操作的原因是因为我需要从用户那里获取一个扩展正则表达式(即具有交集和补码)的表达式,并将具有三个基本操作的正则表达式作为输出(联合、交叉口和 Kleene Star)。
    猜你喜欢
    • 2011-04-29
    • 1970-01-01
    • 2011-11-19
    • 1970-01-01
    • 2012-07-18
    • 2011-01-02
    • 2010-11-23
    • 1970-01-01
    • 2012-01-06
    相关资源
    最近更新 更多