【学习笔记】编译原理-有限自动机

一、定义:

不确定的有限自动机(NFA): 一种数学模型

(1) 一个有限的状态集合S

(2) 一个输入符号集合∑(不包含ε)

(3) 一个转换函数move: S X (∑ U {ε}) -> P(S)

(4) 状态s0是唯一的开始状态

(5) 状态集合F是接受状态集合,S包含F

确定的有限自动机(DFA): 是NFA的特殊情况

(1) 任何状态都没有ε转换

(2) 对于任何状态s和任何输入符号a,最多只有一条标记为a的边离开,即转换函数move: S X ∑-> S可以是一个部分函数。

二、表示:

1.NFA:

NFA可以用带标记的有向图表示,节点表示状态,有标记的边代表转换函数。

(a|b)*ab的NFA

(图1)

状态转换表

状态\输入字符 a b
0 {0,1} {0}
1 ? {2}
2 ? ?
2.DFA:

(a|b)*ab的DFA

(图2)

三、NFA到DFA:子集构造法

步骤

假设有(a|b)*ab的NFA图中

(图3)

第一步:由起始位置配ε可以到达的所有状态集合{0,1,2,4,7}作为DFA的起始状态A;

第二步:确定字母表{a,b}

第三步:可以画出DFA的转换表Dtran的模型,(*表示未确定)

状态\输入字符 a b
A {0,1,2,4,7} * *

第四步:寻找表中未确定项,例如[A,a],为该空确定转移状态,从图(1)可知集合A中的状态匹配输入字符a,可以转移到的状态集合为{1,2,3,4,6,7,8},该集合没有出现过,所以要在DFA的转换表Dtran的模型中加入该状态集。

状态\输入字符 a b
A {0,1,2,4,7} B *
B {1,2,3,4,6,7,8} * *

第五步:重复第四步,知道确定DFA的转换表Dtran

状态\输入字符 a b
A {0,1,2,4,7} B C
B {1,2,3,4,6,7,8} B D
C {1,2,4,5,6,7} B C
D {1,2,4,5,6,7,9} B C

第六步:根据DFA转换表就可以画出DFA的状态图。

伪代码
Q    为处理的集合队列
s    起始状态集合
G    为转换表

S = getSet(s, ε); //获得起始状态集S

为S分配一个唯一的标识码,例如(0),对应到G;

将S加入队列Q;

while(Q不为空) {
    U = Q.front(), Q.pop(); // 取队列中的首项处理

    for (对于字母表中的每个字母) {
        New = getSet(U, a); // a为当前考虑的字符,New为集合变量,接受处理得到的新集合

        if (New == ?)
            continue;

        获得New集合的标识码,如果未出现,则在Q中加入New,并为New分配一个标识码。
        G[U,New] = a;
    }
}

对于getSet函数来说,给定一个集合U和匹配字符a,获得一个转移集合V,该函数需要注意边为ε的时候,因为NFA的边可以为ε。

【学习笔记】编译原理-有限自动机

时间: 2024-10-13 15:34:18

【学习笔记】编译原理-有限自动机的相关文章

学习笔记7_Java_day11_JSP原理(5)

4. jsp原理(理解) * jsp其实是一种特殊的Servlet > 当jsp页面第一次被访问时,服务器会把jsp编译成java文件(这个java其实是一个servlet类) > 然后再把java编译成.class > 然后创建该类对象 > 最后调用它的service()方法 > 第二次请求同一jsp时,直接调用service()方法. * 在tomcat的work目录下可以找到jsp对应的.java源代码. * 查看jsp对应java文件: > java脚本 >

Appium自动化测试学习笔记 —— Appium原理

Appium简介 开源.跨平台.多语言支持的移动应用自动化工具 可测对象 原生应用APP.混合应用APP.移动Web App APP运行环境:真机.模拟器 测试对象App运行平台 IOS.Android(目前这两种是市场主流):Windows.FirefoxOS. 测试程序运行平台支持 Windows.Linux.Mac OS; 注:IOS应用appium server必须运行在Mac OS系统上,如 MacBook.imac: 支持的测试语言 python.Java.ruby.php.js.C

