上级文章

[编译原理随记]正则表达式记号和状态图:https://blog.csdn.net/qq_28033719/article/details/107067798

[编译原理随记]NFA转DFA子集构造算法:https://blog.csdn.net/qq_28033719/article/details/107068996


准备知识

语法制导:

解析(parse)输入的字符串时,在特定位置执行指定的动作。

语法制导算法:

其实就本文内容,解析字符串是什么状态(像>=通常弄个状态图,如果是关键字弄个表暂存比较适合)来说,这个算法相当于对字符串每一个字符进行下一个状态判断,就是 switch(string.charAt(i))这样逐个处理。

NFA状态数 = 正则表达式的 (符号 + 操作符数) * 2:

举例,比如说正则里面常有的运算符 *,| ,连接符,这些作为操作符,在下面的正则输入状态解析为:

1、输入 ε 和 a(符号),NFA状态图为:

状态数都是 2 = 1(符号数为1) * 2

2、输入 s|t ,NFA状态图为:

状态数是 6 = 3(符号数2 + 操作数1) * 2

3、s*,NFA状态图为:

状态数是 4 = 2(符号数1 + 操作符数1) * 2

所以每多一个符号数或者操作符数,对原图新增的状态数最多2,很多情况都是原状态 多了一个 空串 状态

出边入边,出度入度:

前后者概念有相似,出边入边本文指状态 A 转到下一个状态的边()为出边,进入状态A的边()为入边.

而后者指的是数量,出度就是专指有向图的出边 的出边数量),而入度是入边数( 的入边数量)

NFA三点性质:

1、NFA状态数 = 正则表达式的 (符号 + 操作符数) * 2

2、开始状态无入边,终结状态无出边

3、每个状态有一个[A-Za-z0-9]出边,或者至多两个 ε


Thompsion构造法

例题:将正则表达式  (a|b)*abb 变为 NFA

先将复合正则变为最基本的子表达式,然后进行语法制导(一步一步来)。

1、先处理优先度高的组合 (a | b),首先开始无入边,终结无出边,然后状态有一个字符出边,或者至多两个 ε

2、处理 (a|b)*,一样,根据 NFA 三性质得出,6 -> 1 状态代表循环输入,1 不能作为开始(有入边)6不能作为终结(有出边):

3、再把 abb 拼上去就行了:

3展示的就是 从正则 (a|b)*abb 转的 状态图。


模拟NFA

用双栈模拟:

因为 ε-closure(move(T , a)), T代表一个状态集合 比如T={1,2}

然后S = ε-closure(move(T , a)), S代表T移动a之后的集合 比如 S={3,4},T S都是多个元素,不是一个确定状态(DFA就是一个)。

所以使用两个栈(存储方面可以理解为数组,只是crud操作不同),存放 S、T 两种状态的转换(因为状态不确定,所以下一个状态是一个集合)

具体算法是:

S := ε-closure(0);
a := nextchar; // 理解为超前标记
while a != eof do beginS := ε-closure(move(S , a));a := nextchar;
end// F 为终结集合
if S ∩ F != ∅ thenreturn "yes";
return "no";

当然,将 NFA -> DFA也可以不过,这两者都需要衡量空间复杂度和时间复杂度。


DFA 和 NFA 时间空间衡量

NFA 空间是 <= 正则表达式的 (符号 + 操作符数) * 2

DFA 空间是 <= 2 ^ n (n为(a|b)字符数量,因为这个或运算使用状态数最多,所以推断任意数量 符号 + 操作符数)

NFA 时间复杂度 = 正则表达式的 (符号 + 操作符数) * X(输入的字符串长度,因为每个字符串都匹配)

DFA 时间复杂度 = X(因为每个字符都有一个确定状态,不用遍历)


下级文章:

