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

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

文章目录

一、正则表达式转为非确定性有限自动机 NFA 要点

二、正则表达式转为非确定性有限自动机 NFA 示例 1

三、正则表达式转为非确定性有限自动机 NFA 示例 2

四、正则表达式转为非确定性有限自动机 NFA 示例 3





一、正则表达式转为非确定性有限自动机 NFA 要点


正则表达式转为非确定性有限自动机 NFA 流程 :


① 原子自动机 : 首先要构造 原子自动机 , 从 非接受状态 指向 接受状态 ;


② 基本拼装 : 将原子自动机进行 基本的拼装 , 并运算 , 交运算 ;


③ 复杂拼装 : 将 基本拼装的自动机 进行 进一步拼装 ;



拼装原则 : 使用 ε \varepsilonε 箭头 进行拼装 ;


① 串联 : 前者的接受状态 使用 ε \varepsilonε 箭头 指向 后者的开始状态 , 前者接受状态取消 ; 如果有两个接受状态 , 那么就需要引出两个箭头


② 并联 : 在二者之前 , 重新添加一个非接受状态的开始状态 , 使用两个 ε \varepsilonε 箭头 分别指向二者的开始状态 ;


③ 星运算 : 重新添加一个接受状态的开始状态 , 使用 ε \varepsilonε 箭头从 接受状态 指向 开始状态 ; 注意所有的接受状态 , 都要使用 ε \varepsilonε 箭头指向开始状态 ;






二、正则表达式转为非确定性有限自动机 NFA 示例 1


将正则表达式 ( 0 ∪ 1 ) ∗ 000 ( 0 ∪ 1 ) ∗ \rm (0 \cup 1)^*000 ( 0 \cup 1 )^*(0∪1)

000(0∪1)

 转为 NFA ;



构造原子自动机 : 注意从 非接受状态 → \to→ 接受状态 ;

image.png



( 0 ∪ 1 ) \rm (0 \cup 1)(0∪1) 并联拼装 : 在二者前面添加 非接受状态 起始状态 ;

image.png



( 0 ∪ 1 ) ∗ \rm (0 \cup 1)^*(0∪1)

 星运算 : 使 接受状态 → \to→ 起始状态 , 并添加一个 接受状态 起始状态 , 指向原来的起始状态 ;

image.png



000 000000 串联 : 前者的接受状态 必须转为 非接受状态 , 前者的接受状态 必须转为 非接受状态 , 后者的状态是不变的 ;


image.png


总拼装 :


串联注意事项 : ( 0 ∪ 1 ) ∗ \rm (0 \cup 1)^*(0∪1)

 有 3 33 个接受状态 , 需要引出 3 33 个 ε \varepsilonε 箭头 指向 000 000000 代表的自动机 的 开始状态 ;


串联时的状态改变 : 使用 ε \varepsilonε 箭头 连接 前者的接受状态 → \to→ 后者的起始状态;


串联时 前者的接受状态 必须转为 非接受状态 ,


后者的状态是不变的 , 如果是接受状态 , 那么就保持接受状态不变 , 同理如果是非接受状态 , 那么保持非接受状态不变 ;


image.png


化简后结果 :


image.png




目录
相关文章
|
23天前
正则表达式的常用示例
正则表达式的常用示例
16 3
|
6月前
|
自然语言处理 算法 编译器
编译原理复习一:正则表达式-NFA NFA-DFA DFA最小化(附题目与答案 超详细)
编译原理复习一:正则表达式-NFA NFA-DFA DFA最小化(附题目与答案 超详细)
273 0
|
6月前
|
Linux Perl
使用awk和正则表达式过滤文本或字符串 - 详细指南和示例
使用awk和正则表达式过滤文本或字符串 - 详细指南和示例
150 0
|
存储 索引 Python
【100天精通python】Day23:正则表达式,基本语法与re模块详解示例
【100天精通python】Day23:正则表达式,基本语法与re模块详解示例
105 0
|
6月前
|
Java 索引
正则表达式源码分析--三个常用类--分组、捕获、反向引用--String 类中使用正则表达式的代码示例和图
正则表达式源码分析--三个常用类--分组、捕获、反向引用--String 类中使用正则表达式的代码示例和图
76 0
|
算法 Java
从0到1打造正则表达式执行引擎(一) 正则表达式转NFA (1)
重复匹配(正则表达式中的 ? + *) 正则表达式里有4种表示重复的方式,分别是:
65 1
|
算法 测试技术
从0到1打造正则表达式执行引擎(二) NFA转DFA
然后对DFA的节点0执行步骤1,找到NFA中所有a可达的NFA节点(1#2#4#6#8#9)构成NFA中的节点1,如下图。
116 0
|
设计模式 算法
从0到1打造正则表达式执行引擎(一) 正则表达式转NFA (2)
看完上文之后相信你一直知道如果将一个正则表达式转化为状态机的方法了,这里我们要将理论转化为代码。首先我们要将图转化为代码标识,我用State表示一个节点,其中用了Map<MatchStrategy, List> next表示其后继节点,next中有个key-value就是一条边,MatchStrategy用来描述边的信息。
71 0
|
数据采集 移动开发 Python
正则表达式——语法、re模块的使用(附示例)
正则表达式——语法、re模块的使用(附示例)
138 0
正则表达式——语法、re模块的使用(附示例)
|
机器学习/深度学习 移动开发 前端开发
关于正则表达式的使用的一些小示例
关于正则表达式的使用的一些小示例
81 0