Java 使用HashMap实现对DFA和NFA进行建模

Java 使用HashMap实现对DFA和NFA进行建模,java,dfa,nfa,Java,Dfa,Nfa,我必须在Java中的自动机上实现以下操作: 串联 克莱恩星 联合 交叉口 如果自动机是NFA,则这些操作更容易。我喜欢下面链接中给出的实现,但我认为这不适合建模NFA,因为关键的唯一性限制。你能给我推荐一些NFA建模的变通方法吗?我建议使用DFA。虽然在纸上形成NFA可能更容易,但由于考虑了ε跳跃,根据NFA检查有效字符串将比根据DFA验证有效字符串更复杂 就建模而言,您应该只需要几个类就可以编写自己的类。想想DFA/NFA由什么组成: -开始状态 -一组状态(其中一些是“接受”状态) -转

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

  • 串联
  • 克莱恩星
  • 联合
  • 交叉口

如果自动机是NFA,则这些操作更容易。我喜欢下面链接中给出的实现,但我认为这不适合建模NFA,因为关键的唯一性限制。你能给我推荐一些NFA建模的变通方法吗?

我建议使用DFA。虽然在纸上形成NFA可能更容易,但由于考虑了ε跳跃,根据NFA检查有效字符串将比根据DFA验证有效字符串更复杂

就建模而言,您应该只需要几个类就可以编写自己的类。想想DFA/NFA由什么组成:
-开始状态
-一组状态(其中一些是“接受”状态)

-转换集

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


希望这有帮助

谢谢你的回复。我之所以使用NFAs,是因为我需要从用户那里得到一个表达式,它是一个扩展正则表达式(即,具有交集和补集),并将带有三个基本运算(并集、交集和Kleene星形)的正则表达式作为输出。谢谢。你会如何考虑NFA的建模?哪种数据结构最适合我的目的?是否有可能使用HashMap,或者我应该寻找其他选项?我建议使用一个表示每个状态的类。然后,每个状态存储一组可通过epsilon转换访问的所有状态,以及从符号到状态集的映射,其中有一个转换在符号上进入该状态。对于使用Java和实现刚才建议的状态设计模式templatetypedef的精彩讨论,Thompson的算法用于将正则表达式转换为NFA