[编译原理随记]正则表达式转为NFA状态图(Thompsion构造法)
上级文章
[编译原理随记]正则表达式记号和状态图: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构造法)相关推荐
- 编译原理(六)自底向上分析之LR分析法
自底向上分析之LR分析法 说明:以老师PPT为标准,借鉴部分教材内容,AlvinZH学习笔记. 基本概念 1. LR分析:从左到右扫描(L)自底向上进行规约(R),是规范规约,也即最右推导(规范推导) ...
- 编译原理LR(0)项目集规范族的构造详解
学编译原理的时候,感觉什么LL(1).LR(0).SLR(1).LALR(1)思想满天飞. 而且做题的时候,一不留意,一道题就写了三页纸了. 就拿今天这个玩意儿来讲,我真的是考试前花了最多的时间,搞懂 ...
- 编译原理LR(0)项目集规范族的构造和分析的构造
学编译原理的时候,感觉什么LL(1).LR(0).SLR(1).LALR(1)思想满天飞. 而且做题的时候,一不留意,一道题就写了三页纸了. 就拿今天这个玩意儿来讲,我真的是考试前花了最多的时间,搞懂 ...
- 【计算理论】计算理论总结 ( 正则表达式转为非确定性有限自动机 NFA | 示例 ) ★★
文章目录 一.正则表达式转为非确定性有限自动机 NFA 要点 二.正则表达式转为非确定性有限自动机 NFA 示例 1 三.正则表达式转为非确定性有限自动机 NFA 示例 2 四.正则表达式转为非确定性 ...
- 【编译原理】:NFA转变为DFA的子集构造法
整体的步骤是三步: 一,先把正规式转换为NFA(非确定有穷自动机), 二,在把NFA通过"子集构造法"转化为DFA, 三,在把DFA通过"分割法"进行最小 ...
- 【编译原理】 NFA转变为DFA的子集构造法
整体的步骤是三步: 一,先把正规式转换为NFA(非确定有穷自动机), 二,在把NFA通过"子集构造法"转化为DFA, 三,在把DFA通过"分割法"进行最小 ...
- 编译原理——正规式、NFA转换构造DFA、DFA的化简
一.DFA和NFA的区别 NFA:非确定有限自动机 DFA:确定有限自动机 NFA在同一状态,可以有多条出边,DFA在同一状态,只能有一条出边: NFA的初态可以具有多个,DFA的初态是唯一的: 比如 ...
- HTML4基本编译原理,Stanford公开课《编译原理》学习笔记(1~4课)
课程里涉及到的内容讲的还是很清楚的,但个别地方有点脱节,任何看不懂卡住的地方,请自行查阅经典著作<Compilers--priciples, Techniques and Tools>(也 ...
- Stanford公开课《编译原理》学习笔记(1~4课)
[摘要] 编译原理基础 示例代码托管在:http://www.github.com/dashnowords/blogs B站地址:[编译原理] Stanford公开课:[Stanford大学公开课官网 ...
最新文章
- 【Git】ubuntu安装git
- Python之Pandas:pandas.read_csv()函数的简介、具体案例、使用方法详细攻略
- 多线程、多进程、互斥锁
- synchronized的基本认识
- jClarity:在Azure上升级到Java
- linux将汇编转为机器码,汇编语言 高级语言 机器语言 本地代码
- Win10系列:C#应用控件基础7
- 数据结构 10分钟让你掌握经典排序(一)
- 基于jeesite的cms系统(一):开发环境搭建
- springmvc中校验框架(hibernate)
- MyBatis下载与简介
- 蓝桥杯省赛训练营——日期的计算
- linux系统怎么使用优盘,教你如何使用u盘安装Linux系统
- signature=e7411d00c74ac359f20083a015dc6ea9,MS12-020:遠端桌面的弱點可能會允許遠端程式碼執行:2012 年 3 月 13 日...
- 缓存穿透、击穿、雪崩什么的分不清楚?看了这篇文章后,我明白了
- Rust权威指南 读书笔记
- tewa-800g请输入正确的管理员账户_tp-link路由器如何设置管理员身份绑定 路由器设置管理员身份绑定方法【介绍】...
- Linux shell基础之变量声明和处理
- 麒麟 统信系统商店下载的安装包位置
- 5M香港服务器带宽能支持多少人同时在线?
热门文章
- Python学习:面向对象基础练习——士兵突击(代码演示) 及 身份运算符
- 记一次网络故障排除:nat虚拟机不能ping外网 浏览器可以上网
- 辣评10月自主轿车销量:帝豪下滑 “寒冬”之下取暖还得靠新能源
- 手机壁纸网站源码 带全自动采集 响应式手机电脑端模板
- 人工智能专业适合女孩学习吗?
- String字符串的相关语法及JPI
- review代码从哪些角度_转载:CodeReview正确的姿势是什么?
- i7 12650h参数 酷睿i712650h属于什么档次
- Orcad Capture CIS
- 沉睡者 - 微信内测一个手机可注册2微信号