【编译原理复习笔记】正则表达式与自动机

正则表达式

正则表达式是一种用来描述正则语言的更紧凑的表达方法
e.g. r = a ( a ∣ b ) ∗ ( ϵ ∣ ( . ∣ ) ( a ∣ b ) ) r=a(a|b)^*(\epsilon|(.|\\_ )(a|b)) r=a(ab)(ϵ(.∣)(ab))
正则表达式可以由较小的正则表达式按照特定的规则递归地构建。每个正则表达式定义的语言记作 L(r)。

正则表达式的定义

空字符是一个正则表达式,则 L ( ϵ ) = ϵ L(\epsilon) = \\{\epsilon\\} L(ϵ)=ϵ
属于字母表中的字母 a为一个正则表达式,则 L ( a ) = a L(a) = \\{a\\} L(a)=a
假设 r 和 s 都是正则表达式,表示的语言分别是 L(r)和 L(s)
则:
(1)r|s 是一个正则表达式:L(r|s)=L(r)并 L(s)
(2)rs 是一个正则表达式,L(rs) = L(r)L(s)
(3)r是正则表达式,其语言等于 r 语言的闭包
(4)(r)的语言就是 r 的语言
这四个运算的优先级从高到低分别是:
,连接,|
e.g.
∑ = a , b \sum = \\{a,b\\} =a,b
L(a|b) ={a,b}
L((a|b)(a|b))={aa,ab,ba,bb}
L(a*) = (L(a))** = {a}* = {epsilon,a,aa,…}
十进制整数:(1|…|9)(0|…|9)|0
八进制整数:0(1|…|7)(0|…|7)

正则语言

可以用正则表达式定义的语言叫做正则语言

正则表达式的代数定律

(1)|具有交换律结合律
(2)连接具有结合律
(3)连接对|具有分配律
(4)epsilon 可以作为连接的单位元: ϵ s = s ϵ = s \epsilon s = s \epsilon = s ϵs==s
(5)闭包中一定包含 epsilon
(6)克林闭包具有幂等性

正则定义

正则定义是具有如下形式的定义red:序列
d i → r i d_i \to r_i diri
其中 di 均不相同,且都不在字母表中
每一个 ri 均为字母表中的符号,或者为已经定义过的正则表达式
e.g.
d i g i t → 0 ∣ 1 ∣ . . . ∣ 9 digit \to0|1|...|9 digit0∣1∣...∣9
KaTeX parse error: Expected group after '_' at position 30: …..|Z|a|...|z|\\_̲
i d e n t i f i e r → l e t t e r ( l e t t e r ∣ d i g i t ) ∗ identifier \to letter(letter|digit)^* identifierletter(letterdigit)
这三条式子合在一起就完成了对 identifier 的定义

自动机

有穷自动机

Finite Automata,是对一类处理系统建立的数学模型
这类系统具有一系列离散的输入输出信息和有穷的内部状态
系统只需要根据当前的状态和当前面临的输入信息就可以决定系统的后继行为,每当系统处理了当前的输入,内部状态就会发生改变
e.g.电梯控制装置
不需要知道先前全部的状态,只需要知道当前状态与还未满足的状态
e.g. 图灵机
在这里插入图片描述

输入带用来存放符号串
读头用来从左至右逐个读取输入符号,不能够修改或者往返移动
有穷控制器:具有有穷个状态数,根据当前状态和当前输入符号转入下一个状态

转换图

结点:有穷自动机的状态
初始状态:只能有一个,用start 表示
终止状态:可以有多个,用双圈表示
带标记的有向边:如果对于输入 a,存在一个从状态 p 到 q 的转换,就在 p,q 之间
在这里插入图片描述

FA 接收的语言

给定输入串 x,如果存在一个对应于 x 的从初始状态到终止状态的序列,就可以被接受
由一个有穷自动机 M 接受的所有串构成的集合称为是该 FA 接收的语言,记为 L(M)
上图中自动机接受的语言即为所有以 abb 结尾的{a,b}上的串的集合

最长子串匹配原则

当输入串的多个前缀与一个或多个模式匹配时,总是选择最长的前缀进行匹配
因此尽管到达某个终态,只要还存在有向边带符号指向其他节点,FA 就继续前进,寻找尽可能长的匹配
e.g. x=-1
s t a r t → 0 → < 1 → = 2 start\to 0 \to^<1\to^=2 start0<1=2
-1<1,-1<=2
故根据最长子串匹配原则,应该到 2 为结束状态

有穷自动机的分类

确定的有穷自动机 DFA

M = ( S , ∑ , δ , s 0 , F ) M = (S,\sum,\delta,s_0,F) M=(S,,δ,s0,F)
S 表示有穷状态集
SUM 表示输入字母表,这里假设空字符不属于输入字母表
delta 为 S * SUM 到 S 的映射,表示从状态 s 出发,沿着有向边 a 能够到达的状态
s0 开始状态
F 终止状态的red:集合

非确定有穷自动机NFA

与有穷状态机的区别
沿着有向边 a 可能到达多个状态,故 delta 表示 S*SUM 映射到 2^S 的集合

