将正则表达式翻译成DFA的最简单算法是通过中间构造,在它之中,正则表达式派生出一个NFA,接着就用该NFA构造一个同等的DFA。。因此我们只关心两个算法:一个是将正则表达式翻译成N FA,另一个是将N FA翻译成D FA。构造一个扫描程序的自动过程可分为3步,如下所示:
(1)利用Thompson结构将正则表达式转换成NFA
-
基本正则表达式 基本正则表达式格式a、 或,其中a表示字母表中单个字符的匹配,表示空串的匹配,而则表示根本不是串的匹配。与正则表达式a等同的NFA(即在其语言中 准确接受)的是:
-
构造一个与rs相对应的NFA:
-
构造一个与r | s 相对应的N FA:
4)构造与r *相对应的NFA:
(2)利用子集构造法将NFA转换成DFA
1) 状态集合的 Epsilon-闭包 我们将单个状态s的Epsilon-闭包定义为可由一系列的零个或多个Epsilon-转换能达到的状态集合。
2) 从开始状态开始,不断构造转换后等价状态集合的Epsilon-闭包,直到没有新的集合产生或者得到了全集。
三、算法设计与实现:
NFA和DFA实质上是有向图,可用以下结构体表示
#结点信息
class Node():
def __init__(self, v,f):
self.v = v #当前结点的出点
self.f = f #动作
class Graph():
def __init__(self):
self.e = [[]] #边
self.node_count =0 #结点数目
def addEdge(self, u,v, f): #加边
self.e[u].append(Node(v, f))
def addNode(self): #加点