黑马程序员-C学习笔记-编译预处理指令

------- ios培训. android培训.java培训.期待与您交流! ---------- 一.编译预处理指令 源代码 -> 编译预处理 -> 编译 -> 链接 -> 运行 编译预处理指令:在编译前进行解析处理的指令 特点:所有编译预处理指令都以#开头 所有编译预处理指令都不加分号 二.宏定义 1.不带参数的宏定义:  #define 宏名 值 (1)在预编译的时候所出现宏名标识的地方都会被替换成宏名后面的值 注意点:注释中的宏名不会被替换 在字符串中出现的宏名不会被替换

JeeSite学习笔记~代码生成原理

1.建立数据模型[单表,一对多表,树状结构表] 用ERMaster建立数据模型,并设定对应表,建立关联关系 2.系统获取对应表原理 1.怎样获取数据库的表 genTableForm.jsp: <label class="control-label">表名:</label> <div class="controls"> <form:select path="name" class="input-x

Python学习笔记-编译安装Python3.6.1 + iPython

由于系统已有2.6的python,最好不好修改系统的版本,使用编译安装 下载Python3.6.1包 wget https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tar.xz 安装依赖: yum -y install readline-devel 解压Python-3.6.1.tar.xz xz -d Python-3.6.1.tar.xztar -xvf Python-3.6.1.tar 编译安装,指定/usr/local/python3

linux学习笔记-rsync原理及使用

rsync的原理及使用 第1章 rsync原理及介绍 1.1什么是rsync Rsync是一款开源的.快速的.多功能的.可实现全量及增量的本地或远程数据同步备份的优秀工具.Rstync软件适用于unix/linux/windows等多种操作系统平台. Rsync英文全称为Remotesynchronization,即远程同步.从软件的名称就可以看出来,Rsync具有可使本地和远程两台主机之间的数据快速复制同步镜像.远程备份的功能,这个功能类似ssh带的scp命令,但又优于scp命令的功能,scp

深度学习笔记——PCA原理与数学推倒详解

PCA目的:这里举个例子,如果假设我有m个点,{x(1),...,x(m)},那么我要将它们存在我的内存中,或者要对着m个点进行一次机器学习,但是这m个点的维度太大了,如果要进行机器学习的话参数太多,或者说我要存在内存中会占用我的较大内存,那么我就需要对这些个点想一个办法来降低它们的维度,或者说,如果把这些点的每一个维度看成是一个特征的话,我就要减少一些特征来减少我的内存或者是减少我的训练参数.但是要减少特征或者说是减少维度,那么肯定要损失一些信息量.这就要求我在减少特征或者维度的过程当中呢,尽

学习编译原理

刚刚进入大二,初学习到编译原理,一门新的技术,而且学习起来会比较抽象,不过好在大一曾学习到VC这一门东西,在学习此门课程之前,已在网上了解到不少学习这门课该提前遇到道德东西,也了解到很多人学习这门课的问题,在他们的经验中知道了不少学习方法,希望自己能在日后中用得上.例如这个就觉得很不错:删繁就简,避重就轻.网上流传较广的一篇<编译原理学习导论>(作者四川大学唐良)就基本是这种思路,对于词法分析,作者避免了自动机理论和集合论推演的介绍,直接搬出源码来,大大降低了理解难度,对于语法分析,作者介绍了

对于学习编译原理

当知道要学习编译原理这门课程的时候,我并没有太多的感觉,觉得看着它就像看当初看导论一样,纯理论的知识就想草率的混过期末就可以.可是看到老师给我们看其他网站上对编译原理的解释时候,就觉得这门课真的很难很难,而且重要.简单浏览下专业人士和非专业人士对于编译的理解后,现在对于编译原理有了一个初步的认知,那就是学了编译原理,你更能够看懂代码,会有更深入本质性的认识,知道如何写代码会比较好一些.学习了编译原理不一定要你写出一个编译器,当然最好是自己写一个,更重要的是你要了解里面的编译思想.看了许多人说哪个