U3 词法分析

news2024/12/25 12:54:24

文章目录

  • 一、定义
    • 1、任务
    • 2、构造
    • 3、输出形式
  • 二、(有穷状态)自动机
  • 三、正则文法和状态图
  • 四、词法分析程序流程
    • 1、单词及内部表示
    • 2、词法分析程序需要引用的公共(全局)变量和过程
  • 五、自动机
    • 1、DFA(确定的有穷状态自动机)
    • 2、NFA(不确定的有穷自动机)
      • 正则表达式
    • 3、NFA确定化
      • 1)一些概念
      • 2)确定化过程
    • 4、DFA的极简化(极小化)
      • 1)一些概念
      • 2)矩阵法
      • 3)分割法
  • 六、词法分析的自动化

一、定义

1、任务

依据文法(词法)分析和识别单词。

2、构造

源程序是由字符序列构成的,词法分析扫描源程序(字符串),根据语言的词法规则分析并识别单词,并以某种编码形式输出。
单词:是语言的基本语法单位,一般语言有四大类单词
<1>语言定义的关键字或保留字(如BEGIN、END、IF)
<2>标识符:由用户定义,表示各种名字的字符串
<3>常数:无符号数、布尔常数、字符串常数等
<4>分界符(运算符) (如 + 、 − 、 ∗ 、 / 、 ; 、(、) … … +、-、*、/、;、(、) …… +/;、(、)……

3、输出形式

按单词种类分类
在这里插入图片描述
保留字和分界符采用一符一类
在这里插入图片描述
符号根据文法的非终结符确定

二、(有穷状态)自动机

在这里插入图片描述
(有穷状态)自动机:是另一种抽象 Σ ∗ Σ^* Σ上的语言 L L L 的方法
字母表 Σ Σ Σ,状态集 Q Q Q,初始状态 s s s,状态转移函数,接受状态

根据文法建立自动机
在这里插入图片描述
多自动机同时工作
在这里插入图片描述
如果一个单词同时满足多个自动机,那么通常我们选择 最长的匹配,或者显示指定优先级(如:保留字优先)

三、正则文法和状态图

词法分析主要针对的是3型文法。
左线性文法状态图的画法:
在这里插入图片描述
例如:
在这里插入图片描述
因此:给定左线性文法,我们可以得到状态图。
左右线性文法等价:从左(右)线性文法,可以构造等价的右(左)线性文法
在这里插入图片描述

四、词法分析程序流程

在这里插入图片描述

1、单词及内部表示

保留字和分界符采用一符一类
在这里插入图片描述

2、词法分析程序需要引用的公共(全局)变量和过程

在这里插入图片描述
UnGetCH一般是程序结束时会多读一个字符(判断是否结束),此时需要回退一个单位。

五、自动机

1、DFA(确定的有穷状态自动机)

一个确定的有穷自动机(DFA)M是一个五元式: M = ( S , Σ , δ , s 0 , Z ) M=(S, Σ,δ, s_0, Z) M=(S,Σδ,s0,Z)

  1. S —有穷状态集
  2. Σ —输入字母表
  3. δ —映射函数(也称状态转换函数)
    S × Σ → S S×Σ→S S×ΣS
    δ ( s , a ) = s ’ , s , s ’ ∈ S , a ∈ Σ δ(s,a)=s’ , s, s’ ∈S, a∈Σ δ(s,a)=s,s,sS,aΣ
  4. s 0 s_0 s0—初始状态 s 0 ∈ S s_0 ∈S s0S
  5. Z—终止状态集 Z ⊆ S Z \subseteq S ZS
    例如:
    在这里插入图片描述

2、NFA(不确定的有穷自动机)

若δ是一个多值函数,且输入可允许为ε,则有穷自动机是不确定的,即在某个状态下,对于某个输入字符存在多个后继状态。
在这里插入图片描述

正则表达式

( R ) (R) (R) R ∗ R^* R R 1 R 2 R1R2 R1R2 R 1 ∣ R 2 R1|R2 R1∣R2
{}的作用和*一样
在这里插入图片描述
优先级: 先 ∗ , 后• , 最后 ∣ 先*, 后 •, 最后 | ,,最后
给定正则,构造NFA
在这里插入图片描述

3、NFA确定化

1)一些概念

  1. 集合 I I I ε ε ε-闭包
    令I是一个状态集的子集,定义 ε − c l o s u r e ( I ) ε-closure(I) εclosure(I)为:
    1)若 s ∈ I s∈I sI,则 s s s ε − c l o s u r e ( I ) ε-closure(I) εclosure(I)
    2)若 s ∈ I s∈I sI,则从 s s s出发经过任意条ε弧能够到达的任何状态都属于 ε − c l o s u r e ( I ) ε-closure(I) εclosure(I)
    状态集 ε − c l o s u r e ( I ) ε-closure(I) εclosure(I)称为 I I I ε ε ε-闭包。
  2. I I I N F A M ’ NFA M’ NFAM的状态集的一个子集, a ∈ Σ a∈Σ aΣ
    定义: I a = ε − c l o s u r e ( J ) I_a=ε-closure(J) Ia=εclosure(J)
    其中 J = ∪ δ ( s , a ) J = ∪δ(s,a) J=δ(s,a)
    J J J是从状态子集I中的每个状态出发,经过标记为 a a a的弧而达到的状态集合。
    I a I_a Ia是状态子集,其元素为J中的状态,加上从 J J J中每一个状态出发通过 ε ε ε弧到达的状态。
    注意状态转移后若还能通过 ε ε ε弧到达的状态,也需要包含进去.
    在这里插入图片描述

