正则转nfa:bug消除】的更多相关文章

本人写的一个正则到nfa的bug 刚写完前面的那篇,自己用脑子过了一下,发现了一个bug.具体情况如下. 这个bug的产生条件是多次调用假名的时候,每次调用都会修改假名的nfa图.直接这么说不好理解,我就拿例子来讲吧.假设我们已经定义了一个假名num,而现在我们有一个正则表达式调用了两次这个假名,nums:[num][num],根据前面那篇文章里面所谈到的方法,会生成如下所示的nfa.这里假设num的开始节点为1,结束节点为2. 但是由于两个节点1和两个节点2引用的是相同的位置,所以上面的图等价…
正则到nfabug的解决方法 前面提到了这个bug,为了解决这个bug,我们必须在每次引用到一个假名的时候,都构建一个拷贝.现在假设我们遇到了一个假名,并得到了他的开始节点和结束节点,当前的难题就是构造这个假名所代表的nfa的副本.构造方法类似于子集构造法,我们设立一个集合,这个集合为R,集合中的每个元素都有一个标志位为访问位.初始化R为开始节点a,并让他的访问位为0.现在开始进入迭代,只要R中存在访问位为0的点,将他的访问位改为1,然后将他的邻接表中的点都加入到R中.加入的时候,考虑R中是否已…
太累了,感觉不会再爱了.问题已经解决,具体的懒得说了. #include "regular_preprocess.h" //这个版本终于要上nfa了,好兴奋啊 //由于连个节点之间可能有多条边,所以只能用邻接表来存储了 //注意这里是有向图 //对于每一个token,这里都会生成一个或多个图节点 //但是每个token会附带另外的两个域,即这个token的开始节点和结束节点 //因为内部节点对于外部来说是不可连接的,所以不需要暴露 //这里有一个难题,就是空转换如何表示,这里我们必须找…
[在此处输入文章标题] 正则到nfa 前言 在写代码的过程中,本来还想根据龙书上的说明来实现re到nfa的转换.可是写代码的时候发现,根据课本来会生成很多的无用过渡节点和空转换边,需要许多的代码.为了简化代码,我实现了我自己的re到nfa的规则. 注意我的这套re规则只包括如下几种类型: 闭包,即*运算符 一个或多个,即+运算符 存在或不存在,即?运算符.这三个运算符的优先级最高而且都是单目运算符. 括号括起来的,即成对的括号,其实也不算运算符,只能当作分隔符. 中括号括起来的,作为假名,也算是…
说实话,作为一个Domino开发者,像測试驱动开发(Test-driven development).功能驱动开发(Feature-driven development)之类软件开发的高大上的方法论(Methodology),仅仅是偶尔在用其它语言开发的文章和程序猿那里看到和听到过,Domino独特的体系架构使得这些方法论都不太适用.只是依据我近期參与的某国外大型Java产品的经验(也在聊天中得到了朋友的印证),在现实中不管是用什么语言开发什么样的项目,都普遍存在一种方法论,而且还没有得到理论家…
正则表达式引擎:nfa的转换规则. 正则到nfa 前言 在写代码的过程中,本来还想根据龙书上的说明来实现re到nfa的转换.可是写代码的时候发现,根据课本来会生成很多的无用过渡节点和空转换边,需要许多的代码.为了简化代码,我实现了我自己的re到nfa的规则. 注意我的这套re规则只包括如下几种类型: 闭包,即*运算符 一个或多个,即+运算符 存在或不存在,即?运算符.这三个运算符的优先级最高而且都是单目运算符. 括号括起来的,即成对的括号,其实也不算运算符,只能当作分隔符. 中括号括起来的,作为…
1.问题概述 随着计算机语言的结构越来越复杂,为了开发优秀的编译器,人们已经渐渐感到将词 法分析独立出来做研究的重要性.不过词法分析器的作用却不限于此.回想一下我们的老师刚刚开始向我们讲述程序设计的时候,总是会出一道题目:给出一个填入 了四则运算式子的字符串,写程序计算该式子的结果.除此之外,我们有时候建立了比较复杂的配置文件,譬如XML的时候,分析器首先也要对该文件进行词法分 析,把整个字符串断成了一个一个比较短小的记号(指的是具有某种属性的字符串),之后才进行结构上的分析.再者,在实现某种控…
一些无稽之谈: 对于正则表达式,永远似了解不明白,看到一些代码,脚本定期,awk,sed.心里总有点虚.主要是记不住.平时又没怎么用,也就没总结了. 如今有空,决定总结一下,顺便克服一下看到shell,js这些带有正则就心虚的弱点. 打算分三篇文章来写 正文: 一般来说,正则分好几种.但基本都差点儿相同,我所了解的有 "基本正则","扩展正则"及"perl正则",本文更偏向说记录"基本正则"和"扩展正则",…
很多朋友对extjs desktop感兴趣,就在原来简单的dsktop基础上,作了很多拓展  主要例如以下: 软件更新情况介绍: LinbDesk 拓展自Extjs 4.2的桌面Demo 拓展代码适用于ExtJs4.1,Extjs4.2,Extjs5.0 桌面图标自己主动换行 桌面图标自己主动换行白屏消除 桌面图标拖动 桌面分页-多桌面却换 桌面图标删除 桌面图标添加 桌面图标在几个桌面间移动 QQ登录系统 QQ登录用户基本信息弹窗 用户加入桌面应用图标 登录用户保存桌面图标设置 登录用户头像显…
Python 基本语法: ①  Python程序的格式:1.用代码高亮来标识函数丶语句等等 本身的代码高亮并没有实际的意义,只是用来辅助编程人员和阅读人员 更好的识别 2.程序以缩进来标识语句,缩进用来标识代码间的层次关系,缩进的长度也必须一样,一般4个空格或者直接按TAB ②Python程序的命名和保留字:Python的变量可以用大小写字母.数字.下滑线和汉字组合 但是尽量不要使用汉字来命名,并且不能以数字开头命名,且区分大小写. 保留字表示已经内部被定义的标识符,即不能被命名. ②  数据类…