有限状态自动机

编译原理知识

╄→гoц情女王★ 提交于 2020-01-08 01:12:38
1、将表达式翻译成后缀式 https://zhidao.baidu.com/question/421915764.html 2、绪论   指令格式:操作码 操作地址码   低级语言:机器语言、汇编语言   翻译:逻辑等价的程序语言转变、编译:专指高级语言一次性转化为低级语言、解释:高级语言的一解释一执行   编译程序工作过程一般可分为五个阶段:词法分析、语法分析、语义分析、优化和目标代码生成,同时伴随表格管理和出错处理   编译有自编译和交叉编译 3、词法分析   任务:从左到右逐个字符地对源程序进行扫描,产生一个个单词 (Token)符号,输入源程序,输出单词符号(流),需要不断访问、更新符号表   符号分类:保留字、标识符、常数、运算符、界符   输出为二元式:(单词种别,单词自身的值/内码值)   状态转换图     作用:识别单词     定义:状态转换图是 状态有限的有向图 ,结点代表 状态 ,用圆圈表示;结 点之间可由有向边连接,代表 状态转换关系 ,有向边上可标 记 字符 ,表示前一状态接受某一个字符之后的状态转移     状态转换图的表示:       • 初始状态用“ ->○”表示 • 非终止状态用“○”表示 • 状态之间的跳转用“ ”(有向边)表示 • 终止状态用“◎*”表示       含分支的状态 • 对应一个switch()语句 • 或对应一组if

字符串匹配算法——利用有限自动机进行匹配

前提是你 提交于 2019-12-22 15:29:31
  本文内容与《算法导论》中字符串匹配章节相关并部分摘录。   常用的字符串匹配算法有朴素字符串匹配算法,Rabin-Karp算法,利用有限自动机进行字符串匹配和KMP算法等。前面两种比较简单,重点是后面两种。 利用有限自动机进行字符串匹配   假设要对文本字符串T进行扫描,找出模式P的所有出现位置。这个方法可以通过一些办法先对模式P进行预处理,然后只需要对T的每个文本字符检查一次,并且检查每个文本字符所用时间为常数,所以在预处理建好自动机之后进行匹配所需时间只是Θ(n)。   假设文本长度为n,模式长度为m,则自动机将会有0,1,...,m这么多种状态,并且初始状态为0。先抛开自动机是怎样计算出来的细节,只关注自动机的作用。在从文本从左到右扫描时,对于每一个字符a,根据自动机当前的状态还有a的值可以找出自动机的下一个状态,这样一直扫描下去,并且一定自动机状态值变为m的时候我们就可以认为成功进行了一次匹配。先看下面简单的例子: 假设现在文本和模式只有三种字符a,b,c,已经文本T为"abababaca",模式P为"ababaca",根据模式P建立自动机如下图(b)(先不管实现细节):   (a)图为一些状态转化细节 如图(c),对照自动机转换图(b),一个个的扫描文本字符,扫描前状态值初始化为0,这样在i = 9的时候状态值刚好变成7 = m,所以完成一个匹配。  

用有限自动机(DFA)实现字符串匹配

纵然是瞬间 提交于 2019-12-03 12:12:06
这个算法在算法导论上写的很晦涩,而且还搞了一大堆定义和推导。其实背后的想法很naive。 既然要做字符串匹配,那就构造一个有限自动机出来:对于长度为n的pattern,如果当前字符串匹配上了一个字符,那么自动机的状态就是1;如果当前字符串匹配上了两个字符,那么自动机的状态就是2,……如果当前字符串把整个pattren都匹配了,那么自动机的状态就是n(也就是pattern的长度)。 现在问题来了,待匹配的字符串是千变万化的,怎么办?自动机的核心——状态转移函数——应该是什么样的?注意到,状态转移函数要对每个状态和每个可能的输入都有明确的定义,所以,只能对每个状态,都把整个字母表遍历一遍。 对于每个pattern,都有一个自动机;每个自动机也只和pattern有关(当然也和字母表有关,但是和待匹配的字符串无关)。 例如,pattern是“ababc”,待匹配的字符串是“abababc”那么,当字符串已经匹配了“abab”的时候(此时自动机的当前状态是4),下一个输入字符是“a”,那么,自动机的下一个状态应该是多少呢?稍微思考10秒钟,发现自动机的下一个状态应该是3。——这就是所谓的额后缀函数的本质。 然后按照这个思路想下去,得到的结论和算法导论上讲的那一堆晦涩难懂的东西,是一样的。 来源: https://www.cnblogs.com/adgjl/p/11795769.html