2)确定化过程

根据定义不断循环,即可得到状态转换矩阵。
得到的新状态不断递归。
在这里插入图片描述
将求得的状态转换矩阵重新编号.
在这里插入图片描述
画出新的状态转移图。
注意:原初始状态的 ε − c l o s u r e ε-closure εclosure为DFA M的初态
包含原终止状态4的状态子集为 D F A M DFA M DFAM的终态,因此上述中3和4是终态。
在这里插入图片描述

4、DFA的极简化(极小化)

对于任一个DFA,存在一个唯一的状态最少的等价的DFA。

一个有穷自动机是化简的 <=> 它没有多余状态并且它的状态中没有两个是互相等价的。

一个有穷自动机可以通过消除多余状态和合并等价状态而转换成一个最小的与之等价的有穷自动机

1)一些概念

  1. 有穷自动机的多余状态:
    从该自动机的开始状态出发,任何输入串也不能到达那个状态。
    在这里插入图片描述
  2. 等价状态:状态s和状态t的等价条件是
    一致性条件:状态s和t必须同时为可接受状态或不接受状态
    蔓延性条件:对于所有输入符号,状态s和t必须转换到等价的状态里。

2)矩阵法

状态合并例题求解:
首先画出状态矩阵,对角线不用看(本来就是一个状态)
只要看一半部分就行(上半部分和下半部分是对应的)
在这里插入图片描述
终态和非终态一定不能合并
在这里插入图片描述
考察 ( q 0 , q 1 ) (q_0,q_1) (q0,q1),0进入的是互相,不能作为判断依据(状态合并则等同于同一状态,状态不合并则不是同一状态,没有判断依据)。1进入的状态分别是 q 2 , q 3 q_2,q_3 q2,q3,若两者属于同一状态则可合并,反之不可,因此此时还不能定夺,继续往下看。
在这里插入图片描述
考察 ( q 2 , q 3 ) (q_2,q_3) (q2,q3),它们状态转移进去的状态一致,因此合并。因此 ( q 0 , q 1 ) (q_0,q_1) (q0,q1)可以合并
在这里插入图片描述
考察 ( q 0 , q 5 ) (q_0,q_5) (q0,q5),一个到达终态,另一个到达非终态,显然不能合并
在这里插入图片描述
考察 ( q 2 , q 4 ) (q_2,q_4) (q2,q4),到达状态相同,可以合并
在这里插入图片描述
在这里插入图片描述
合并结果
在这里插入图片描述

