汤普森的构造算法和RE到NFA

时间:2015-02-16 02:30:30

标签: java regex algorithm nfa

我试图创建一个方法,它将采用一个字符串(一个有效的正则表达式)并输出一个相应的非确定性有限自动机。从我所做的研究来看,Thompson's algorithm看起来最适用于此,因为我只处理kleene星,联合和括号符号,语言只有{a,b,e} e表示空转换。

此外,我遇到的一个大问题是如何处理正则表达式中的嵌套括号。在这里输入将不胜感激。

我的问题是关于在代码中表示这一点的最佳/最直接的方法。我需要将每个节点彼此区分开来,并跟踪节点出来的转换以及这些转换导致的转换。我已经研究过使用Digraph,但是看起来好像你只能表示一个节点以及节点可以导致的位置,而忽略了转移到那个新节点。对此建筑的任何建议都将不胜感激。感谢。

1 个答案:

答案 0 :(得分:0)

不知道这是否有帮助,但我在Python中为my monograph实现了这一点。遗憾的是,该文本是葡萄牙语,但实现非常简单。

实际上,它将表达式编译为假设机器的一系列非确定性指令。例如,表达式a(b | c)+ d将编译为:

 0000: CONSUME a
 0001: JUMP (1, 3)
 0002: CONSUME b
 0003: JUMP (2,)
 0004: CONSUME c
 0005: JUMP (1, -4)
 0006: CONSUME d
 0007: MATCH!

只有三种类型的指令(而MATCH仅出现在最后)。

    如果CONSUME x ,则
  • x会使用输入的下一个字符
  • JUMP (a, [b])相对于非确定性定义的所有标签跳转
  • MATCH!自我描述