正则到DFA

  将正则表达式翻译成DFA的最简单算法是通过中间构造,在它之中,正则表达式派生出一个NFA,接着就用该NFA构造一个同等的DFA。。因此我们只关心两个算法:一个是将正则表达式翻译成N FA,另一个是将N FA翻译成D FA。构造一个扫描程序的自动过程可分为3步,如下所示:

  

(1)利用Thompson结构将正则表达式转换成NFA

  1. 基本正则表达式 基本正则表达式格式a、 或,其中a表示字母表中单个字符的匹配,表示空串的匹配,而则表示根本不是串的匹配。与正则表达式a等同的NFA(即在其语言中 准确接受)的是:

  2. 构造一个与rs相对应的NFA:

  3. 构造一个与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): #加点

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值