3)分割法

把一个DFA(不含多余状态)的状态分割成一些 不相关的子集,使得任何不同的两个子集状态都是可区别的,而同一个子集中的任何状态都是等价的。
例题求解
在这里插入图片描述
首先区分终态和非终态
在这里插入图片描述
根据区分状态继续分解,直到不能分解为止
在这里插入图片描述
结果如下
在这里插入图片描述
最终得到结果:
在这里插入图片描述

六、词法分析的自动化

给定RE → NFA → DFA → 极小化,从而自动生成词法分析程序(正则表达式与DFA的等价性)。
自动化步骤:

  1. 读LEX源程序,分别生成NFA,用状态图表示为
    在这里插入图片描述
  2. 合并成一个NFA
    在这里插入图片描述
  3. 确定化
    在这里插入图片描述

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

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

相关文章

深耕中国成分,柳丝木打造茶小光IP赋能乡村振兴

随着全球可持续性发展理念的增强&#xff0c;越来越多品牌在行商业化道路之外&#xff0c;开始思考自身的社会责任&#xff0c;不断参与公益行动&#xff0c;践行ESG理念【Environmental&#xff08;环境&#xff09;、Social&#xff08;社会&#xff09;和 Governance &#…

HASH 哈希算法之MD5 算法

1. 哈希算法&#xff0c;用C 写的 #include <iostream> #include <iomanip> #include <cstring> #include <openssl/md5.h> #include <stdio.h>using namespace std;int main() {string str "hello world";unsigned char digest[MD5…

没有实权的PM如何做好项目管理?

在一些公司中&#xff0c;项目经理&#xff08;PM&#xff09;可能并没有实权&#xff0c;这种情况下如何做好项目管理呢&#xff1f;实际上&#xff0c;即使没有实权&#xff0c;PM仍然可以通过一些方法来确保项目的顺利进行。 首先&#xff0c;PM可以通过建立良好的沟通渠道来…

软著项目推荐 深度学习的视频多目标跟踪实现

文章目录 1 前言2 先上成果3 多目标跟踪的两种方法3.1 方法13.2 方法2 4 Tracking By Detecting的跟踪过程4.1 存在的问题4.2 基于轨迹预测的跟踪方式 5 训练代码6 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习的视频多目标跟踪实现 …

《opencv实用探索·十一》opencv之Prewitt算子边缘检测,Roberts算子边缘检测和Sobel算子边缘检测

1、前言 边缘检测&#xff1a; 图像边缘检测是指在图像中寻找灰度、颜色、纹理等变化比较剧烈的区域&#xff0c;它们可能代表着物体之间的边界或物体内部的特征。边缘检测是图像处理中的一项基本操作&#xff0c;可以用于人脸识别、物体识别、图像分割等多个领域。 边缘检测…

Streamlit框架的定制化

Streamlit框架的定制化 最近做了一个关于streamlit框架的项目&#xff0c;颇有感触&#xff0c;所以在这里记录一下。 什么是streamlit? Streamlit 是一个python的WEB UI库&#xff0c;它做了高度的封装以便于不懂后前端开发的人员也能轻松构建画面。你可以从官网进行详细的…

你真的掌握结构体了么?结构体习题(C语言)

前言 上一期博客我们学习了结构体的相关知识&#xff08;上期链接&#xff09;&#xff0c;但是学了不练也是不行的&#xff0c;我们今天讲给大家分享两道有点恶心的题目&#xff0c;让大家来加深对结构体的理解&#xff0c;那么话不多说我们现在开始吧&#xff01; 第一题 有…

zabbix 进阶

zabbix的字段发现机制&#xff1a; zabbix客户端主动和服务端联系&#xff0c;将自己的地址和端口发送服务端实现字段添加监控主机。 客户端是主动一方。 缺点&#xff1a;自定义网段中主机数量太多&#xff0c;登记耗时会很久&#xff0c;而且这个自动发现机制不是很稳定。…

