[在此处输入文章标题]

正则到nfa

前言

在写代码的过程中,本来还想根据龙书上的说明来实现re到nfa的转换。可是写代码的时候发现,根据课本来会生成很多的无用过渡节点和空转换边,需要许多的代码。为了简化代码,我实现了我自己的re到nfa的规则。

注意我的这套re规则只包括如下几种类型:

  1. 闭包,即*运算符
  2. 一个或多个,即+运算符
  3. 存在或不存在,即?运算符。这三个运算符的优先级最高而且都是单目运算符。
  4. 括号括起来的,即成对的括号,其实也不算运算符,只能当作分隔符。
  5. 中括号括起来的,作为假名,也算是分隔符
  6. 连接运算符,即.运算符,但是在输入re的时候默认不输入这个符号,只有在处理输入的时候才添加这个符号。这个运算符的优先级第二高
  7. 选择运算符,即|运算,优先级最低
  8. 字符集,为a-z形式,他必须与假名搭配使用,并通过假名来引用这个定义的模式
  9. 假名,为一个正则模式提供一个名字来方便引用。定义假名的形式为 name:re。re为普通的正则运算或者单独的一个字符集。在后面的正则中途过想引用假名则必须采取这种形式[name],即必须用中括号括起来。

转换

在谈及如何将re转换为nfa的时候,我将先把最常见的三种运算符讲解一下,然后再是其他的那几种模式的转换。

注意,在转换re的时候,我们假设已经得到了子re的开始节点和结束节点,我们需要做的就是根绝这些开始节点和结束节点来构造当前re的开始节点和结束节点。

闭包运算

以A:b*这个表达式来说明

我的实现
 
  

这里的开始节点是b的开始节点,结束节点是b的结束节点。构造a的nfa的时候,只需要添加两条空转换边,然后将b的开始节点赋给a的开始节点,同时b的结束节点复制到a的结束节点去。总的代价是建立了两条空边。

龙书里面的实现

龙书中,而外的建立了两个新的节点分别当作新的开始节点和结束节点,并且总共添加了四条空转换边。

连接运算

在处理连接运算的时候,我跟龙书里面的处理是以致的。以a:bc来说明。

这里只添加了一条新的空转换,没有新增加节点。A的开始为b的开始节点,a的结束为c的结束节点。

选择运算

在处理选择运算的时候,跟龙书也是一致的。以a:b|c来说明。

这里也是新建了两个节点,作为新的开始与结束节点,然后增加了四条空转换边。

一个或多个运算符

这里龙书并没有提及,在我的实现中只增加了一个节点。以a:b+来说明。

新建了一个节点作为a的结束节点,而b的开始节点也直接符给a的开始节点,添加了两个空转换。

问号运算符

这里龙书也没有提及,在我的实现中只增加了一条边。以a:b?来说明。

B的开始节点赋给a的开始节点,b的结束节点赋给a的结束节点。

简单的字符

对于简单字符,我这里的实现是新建两个节点,以及一条边。以a:b来说明。

由于b是字符,所以他不存在开始节点和结束节点,字符只能作为转换条件。新建两个节点,一个作为a的开始节点,一个作为a的结束节点,然后在两个节点之间建立一条标为b的边。

字符集

对于字符集,本人的实现是新建两个节点,然后每一个字符对应一条边来加入。

以a:b-d来说明。

因此,总共增加了两个节点和三条边。字符集里面有多少个字符,就会有多少条边。

括号及假名

对于括号及假名,直接把子表达式的开始节点和结束节点复制到当前表达式的开始节点和结束节点,不需要额外的处理。

自我感觉这些都是对的,当然要验证对错得等到最小化dfa才能证明。