[编译原理随记]正则表达式构建DFA(r(#)followpos(i)构造):https://blog.csdn.net/qq_28033719/article/details/117561604

[编译原理随记]正则表达式转为NFA状态图(Thompsion构造法)相关推荐

  1. 编译原理(六)自底向上分析之LR分析法

    自底向上分析之LR分析法 说明:以老师PPT为标准,借鉴部分教材内容,AlvinZH学习笔记. 基本概念 1. LR分析:从左到右扫描(L)自底向上进行规约(R),是规范规约,也即最右推导(规范推导) ...

  2. 编译原理LR(0)项目集规范族的构造详解

    学编译原理的时候,感觉什么LL(1).LR(0).SLR(1).LALR(1)思想满天飞. 而且做题的时候,一不留意,一道题就写了三页纸了. 就拿今天这个玩意儿来讲,我真的是考试前花了最多的时间,搞懂 ...

  3. 编译原理LR(0)项目集规范族的构造和分析的构造

    学编译原理的时候,感觉什么LL(1).LR(0).SLR(1).LALR(1)思想满天飞. 而且做题的时候,一不留意,一道题就写了三页纸了. 就拿今天这个玩意儿来讲,我真的是考试前花了最多的时间,搞懂 ...

  4. 【计算理论】计算理论总结 ( 正则表达式转为非确定性有限自动机 NFA | 示例 ) ★★

    文章目录 一.正则表达式转为非确定性有限自动机 NFA 要点 二.正则表达式转为非确定性有限自动机 NFA 示例 1 三.正则表达式转为非确定性有限自动机 NFA 示例 2 四.正则表达式转为非确定性 ...

  5. 【编译原理】:NFA转变为DFA的子集构造法

    整体的步骤是三步:  一,先把正规式转换为NFA(非确定有穷自动机),  二,在把NFA通过"子集构造法"转化为DFA,  三,在把DFA通过"分割法"进行最小 ...

  6. 【编译原理】 NFA转变为DFA的子集构造法

    整体的步骤是三步:  一,先把正规式转换为NFA(非确定有穷自动机),  二,在把NFA通过"子集构造法"转化为DFA,  三,在把DFA通过"分割法"进行最小 ...

  7. 编译原理——正规式、NFA转换构造DFA、DFA的化简

    一.DFA和NFA的区别 NFA:非确定有限自动机 DFA:确定有限自动机 NFA在同一状态,可以有多条出边,DFA在同一状态,只能有一条出边: NFA的初态可以具有多个,DFA的初态是唯一的: 比如 ...

  8. HTML4基本编译原理,Stanford公开课《编译原理》学习笔记(1~4课)

    课程里涉及到的内容讲的还是很清楚的,但个别地方有点脱节,任何看不懂卡住的地方,请自行查阅经典著作<Compilers--priciples, Techniques and Tools>(也 ...

  9. Stanford公开课《编译原理》学习笔记(1~4课)

    [摘要] 编译原理基础 示例代码托管在:http://www.github.com/dashnowords/blogs B站地址:[编译原理] Stanford公开课:[Stanford大学公开课官网 ...

最新文章

  1. 【Git】ubuntu安装git
  2. Python之Pandas:pandas.read_csv()函数的简介、具体案例、使用方法详细攻略
  3. 多线程、多进程、互斥锁
  4. synchronized的基本认识
  5. jClarity:在Azure上升级到Java
  6. linux将汇编转为机器码,汇编语言 高级语言 机器语言 本地代码
  7. Win10系列:C#应用控件基础7
  8. 数据结构 10分钟让你掌握经典排序(一)
  9. 基于jeesite的cms系统(一):开发环境搭建
  10. springmvc中校验框架(hibernate)
  11. MyBatis下载与简介
  12. 蓝桥杯省赛训练营——日期的计算
  13. linux系统怎么使用优盘,教你如何使用u盘安装Linux系统
  14. signature=e7411d00c74ac359f20083a015dc6ea9,MS12-020:遠端桌面的弱點可能會允許遠端程式碼執行:2012 年 3 月 13 日...
  15. 缓存穿透、击穿、雪崩什么的分不清楚?看了这篇文章后,我明白了
  16. Rust权威指南 读书笔记
  17. tewa-800g请输入正确的管理员账户_tp-link路由器如何设置管理员身份绑定 路由器设置管理员身份绑定方法【介绍】...
  18. Linux shell基础之变量声明和处理
  19. 麒麟 统信系统商店下载的安装包位置
  20. 5M香港服务器带宽能支持多少人同时在线?

热门文章

  1. Python学习:面向对象基础练习——士兵突击(代码演示) 及 身份运算符
  2. 记一次网络故障排除:nat虚拟机不能ping外网 浏览器可以上网
  3. 辣评10月自主轿车销量:帝豪下滑 “寒冬”之下取暖还得靠新能源
  4. 手机壁纸网站源码 带全自动采集 响应式手机电脑端模板
  5. 人工智能专业适合女孩学习吗?
  6. String字符串的相关语法及JPI
  7. review代码从哪些角度_转载:CodeReview正确的姿势是什么?
  8. i7 12650h参数 酷睿i712650h属于什么档次
  9. Orcad Capture CIS
  10. 沉睡者 - 微信内测一个手机可注册2微信号