Hadoop学习笔记(HDP)-Part.20 安装Flume

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

AIGC+医疗专题:生成式人工智能于医疗健康

今天分享的是AI系列深度研究报告&#xff1a;《AIGC医疗专题&#xff1a;生成式人工智能于医疗健康》。 &#xff08;报告出品方&#xff1a;AREFACT&#xff09; 报告共计&#xff1a;23页 医疗保健中生成性人工智能的崛起: 在承诺与控制之间导航 Generative Al已经历了大规…

Python-代码块缩进详解

python中&#xff0c;if后面没有&#xff08;&#xff09;&#xff0c;执行代码块也没有{} 而是以&#xff1a;为结尾 代码块以缩进的形式书写&#xff1a; a input("请输入一个整数&#xff1a;") if a 1:print(aaaa) print(bbbb)#此时这一行代码就与判断条件无关…

数据结构-02-链表

相比数组&#xff0c;链表是一种稍微复杂一点的数据结构。掌握起来也要比数组稍难一些。这两个非常基础、非常常用的数据结构。 1-链表结构 数组需要一块连续的内存空间来存储&#xff0c;对内存的要求比较高。如果我们申请一个20MB大小的数组&#xff0c;当内存中没有连续的、…

python打包exe,打包好后,启动exe报错找不到paddleocr

目录 1、安装pyinstaller 2、生成脚本文件的.spce文件 3、资源文件配置 4、生成exe文件 5、使用了paddleocr启动exe后报错 6、配置.spce文件 7、重新生成exe文件 8、关于图片找不到的问题 参考&#xff1a;PaddleOCR打包exe--Pyinstaller_paddleocr 打包exe_mjiansun的博…

智能监控/安防监控视频平台EasyCVR下级更新目录表出现离线情况的两种解决方案

GB28181安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备…

esp32使用命令查看芯片flash大小以及PSRAM的大小

在idf.py命令窗口中输入 esptool.py -p COM* flash_id 其中COM*是连接你的esp32芯片的端口号。

打工人副业变现秘籍,某多/某手变现底层引擎-StableDiffusionWebUI界面基本布局和操作

一、界面设置 文生图&#xff1a;根据文本提示生成图像 图生图&#xff1a;图像生成图像&#xff1b;功能很强大&#xff0c;自己在后续使用中探索。 后期处理&#xff1a;图片处理&#xff1b;功能很强大&#xff0c;自己在后续使用中探索。 PNG信息&#xff1a;这是一个快…

“轻松管理视频文件:高效归类与统一重命名“

随着电子设备的普及&#xff0c;我们的视频文件可能来自各种不同的源头&#xff0c;如何高效地管理和查找这些文件成为了一个问题。今天&#xff0c;我们将为您提供一个完美的解决方案——自动归类并统一重命名视频文件。 首先&#xff0c;第一步&#xff0c;我们要进入文件批…

基于openEuler20.03安装openGauss5.0.0及安装DBMind

基于openEuler20.03安装openGauss5.0.0及安装DBMind 一、环境说明二、安装部署三、问题及解决 一、环境说明 虚拟机&#xff1a;VirtualBox操作系统&#xff1a;openEuler20.3LTS &#xff08;x86&#xff09;数据库&#xff1a;openGauss5.0.0 (x86)DBMind&#xff1a;dbmind…

智能优化算法应用:基于学生心理学算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于学生心理学算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于学生心理学算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.学生心理学算法4.实验参数设定5.算法结果…

Esxi6.0 安装web管理界面

安装6.0之后默认是vSphere Client进行远程连接&#xff0c;需要安装客户端&#xff0c;不是太方便。搜索发现还真可以实现web管理&#xff0c;步骤如下&#xff1a; 1、开启esxi的ssh&#xff0c;步骤如下图&#xff1a; 2、下载升级包esxui-signed-7119706.vib&#xff0c;上…