zoukankan      html  css  js  c++  java
  • NFA

    任意正则表达式都存在一个与之对应的NFA,反之亦然.

    正则表达式 ((A*B|AC)D)对应的NFA(有向图), 其中红线对应的为该状态的ε转换, 黑线表示匹配转换

    clipboard

    我们定义的NFA具有以下特点:

    • 正则表达式中的每个字符在NFA中都有且只有一个对应状态,NFA的其实状态为0,并包含一个虚拟的接收状态
    • 正则表达式中的字母所对应的状态都有一条从它指出的黑色的边,并且一个状态只能有一条指出的黑色边
    • 正则表达式中的元字符所对应的状态至少含有一条指出的红色的边

    ε转换

    不需要扫描匹配文本中的任意字符,自动机就可以从一个状态转换到另一状态

    使用 NFA模拟匹配过程:

    • 首先获取初始状态通过ε转换可以到达的所有状态集合,上图为0,1,2,3,4,6
    • 顺序扫描匹配文本中的字符,如果状态集合中找到匹配该字符的状态(可以使多个),自动机就可以扫过该字符并由黑色的边转到下一个状态,这种转换成为匹配转换,由下一状态及下一状态的的ε转换生成新的状态集合,继续扫描下一个字符
    • 扫描完所有字符后,如果最终到达的所有状态中包含接受状态,则匹配该字符串

    源代码
  • 相关阅读:
    mysql中bigint、int、mediumint、smallint 和 tinyint的取值范围
    centos6.5下安装samba服务器与配置
    centos 6.5 安装图形界面【转】
    Linux 下添加用户,修改权限
    Linux下自动调整时间和时区与Internet时间同步
    C#下利用封包、拆包原理解决Socket粘包、半包问题(新手篇)
    Unity脚步之NetworkBehaviour下前进、后退、左右转向的简单移动
    Token 在 Ajax 请求头中,服务端过滤器跨域问题
    【游戏】【暗黑2】重置属性点和技能点
    ASCII
  • 原文地址:https://www.cnblogs.com/phenixyu/p/5399243.html
Copyright © 2011-2022 走看看