NFA】的更多相关文章

json的主页上,提供了number类型的符号识别过程,如下: 图片引用:http://www.json.org/json-zh.html 实际上这张图片表示的是一个状态机,只是状态没有标出来.因为这个状态机上存在ε转换,所以它是一个NFA(不确定有限自动机).ε转换也即不需要输入串就能进行的转换,例如从开始状态到0之前的状态.而我们进行识别的时候,使用DFA(确定有穷自动机)会简单方便得多.所以首先应该将这个NFA转成DFA. 首先把这个NFA规范一下,写成状态与箭头的形式:   NFA转DF…
求子串 数据结构中对串的5种最小操作子集:串赋值,串比较,求串长,串连接,求子串,其他操作均可在该子集上实现 数据结构中串的模式匹配 KPM模式匹配算法 基本的模式匹配算法 //求字串subString 在串string中的位置function subString(string, subString){ var i=0,j=0;//当i或j超出范围退出 while(i<string.length&&j<subString.length){ if(string[i]==subSt…
1       为什么要了解引擎匹配原理 一个个音符杂乱无章的组合在一起,弹奏出的或许就是噪音,同样的音符经过作曲家的手,就可以谱出非常动听的乐曲,一个演奏者同样可以照着乐谱奏出动听的乐曲,但他/她或许不知道该如何去改变音符的组合,使得乐曲更动听. 作为正则的使用者也一样,不懂正则引擎原理的情况下,同样可以写出满足需求的正则,但是不知道原理,却很难写出高效且没有隐患的正则.所以对于经常使用正则,或是有兴趣深入学习正则的人,还是有必要了解一下正则引擎的匹配原理的. 2       正则表达式引擎…
1.问题概述 NFA 和 DFA浅析---要深入了解正则表达式,必须首先理解有穷自动机. 有穷自动机(Finite Automate)是用来模拟实物系统的数学模型,它包括如下五个部分: 有穷状态集States 输入字符集Input symbols 转移函数Transitions 起始状态Start state 接受状态Accepting state(s)(终止状态) 下图为一台有穷自动机…
系列导航 (一)词法分析介绍 (二)输入缓冲和代码定位 (三)正则表达式 (四)构造 NFA (五)转换 DFA (六)构造词法分析器 (七)总结 有了上一节中得到的正则表达式,那么就可以用来构造 NFA 了.NFA 可以很容易的从正则表达式转换而来,也有助于理解正则表达式表示的模式. 一.NFA 的表示方法 在这里,一个 NFA 至少具有两个状态:首状态和尾状态,如图 1 所示,正则表达式 $t$ 对应的 NFA 是 N(t),它的首状态是 $H$,尾状态是 $T$.图中仅仅画出了首尾两个状态…
为了加速转换的处理,我压缩了符号表.具体算法参考任何一本与编译或者自动机相关的书籍. 这里的核心问题是处理传递性闭包,transitive closure,这个我目前采取的是最简单的warshall算法,虽然是4次的复杂度,但是由于我构建nfa的时候并没有采取标准的方法,使得nfa的节点减少很多.ps,上上篇所说的re转nfa,我这里有一个修改,就是对于or转换,不再增加节点,而是只增加两条空转换边. 相关代码如下 #include "nfa_process.h" //首先在原来的nf…
太累了,感觉不会再爱了.问题已经解决,具体的懒得说了. #include "regular_preprocess.h" //这个版本终于要上nfa了,好兴奋啊 //由于连个节点之间可能有多条边,所以只能用邻接表来存储了 //注意这里是有向图 //对于每一个token,这里都会生成一个或多个图节点 //但是每个token会附带另外的两个域,即这个token的开始节点和结束节点 //因为内部节点对于外部来说是不可连接的,所以不需要暴露 //这里有一个难题,就是空转换如何表示,这里我们必须找…
正则到nfabug的解决方法 前面提到了这个bug,为了解决这个bug,我们必须在每次引用到一个假名的时候,都构建一个拷贝.现在假设我们遇到了一个假名,并得到了他的开始节点和结束节点,当前的难题就是构造这个假名所代表的nfa的副本.构造方法类似于子集构造法,我们设立一个集合,这个集合为R,集合中的每个元素都有一个标志位为访问位.初始化R为开始节点a,并让他的访问位为0.现在开始进入迭代,只要R中存在访问位为0的点,将他的访问位改为1,然后将他的邻接表中的点都加入到R中.加入的时候,考虑R中是否已…
本人写的一个正则到nfa的bug 刚写完前面的那篇,自己用脑子过了一下,发现了一个bug.具体情况如下. 这个bug的产生条件是多次调用假名的时候,每次调用都会修改假名的nfa图.直接这么说不好理解,我就拿例子来讲吧.假设我们已经定义了一个假名num,而现在我们有一个正则表达式调用了两次这个假名,nums:[num][num],根据前面那篇文章里面所谈到的方法,会生成如下所示的nfa.这里假设num的开始节点为1,结束节点为2. 但是由于两个节点1和两个节点2引用的是相同的位置,所以上面的图等价…
[在此处输入文章标题] 正则到nfa 前言 在写代码的过程中,本来还想根据龙书上的说明来实现re到nfa的转换.可是写代码的时候发现,根据课本来会生成很多的无用过渡节点和空转换边,需要许多的代码.为了简化代码,我实现了我自己的re到nfa的规则. 注意我的这套re规则只包括如下几种类型: 闭包,即*运算符 一个或多个,即+运算符 存在或不存在,即?运算符.这三个运算符的优先级最高而且都是单目运算符. 括号括起来的,即成对的括号,其实也不算运算符,只能当作分隔符. 中括号括起来的,作为假名,也算是…
这个版本修改了前面版本的两个个bug. 第一个:识别到字符集的时候,只是将name_number加1,却并不对reg_pattern_table[name_number]进行初始化. 第二个:识别到假名的时候,并不为他分配一个name_number,而只是在hash表中为其分配一个表项. 现在,当识别到这两个的时候,都会为之分配一个name_number,并在reg_pattern_table中正确的初始化. 相关的修改的代码都在tackle_particle()函数中. 还有对tackle_c…
正则表达式匹配,包含两个东西,一个是表达式,一个文本. NFA(Nondeterministic Finite Automaton),不确定有穷自动机,表达式主导,NFA去吃文本,贪婪算法吃下去,如果因为前面吃得太多,导致后面没的吃(后面匹配失败),前面吃的要吐出一点,后面还匹配不成功,前面再吐出一点... DFA(Deterministic Finite Automaton),确定有穷自动机,文本主导,DFA去找吃货,去掉不能吃的吃货,找到最合适的吃货. 举例来说:.*[0-9]+, 去匹配…
一个数据块的访问时间等于寻道时间.旋转延迟时间和数据传输时间三者之和: NFA和DFA区别: 一个状态如A,遇0可以转换到下一个状态B或C,因为选择多所以不确定,因此为不确定的有限自动机: 一个状态还是A,遇0可以转换到下一个状态B(只有B),因为选择只有一个很确定,因此为确定的有限自动机.…
#include <iostream> #include <vector> #include <cstring> #include "stack" #include "algorithm" using namespace std; int NFAStatusNum,AlphabetNum,StatusEdgeNum,AcceptStatusNum; char alphabet[1000]; int accept[1000]; in…
保留版权,转载注明出处:潘军彪的个人博客(http://blog.csdn.net/panjunbiao/article/details/9378933) 将上下文无关文法读入内存之后,可以将它转换成非确定有限状态自动机.当然,不是所有的上下文无关文法都能够转换成自动机的,前提条件是这个上下文无关文法能够与正则定义等价.因此,在进行转换之前,我们需要先挑选出上下文无关文法中符合正则定义的规则.(参考博文http://blog.csdn.net/panjunbiao/article/details…
保留版权,转载需注明出处(http://blog.csdn.net/panjunbiao). 非确定有限状态自动机(Nondeterministic Finite Automata,NFA)由以下元素组成: 一个有限的状态集合S 一个输入符号集合Sigma,并且架设空字符epsilon不属于Sigma 一个状态迁移函数,对于所给的每一个状态和每一个属于Sigma或{epsilon}的符号,输出迁移状态的集合. 一个S中的状态s0作为开始状态(初始状态) S的一个子集F,作为接受状态(结束状态)…
原文:js 正则学习小记之NFA引擎 之前一直认为自己正则还不错,在看 次碳酸钴,Barret Lee 等大神都把正则玩的出神入化后发现我只是个战五渣.  求抱大腿,求大神调教. 之前大致有个印象,正则有很多种引擎,但我根本不知道有哪些引擎. 今天在读<精通正则表达式>才发现有Traditional NFA,POSIX NFA 和 DFA (具体自己百度下吧).可用了这么久的正则,还不知道 js 属于哪一种呢.在<精通正则表达式>里有个简单是方法检测属于哪一种. 用 /nfa|nf…
正则表达式引擎:nfa的转换规则. 正则到nfa 前言 在写代码的过程中,本来还想根据龙书上的说明来实现re到nfa的转换.可是写代码的时候发现,根据课本来会生成很多的无用过渡节点和空转换边,需要许多的代码.为了简化代码,我实现了我自己的re到nfa的规则. 注意我的这套re规则只包括如下几种类型: 闭包,即*运算符 一个或多个,即+运算符 存在或不存在,即?运算符.这三个运算符的优先级最高而且都是单目运算符. 括号括起来的,即成对的括号,其实也不算运算符,只能当作分隔符. 中括号括起来的,作为…
功能: 采用子集构造算法实现NFA的确定化 输入:读取NFA的文件(文件名test.txt),  文件格式: 第一列表示状态名,第二列和第三列分别表示输入字符a和b到达的状态 输出:确定化后的DFA(文件名为output.txt),格式如下: 第一列表示输入状态名,第二列表示重新命名的状态名,第三列和第四列分别表示输入字符a和b所到达的状态 代码: #include <stdio.h> #include <string.h> /* 子集构造算法实现NFA的确定化 * 输入文件:te…
概述 NFA非有穷自动机,即当前状态识别某个转换条件后到达的后继状态不唯一,这种自动机不便机械实现,而DFA是确定有限状态的自动机,它的状态转换的条件是确定的,且状态数目往往少于NFA,所以DFA能够比较方便的机械实现且识别能力方面也和NFA相当.本次实验采用子集构造法来实现不带空弧的由NFA到DFA的转换. 子集构造法的算法如下: 设NFA为M=(K,Σ,f,S0,Z),则构造相应的DFA  M′=(Q,Σ,f′,I0,F)①取I0=S0:②对于状态集Q中任一尚未标记的状态qi={Si1,Si…
本文将以两种方法实现NFA转DFA,并利用C语言实现. 方法二已利用HNU OJ系统验证,方法一迷之WA,但思路应该是对的,自试方案,测试均通过. (主要是思路,AC均浮云,大概又有什么奇怪的Case没想到) ========================================================== 下面的描述以机械工业出版社的<计算理论导引>的第三版35页图为例.该NFA如下图. 思路一:穷举组合状态,构造DFA 该思路接近<计算理论>课本35页思路.…
此次发表的是一个不确定的自动机(NFA),它可以根据输入的正规式输出由函数映像表示的结果. 此版本可以输入括号'(',')',但是,实现的过程理解起来有点吃力,所以,在时间允许的情况下,我还将写新文章,使用单纯递归方法实现该程序. #include"stdio.h" #include"stdlib.h" #define MAX 200 struct Stack { int Stack[MAX]; int top; }St; struct Queue { int fr…
本题摘自北邮的编译原理与技术. 首先,根据此图构造状态转换表 表中第一列第一行表示从第一个符号B通过任意个空转换能到达的节点,Ia表示由此行的状态数组({B,5,1}可以看作0状态)经过一个a可以到达的节点,同理,Ib表示由状态数组经过一个b可以到达的节点. 当然,有些人可能觉得{B,5,1}和{5,1,3}看作两个状态不合理,他们之间不是有交集嘛,实际上他们之间并无交集,因为输入a后,{B,5,1}能到达的新节点是3,之所以要写成{5,1,3},可能是要兼顾逻辑吧>_> 再仔细观察第一行,既…
题目描述 有一个定义在 \(\{0,1,2,3,4,5,6,7,8,9\}\) 上的合规表达式,包含三种基本的操作: 结合:\(E_1E_2\) 分配:\((E_1|E_2|\ldots|E_n),n\geq 2\) 重复:\((E_1)* ,n\geq 0\) 给你 \(l,r\),问你有多少个 \([l,r]\) 之间不含前导零的整数能匹配这个合规表达式. \(1\leq l\leq r\leq {10}^{18}\) 题解 直接建出这个合规表达式对应的 NFA,在上面跑数位 DP 即可.…
正则表达式几乎每个程序员都会用到,对于这么常见的一个语言,有没有想过怎么去实现一个呢?乍一想,也许觉得困难,实际上实现一个正则表达式的引擎并没有想像中的复杂,<编译原理>一书中有一章专门讲解了怎么基于状态机来构建基本的正则表达式引擎,它讲这个初衷是为词法分析服务,不过书里的东西相对偏理论了些,实现起来还是要费些功夫的,只是它到底指明了一条路,当然,书里只针对基本的语法进行了分析讲解,对于在实际中很多非常有用的扩展语法,它就基本没有涉及了,这些扩展的语法中有些是比较好实现的,有些则比较难. 基本…
看看Flink cep如何将pattern转换为NFA? 当来了一条event,如果在NFA中执行的? 前面的链路,CEP –> PatternStream –> select –> CEPOperatorUtils.createPatternStream 1. 产生NFACompiler.compileFactory,完成pattern到state的转换 final NFACompiler.NFAFactory<T> nfaFactory = NFACompiler.com…
本文转载自http://chriszz.sinaapp.com/?p=257 输入一个正则表达式,输出一个NFA. 我的做法:输入一个字符串表示正则,输出则是把输出到一个.dot文件中并将dot文件编译成pdf,fedora需要sudo yum install dot,然后evince XXX.pdf就可以查看生成的NFA了. 具体算法是按照龙书上的Tompson算法来的. 废话不多说,放码过来: /* Author:ChrisZZ(zchrissirhcz@gmail.com) Time:20…
今天来为大家分享一个编译原理中用正规表达式转NFA的小程序 正规表达式就是类似正则一样的式子,例如:(a|b)*abb,最后应该转化为: 大致的处理流程为: 例子中的表达式:(a|b)*abb,|和*都是运算法则,而且容易识别,但是处理abb就不是你那么方便了,所以我们在abb中间加上+号,就可以像|*那样识别了,所以处理后为(a|b)*a+b+b 我们识别出来之后,首先根据书中提供的运算符->NFA部件的图转化为NFA部件,之后再根据优先级和各个部件组建NFA 运算符对应NFA中的各个部件图为…
1.问题概述 随着计算机语言的结构越来越复杂,为了开发优秀的编译器,人们已经渐渐感到将词 法分析独立出来做研究的重要性.不过词法分析器的作用却不限于此.回想一下我们的老师刚刚开始向我们讲述程序设计的时候,总是会出一道题目:给出一个填入 了四则运算式子的字符串,写程序计算该式子的结果.除此之外,我们有时候建立了比较复杂的配置文件,譬如XML的时候,分析器首先也要对该文件进行词法分 析,把整个字符串断成了一个一个比较短小的记号(指的是具有某种属性的字符串),之后才进行结构上的分析.再者,在实现某种控…
如果不用 DFA, NFA,我觉得也是可以处理编译过程的,一个字符一个字符的读入,并结合上下文,来确定 token…