最初步的正则表达式引擎:nfa的转换规则。的更多相关文章

  1. 正则表达式引擎:nfa的转换规则。

    正则表达式引擎:nfa的转换规则. 正则到nfa 前言 在写代码的过程中,本来还想根据龙书上的说明来实现re到nfa的转换.可是写代码的时候发现,根据课本来会生成很多的无用过渡节点和空转换边,需要许多 ...

  2. 最初步的正则表达式引擎:生成nfa

    这个版本修改了前面版本的两个个bug. 第一个:识别到字符集的时候,只是将name_number加1,却并不对reg_pattern_table[name_number]进行初始化. 第二个:识别到假 ...

  3. 基于ε-NFA的正则表达式引擎

    正则表达式几乎每个程序员都会用到,对于这么常见的一个语言,有没有想过怎么去实现一个呢?乍一想,也许觉得困难,实际上实现一个正则表达式的引擎并没有想像中的复杂,<编译原理>一书中有一章专门讲 ...

  4. 1000行代码徒手写正则表达式引擎【1】--JAVA中正则表达式的使用

    简介: 本文是系列博客的第一篇,主要讲解和分析正则表达式规则以及JAVA中原生正则表达式引擎的使用.在后续的文章中会涉及基于NFA的正则表达式引擎内部的工作原理,并在此基础上用1000行左右的JAVA ...

  5. 【C++】正则表达式引擎学习心得

    最近参照一些资料实现了一个非常简易的正则表达式引擎,支持基本的正则语法 | + * ()等. 实现思路是最基本的:正则式->AST->NFA->DFA. 以下是具体步骤: 一. 正则 ...

  6. (2015大作业)茹何优雅的手写正则表达式引擎(regular expression engine

    貌似刚开学的时候装了个逼,和老师立了个flag说我要写个正则表达式引擎,然后学期末估计老师早就忘了这茬了,在历时3个月的懒癌发作下,终于在这学期末deadline的时候花了一个下午加晚上在没有网的房间 ...

  7. 实现一个正则表达式引擎in Python(一)

    前言 项目地址:Regex in Python 开学摸鱼了几个礼拜,最近几天用Python造了一个正则表达式引擎的轮子,在这里记录分享一下. 实现目标 实现了所有基本语法 st = 'AS342abc ...

  8. 实现一个正则表达式引擎in Python(二)

    项目地址:Regex in Python 在看一下之前正则的语法的 BNF 范式 group ::= ("(" expr ")")* expr ::= fact ...

  9. 实现一个正则表达式引擎in Python(三)

    项目地址:Regex in Python 前两篇已经完成的写了一个基于NFA的正则表达式引擎了,下面要做的就是更近一步,把NFA转换为DFA,并对DFA最小化 DFA的定义 对于NFA转换为DFA的算 ...

随机推荐

  1. Spring4.0+Hibernate4.0+Struts2.3整合包括增删改查案例,解决整合中出现的异常

    源码下载:http://download.csdn.net/detail/cmcc_1234/7034775 ======================Application.xml======== ...

  2. 获取平台所有接口的IP和MAC地址

    我们有时候会有获取网口的IP和MAC地址的需求.可以通过ioctl来获取. #include <sys/ioctl.h>#include <net/if.h>#include ...

  3. Js制作点击输入框时默认文字消失的效果

    (从已经死了一次又一次终于挂掉的百度空间人工抢救出来的,发表日期 2014-02-17) 为了提高用户体验和易用度,一些设计师会对网页中用户经常用的东西进行优化,比如输入框.一般的输入框是怎样优化的呢 ...

  4. PL/pgSQL学习笔记之四

    http://www.postgresql.org/docs/9.1/static/plpgsql-structure.html 39.2. PL/pgSQL 的结构 PL/pgSQL是一种块式结构的 ...

  5. 【转】浅析linux内存模型

    转自:http://pengpeng.iteye.com/blog/875521 0. 内存基本知识 我们通常称 linux的内存子系统为:虚拟内存子系统(virtual memory system) ...

  6. MySQL 4种日志

  7. 【剑指offer】递归循环两种方式反转链表

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/25737023 本文分别用非递归和递归两种方式实现了链表的反转,在九度OJ上AC. 题目描写 ...

  8. Android 图像压缩,和LRU算法使用的推荐链接

    近两日,看的关于这些方面的一些教程数十篇,最好的当属google原版的教程了.国内有不少文章是翻译这个链接的. 需要注意的一点是:Android的SDK中的LRU算法在V4包和Util包中各有一个,推 ...

  9. C#基础-Func,Action

    Func,Action 的介绍及其用法 Func是一种委托,这是在3.5里面新增的,2.0里面我们使用委托是用Delegate,Func位于System.Core命名空间下,使用委托可以提升效率,例如 ...

  10. 4K加速普及,8K近在咫尺,下一个是?

        从铺天盖地的厂商宣传到亲戚朋友家的客厅.不可否认4K时代已全面到来------业内人士估计2015年是4K电视的一个突破年.知名市场调查机构StrategyAnalytics对4K电视进行了调 ...