DFA 和 NFA 具有等价性

对于任何 NFA,有 DFA 可以识别同一语言
对于任何 DFA,有 NFA 可以识别同一语言
在这里插入图片描述

带有空边的 NFA

带空边的有向线段从一个状态指向另一个状态代表了不需要条件就可离开当前状态,类似串联一系列 if,当满足某个 if的时候就会停留在该状态并处理对应的程序,随后继续向下检验其他 if
带有空边的 NFA 和不带空边的 NFA 也可以等价:
在这里插入图片描述

DFA 的算法实现

s = s 0 s = s_0 s=s0
c = n e x t C h a r ( ) ; c = nextChar(); c=nextChar();
KaTeX parse error: Expected '}', got 'EOF' at end of input: …ile (e!=eof)\\{
$ s=move(s,c);$
c = n e x t C h a r ( ) ; c = nextChar(); c=nextChar();
i f s ∈ F r e t u r n y e s if s \in F \\ return \\ yes ifsFreturnyes
e l s e f a l s e else \\ false elsefalse

从正则表达式到DFA

往往需要 NFA 作为中介
对于空字 epsilon/字母表中符号 a
s t a r t → q 0 → ϵ q f start \to q_0 \to^\epsilon q_f startq0ϵqf
s t a r t → q 0 → a q f start \to q_0 \to^a q_f startq0aqf
其余运算对应的 NFA:
在这里插入图片描述

从 NFA 到 DFA

子集构造法:首先将 NFA 图改写成转换表
然后具体去写
在这里插入图片描述

识别标识符的 DFA

d i g i t → 0 ∣ 1 ∣ . . . ∣ 9 digit \to0|1|...|9 digit0∣1∣...∣9
KaTeX parse error: Expected group after '_' at position 30: …..|Z|a|...|z|\\_̲
i d e n t i f i e r → l e t t e r ( l e t t e r ∣ d i g i t ) ∗ identifier \to letter(letter|digit)^* identifierletter(letterdigit)
根据识别标识符的正则定义,我们可以首先获得其 NFA
在这里插入图片描述
此时的 NFA 与 DFA 相等,所以不用再进行转换

识别注释的 DFA

在确定一个状态机的时候首先要确保正则定义是正确的,否则无法写出正确的状态机
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/839248.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

综述 | 走向图对比学习:综述与展望

【摘要】近年来&#xff0c;图的深度学习在各个领域取得了显著的成功。然而&#xff0c;对带注释的图形数据的依赖仍然是一个很大的瓶颈&#xff0c;因为它的成本过高且耗费时间。为了应对这一挑战&#xff0c;图的自监督学习(SSL)得到了越来越多的关注&#xff0c;并取得了重大…

群晖搭建网页版Linux Ubuntu系统并实现远程访问

文章目录 1. 下载Docker-Webtop镜像2. 运行Docker-Webtop镜像3. 本地访问网页版Linux系统4. 群晖NAS安装Cpolar工具5. 配置异地访问Linux系统6. 异地远程访问Linux系统7. 固定异地访问的公网地址 docker-webtop是一个基于Docker的Web桌面应用&#xff0c;它允许用户通过浏览器远…

二十五、openlayers官网示例CustomOverviewMap解析——实现鹰眼地图、预览窗口、小窗窗口地图、旋转控件

官网demo地址&#xff1a; Custom Overview Map 这个示例展示了如何在地图上增加一个小窗窗口的地图并跟随着地图的旋转而旋转视角。 首先加载了一个地图。其中 DragRotateAndZoom是一个交互事件&#xff0c;它可以实现按住shift键鼠标拖拽旋转地图。 const map new Map({int…

客户端Web资源缓存

为了提高Web服务器的性能,其中的一种可以提高Web服务器性能的方法就是采用缓存技术。 1.缓存 1.1.什么是缓存&#xff1f; 如果某个资源的计算耗时或耗资源&#xff0c;则执行一次并存储结果。当有人随后请求该资源时&#xff0c;返回存储的结果&#xff0c;而不是再次计算。…

【Linux】-Flink分布式内存计算集群部署[21]

注意&#xff1a; 本节的操作&#xff0c;需要前置准备好Hadoop生态集群&#xff0c;请先部署好Hadoop环境 简介 Flink同spark一样&#xff0c;是一款分布式内存计算引擎&#xff0c;可以支撑海量数据的分布式计算 Flink在大数据体系同样是明星产品&#xff0c;作为新一代的…

ElasticSearch集群重平衡(Shard allocation)案例分析及性能调优

何谓重平衡 ElasticSearch为了使数据平均分布在集群节点上&#xff0c;重平衡机制会由Master节点决定索引分片具体分配到哪个Data节点以及何时在节点之间迁移分片&#xff0c;使分片在数据大小、分片数量的层面上尽可能均匀分布在集群中的所有Data节点&#xff0c;充分发挥每个…

css - sass or scss ?

总的来说&#xff0c;Sass 和 SCSS 提供的功能是一样的&#xff0c;选择哪种语法主要取决于你的个人或团队的偏好。

4.2 循环语句(for, while)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

【Linux取经路】基于信号量和环形队列的生产消费者模型

文章目录 一、POSIX 信号量二、POSIX 信号量的接口2.1 sem_init——初始化信号量2.2 sem_destroy——销毁信号量2.3 sem_wait——等待信号量2.4 sem_post——发布信号量 三、基于环形队列的生产消费者模型3.1 单生产单消费模型3.2 多生产多消费模型3.3 基于任务的多生产多消费模…

期货学习笔记-横盘行情学习1

横盘行情的特征及分类 横盘行情的概念 横盘行情时中继形态的一种&#xff0c;一般常出现在大涨或大跌之后出现横盘行情是对当前趋势行情的修正&#xff0c;是对市场零散筹码的清理&#xff0c;是为了集中筹码更便于后期行情的展开 横盘行情的特征 1.水平运动&#xff1a;该…

【文献阅读】ESG评级不确定性对企业绿色创新的影响研究

ESG评级不确定性对企业绿色创新的影响研究 张张张三丰de思考与感悟 论文内容总结&#xff1a;本文主要是关于ESG评级不确定性&#xff08;也即来自三个评级机构的ESG得分差异&#xff09;&#xff0c;对企业绿色创新的影响。并且有效地区分了创新数量和创新质量。创新数量的是专…

iptablese防火墙【SNAT和DNAT】

目录 1.SNAT策略及应用 1.1SNAT原理与应用 1.2 SNAT策略的工作原理 1.3 实验操练 2.DNAT策略 2.1 DNAT策略的概述 2.2 DNAT原理与应用 2.3 实验操练 1.SNAT策略及应用 1.1SNAT原理与应用 SNAT 应用环境&#xff1a;局域网主机共享单个公网IP地址接入Internet&#xf…

uniappx 应用未读角标插件(完善推送、通知、消息效果) Ba-Shortcut-Badge-U

简介&#xff08;下载地址&#xff09; Ba-Shortcut-Badge-U 是设置应用未读角标的原生插件&#xff0c;UTS版本&#xff08;同时支持uniapp和uniappx&#xff09; 支持设置未读、清空未读支持机型有Huawei、oppo、xiaomi、Samsung、Sony、LG、HTC、ZUK、ASUS、ADW、APEX、NO…

快速将短信从 Android 传输到 iPhone [支持 iPhone 15]

短信中包含有关工作和生活的重要信息&#xff0c;因此当我们拿到新手机时&#xff0c;它们不会丢失。今天&#xff0c;我们要讨论的是如何将短信从Android快速传输到iPhone&#xff0c;包括最新的iPhone 15。在Android和iOS操作系统之间&#xff0c;我们可以轻松地将短信从Andr…

C语言(指针)8

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸各位能阅读我的文章&#xff0c;诚请评论指点&#xff0c;关注收藏&#xff0c;欢迎欢迎~~ &#x1f4a5;个人主页&#xff1a;小羊在奋斗 &#x1f4a5;所属专栏&#xff1a;C语言 本系列文章为个人学习笔记&#x…

BUUCTF-misc23

[GUET-CTF2019]zips1 1.打开附件 是一个加密的压缩包 2.暴力破解压缩包 得到压缩包密码 3.010Editor 解密之后又得到一个加密的压缩包 发现不是解密文件 用010Editor打开是伪加密&#xff0c;将09 00 给为 00 00 4.Python 用Python运行文件里的部分内容&#xff0c;发现密…

高精度可编程直流电源功能

在电子产品开发和测试中&#xff0c;高精度可编程直流电源是一种非常重要的工具。它不仅能够提供稳定可靠的电源供应&#xff0c;还能够精确地控制输出电压和电流,满足各种复杂的测试需求。下面我们就来详细了解一下高精度可编程直流电源的功能特点。 1. 输出精度高 高精度可…

基于深度学习OCR文本识别

第一步&#xff1a;概要 基于深度学习OCR文本识别分为两个模块&#xff1a;DBNet和CRNN。 DBNet是基于分割的文本检测算法&#xff0c;算法将可微分二值化模块(Differentiable Binarization)引入了分割模型&#xff0c;使得模型能够通过自适应的阈值图进行二值化&#xff0c;并…

php发送短信功能(创蓝短信)

一、以下是创蓝发送短信的功能&#xff0c;可以直接执行&#xff1a; <?php$phone 12312312312;$msg 测试短信功能;echo 发送手机号&#xff1a;.$phone.<br/>;echo 发送内容&#xff1a;.$msg.<br/>;$send sendMessage($phone, $msg);var_dump($send);…

HQL面试题练习 —— 品牌营销活动天数

题目来源&#xff1a;小红书 目录 1 题目2 建表语句3 题解 1 题目 有营销活动记录表&#xff0c;记录了每个品牌每次营销活动的开始日期和营销活动的结束日期&#xff0c;现需要统计出每个品牌的总营销天数。 注意&#xff1a; 1:苹果第一行数据的营销结束日期比第二行数据的营…