摘要: 正则到nfabug的解决方法前面提到了这个bug,为了解决这个bug,我们必须在每次引用到一个假名的时候,都构建一个拷贝。现在假设我们遇到了一个假名,并得到了他的开始节点和结束节点,当前的难题就是构造这个假名所代表的nfa的副本。构造方法类似于子集构造法,我们设立一个集合,这个集合为R,集合中的每个元素都有一个标志位为访问位。初始化R为开始节点a,并让他的访问位为0。现在开始进入迭代,只要R中存在访问位为0的点,将他的访问位改为1,然后将他的邻接表中的点都加入到R中。加入的时候,考虑R中是否已经存在这个元素,如果已经存在,则不加入。如果不存在,则加入,并设置访问位为0。然后返回迭代判断。最后当 阅读全文
posted @ 2013-06-24 19:36 huangnima 阅读(289) 评论(0) 推荐(0) 编辑
摘要: 本人写的一个正则到nfa的bug刚写完前面的那篇,自己用脑子过了一下,发现了一个bug。具体情况如下。这个bug的产生条件是多次调用假名的时候,每次调用都会修改假名的nfa图。直接这么说不好理解,我就拿例子来讲吧。假设我们已经定义了一个假名num,而现在我们有一个正则表达式调用了两次这个假名,nums:[num][num],根据前面那篇文章里面所谈到的方法,会生成如下所示的nfa。这里假设num的开始节点为1,结束节点为2。 但是由于两个节点1和两个节点2引用的是相同的位置,所以上面的图等价于下面的图。可以明显的看出这个并不是我们所需要的规则,图中所表示的是[num]+。之... 阅读全文
posted @ 2013-06-24 16:16 huangnima 阅读(345) 评论(0) 推荐(0) 编辑
摘要: [在此处输入文章标题]正则到nfa前言在写代码的过程中,本来还想根据龙书上的说明来实现re到nfa的转换。可是写代码的时候发现,根据课本来会生成很多的无用过渡节点和空转换边,需要许多的代码。为了简化代码,我实现了我自己的re到nfa的规则。注意我的这套re规则只包括如下几种类型:闭包,即*运算符一个或多个,即+运算符存在或不存在,即?运算符。这三个运算符的优先级最高而且都是单目运算符。括号括起来的,即成对的括号,其实也不算运算符,只能当作分隔符。中括号括起来的,作为假名,也算是分隔符连接运算符,即.运算符,但是在输入re的时候默认不输入这个符号,只有在处理输入的时候才添加这个符号。这个运算符的 阅读全文
posted @ 2013-06-24 15:10 huangnima 阅读(2438) 评论(0) 推荐(0) 编辑
摘要: 这个版本修改了前面版本的两个个bug。第一个:识别到字符集的时候,只是将name_number加1,却并不对reg_pattern_table[name_number]进行初始化。第二个:识别到假名的时候,并不为他分配一个name_number,而只是在hash表中为其分配一个表项。现在,当识别到这两个的时候,都会为之分配一个name_number,并在reg_pattern_table中正确的初始化。相关的修改的代码都在tackle_particle()函数中。还有对tackle_cat()函数的定义移动到了tackle_invisible_cat()函数的前面。另外一个重大的修改就是,将当 阅读全文
posted @ 2013-06-24 13:23 huangnima 阅读(713) 评论(0) 推荐(0) 编辑