编译原理 2 - 词法分析

news2024/11/17 5:25:41

  • 第3章 词法分析
    • 3.1 词法分析器的功能和结构
    • 3.2 状态转换图
    • 3.3 正则文法 和 正则表达式
    • 3.4 有限自动机 DFA与NFA
    • 测试


第3章 词法分析

重点:① 词法分析器的输入、输出;② 用于识别符号的状态转移图的构造;③ 根据状态转移图实现词法分析器
难点:词法的正规文法表示、正规表达式表示、状态转移图表示,以及它们之间的转换。

3.1 词法分析器的功能和结构

  • 词法分析器的功能
    把构成源程序的字符串转换成“等价的”单词序列(根据词法规则识别及组合单词,进行词法检查;对数字常数完成数字字符串到二进制数值的转换;删去空格和注释等不影响程序语义的字符)

  • 词法分析器 包含:
    预处理子程序:用于去除无用的空白、跳格、回车、换行等编辑性字符;区分标号区
    扫描器:在扫描缓冲区中识别单词符号
    扫描缓冲区:存放经过预处理的比较规范的字符串
    输入缓冲区:扫描器调用预处理子程序,将源程序输入到输入缓冲区中,预处理子程序读取输入缓冲区中的字符进行文本的预处理

  • 扫描缓冲区
    扫描器通过两个指针(起点指示器与搜索指示器)进行扫描,起点指示器指向马上要识别的单词的开始位置,搜索指示器从起点指示器的位置开始,寻找单词的结尾
    存在问题:① 缓冲区内容用完后,需要等待新的输入,应该避免类似等待;② 一个单词可能会被缓冲区分隔开,即单词的一部分在缓冲区中,另一部分没有读入,如果需要读入的话,需要将当前缓冲区中内容覆盖,单词的前半部分就无了,而且无法执行超前搜索
    解决方案:将缓冲区划分为两个半区(即设置双缓冲区),扫描器每次只读取一个半区的长度,如果搜索指示器指到当前半区的末尾,且还未找到单词末尾,则扫描器将后续内容读入另一半区,搜索指示器从另一半区开始继续寻找单词末尾;此外还需要限定 单词长度不能超过半区的长度
    具体实现方式:使用带标记的双缓冲区,每个缓冲区末尾都设置"EOF"区域结束标识
    缓冲区长度÷2 = 缓冲半区的长度 = 程序设计语言允许的标识符最大长度

3.2 状态转换图

  • 状态转换图:
    在这里插入图片描述
  • 实现(以状态0-1-2为例):
/* 状态0 -> 状态1 -> 状态2 */
int code, value;
strToken = "";  //存放构成单词符号
GetChar();  GetBC();  // 读取字符 跳过空白符
if(IsLetter())  //判断输入是否为字母
begin  /* 状态1 */
	while (IsLetter() or IsDigit())
	begin  /* 状态1循环 */
		Concat();  GetChar();  //拼接单词字符,继续读入
	end  
	/* 状态2 */
	Retract();  //回退最后的非字母数字输入
	code := Reserve();  //判断是关键字还是用户自定义标识符
	if (code = 0)  //是用户自定义标识符 
	begin
		value := InsertId(strToken);  //把strToken插入到符号表中
		return ($ID, value);  //返回标识符在符号表中的位置和对应值
	end
	else  //是关键字
		return (code, NULL);
end
  • 正则表达式 转换为 状态转换图
    在这里插入图片描述

3.3 正则文法 和 正则表达式

正则表达式 = 正则式
正则集 = 正则语言(简写为 “语言”)

  • 对于给定字母表 ∑ \sum
    1. ε 和 ∅ \varnothing 都是 ∑ \sum 上的正则表达式,它们所表示的正则文法为 {ε} 和 ∅ \varnothing
      理解:ε 既是一个字,也是一个正则表达式,它代表的正则集(语言)为{ε},该集合中有一个字,是ε,该字长度为0,不包含任何字符; ∅ \varnothing 既是一个集合,也是一个正则表达式,它代表的正则集为{ },该集合为空
    2. (定义) 任何 a ∈ ∑ a\in\sum a a a a ∑ \sum 上的正则表达式,它所表示的正则集为 { a } \{a\} {a}
      理解: a a a 既是字母表 ∑ \sum 中的一个字符,也是一个由一个字符a所构成的长度为1的字/字符串,也是一个正则表达式,所表示的正则语言 L ( a ) L(a) L(a) { a } \{a\} {a}
    3. e 1 e_1 e1 e 2 e_2 e2都是 ∑ \sum 上的正则表达式,所表示的正则文法分别为 L ( e 1 ) L(e_1) L(e1) L ( e 2 ) L(e_2) L(e2),则
      ( e 1 ∣ e 2 ) (e_1|e_2) (e1e2)为正则表达式,它表示的语言为 L ( e 1 ) ∪ L ( e 2 ) L(e_1)\cup L(e_2) L(e1)L(e2)
      ( e 1 ⋅ e 2 ) (e_1·e_2) (e1e2)为正则表达式,它表示的语言为 L ( e 1 ) L ( e 2 ) L(e_1) L(e_2) L(e1)L(e2)
      ( e 1 ) (e_1) (e1)为正则表达式,它表示的语言为 ( L ( e 1 ) ) ∗ (L(e_1))^* (L(e1))
      ④ 仅由有限次使用上述规则构造的表达式 是 ∑ \sum 上的正则w表达式
    4. 如果正则表达式 r 与 s 表示的正则语言相同,即 L ( r ) = L ( s ) L(r)=L(s) L(r)=L(s),则称 r 与 s 等价,也称 r 与 s 相等,记作 r = s
      问题 证明 b(ab)*=(ba)* → L(b(ab)*) = L(b)L((ab)*) = L(b)(L(ab))* = L(b)(L(a)L(b))* = {b}{ab}*,同理等式右侧表示的语言同左,等式得证

3.4 有限自动机 DFA与NFA

  • 确定有限自动机M是一个五元组 M = ( S , ∑ , f , S 0 , F ) M=(S, \sum, f, S_0, F) M=(S,,f,S0,F)
    S S S:有穷状态集合
    ∑ \sum :输入字母表(有穷)
    f f f:状态转换函数, f ( s , a ) = s ′ f(s, a)=s' f(s,a)=s表示当前状态 s s s,输入字符为 a a a,将状态转换到下一状态 s ′ s' s
    S 0 S_0 S0 S 0 ∈ S S_0 \in S S0S,是唯一的初态
    F F F:终止状态集合, F ⊆ Q F\subseteq Q FQ
    在这里插入图片描述
  • 非确定有限自动机 NFA,其定义与DFA类似,NFA M是一个五元组 M = ( S , ∑ , f , S 0 , F ) M=(S, \sum, f, S_0, F) M=(S,,f,S0,F),其中不同点如下:
    f f f:状态转换函数,为 S ∗ ∑ ∗ → 2 S S*\sum^* \rightarrow 2^S S2S(从一个状态读入一个字符,其后继状态不唯一)
    S 0 S_0 S0 S 0 ⊆ S S_0 \subseteq S S0S是非空的初态集(NFA可以有多个初态)
    在这里插入图片描述
  • DFA 与 NFA 比较
    在这里插入图片描述

测试

  1. 证明 (a*b*)* = (a|b)*

  2. 在这里插入图片描述
    答:B,含有aa或bb的字

  3. 在这里插入图片描述
    答:A初态即终态,识别空字ε后可以由初态到达终态,即A可以识别 {ε};B图不含有终态,不能识别任何字符,包括空字ε,即B可以识别{}空集

  4. 在这里插入图片描述
    答:B,含有aa或bb的字

  5. 在这里插入图片描述
    答:C

  6. 构造 ε|(0|1)01* | 0+的状态转换图
    在这里插入图片描述

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

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

相关文章

【MATLAB教程案例55】GoogleNet网络的MATLAB编程学习和实现,以步态识别为例进行仿真分析

欢迎订阅《FPGA学习入门100例教程》、《MATLAB学习入门100例教程》 目录 1.软件版本 2.GoogleNet理论概述

基于Qt的桌面客户端组件化框架DT 开源啦

这个是本人在工作中基于QT开发的组件化桌面开发框架,目前打算开源出来提供给大家,节省大家的开发时间和效率,希望对大家的开发有所帮助,也欢迎提出意见和改进建议 1. 为什么开源DT框架 DT框架,本身就是基于QT为基础搭…

深度学习——含并行连接的网络(GoogLeNet)笔记

GoogLeNet中基本的卷积块是Inception块。 1.Inception块:4个路径从不同的层面抽取信息,然后在输出通道合并 ①1*1的卷积层,减少通道数,降低模型的复杂度 ② 1*1的卷积层,减少通道数,降低模型复杂度。然后…

volatile关键字和synchronized关键字

参考博客:https://www.cnblogs.com/cg-ww/p/14540450.html 1、volatile的作用:关键作用是使变量在多个线程之间可见 程序并没有因为我修改之后结束运行,因为线程对共享变量具有不可见性,main线程修改布尔值之后,子线…

【读点论文】MicroNet: Towards Image Recognition with Extremely Low FLOPs,在极高限制下的轻量化网络

MicroNet: Towards Image Recognition with Extremely Low FLOPs Abstract 这篇论文旨在以极低的计算成本解决性能大幅下降的问题。提出了微分解卷积,将卷积矩阵分解为低秩矩阵,将稀疏连接整合到卷积中。 提出了一个新的动态激活函数-- Dynamic Shift …

精准管控 | AIRIOT数字油库智能化解决方案

在油库管理的过程中,储油罐区普遍存在分布空间范围广、安全防爆要求高、监控点多、布线复杂、自动化系统集成难度大等问题,传统的油库管理手段相对落后、管理环境复杂,企业在监测监控、设备设施管理、日常运行等方面存在诸多难点:…

Openldap2.5.13编译安装

Openldap2.5.13编译安装 本篇文章没有很全面,采用的是编译安装,yum安装参考我的另外一篇文章 一、准备 openssl-1.1.1.tar.gz 下载地址:https://ftp.openssl.org/source/old/1.1.1/openssl-1.1.1.tar.gz openldap-2.5.13.tgz 下载地址&#…

APS计划排产软件在仪器仪表行业的应用

仪器仪表是指用以产生、测量精密量的设备和装置,包括对精密量的观察、监视、测定、验证、记录、传输、变换、显示、分析处理与控制。仪器仪表是仪器仪表的一个重要分支。伴随国家出台政策大力发展精密仪器仪表下游行业,下游应用领域对精密仪器仪表的需求…

React 学习笔记:组件生命周期

组件生命周期 生命周期一个事物从创建到最后消亡经历的过程,在这个过程中会有不同的状态(新生儿、少年),所以在 16.8 版本以前生命周期只有类组件才有,函数组件是没有这个概念的,因为它没有状态&#xff0…

Diffusion-LM Improves Controllable Text Generation 扩散语言模型改善可控文本生成

论文链接:https://arxiv.org/abs/2205.14217 代码链接:https://github.com/XiangLi1999/Diffusion-LM 一、简介 无需重训模型控制语言模型的表现是自然语言生成(NLG)的一个重要开放问题,近期工作已经在简单句子属性控…

解读小红书2022年母婴行业报告:心智种草的流量密码

母婴用户代际更迭,90后晋升为母婴消费主力军。新一代宝爸宝妈的关注点在哪里?品牌该如何通过小红书满足ta们的进阶需求,为母婴消费注入新活力? 本文将解读小红书官方发布的《2022年母婴行业人群洞察报告》,基于上千名用…

Ubuntu20运行SegNeXt代码提取道路水体(二)——SegNeXt源代码安装到测试环境配置全过程摸索

首先我们在第一篇里面已经下载了SegNeXt代码 打开源代码 查看readme文件 我们先安装一下里面提到的torchprofile 链接在这 其实只要这个语句就能安装 pip install torchprofile这一步没什么问题 很顺利 接下来继续按照他的教程走 我们在(一)已经安装了…

快手小程序怎么开发

快手小程序开发很简单,直接找一个快手小程序开发平台就可以。 大家可以按照下面这个步骤去完成,完成后就能开发出一个快手小程序啦。 操作像玩消消乐那么简单! 不过在开发快手小程序前,需要先检查以下这几样东西有没有准备好&a…

小白学流程引擎-FLowable(五) — BPMN2.0模型规范

前言: 不用到处百度BPMN2的博客了,本篇文章带你系统掌握BPMN2规范的核心知识点。全文2万字,全覆盖BPMN2知识点,图文并茂,泡杯咖啡,慢慢细品~ 一、BPMN是什么 BPMN(Business Proces…

ChatGPT的理解

参考 李宏毅老师讲解 思维导图 ChatGPT 对标 instruct GPT 本质 GPT的社会化 训练过程 1 学习文字接龙 无监督学习 大量的自我学习 生成的答案具有随机性 自己修炼 2 人类老师引导文字接龙的方向 监督学习 标注:(问题提示,答案)对,引导gpt生…

10万字208道Java经典面试题总结(附答案)一

11、String 类的常用方法都有那些? equals、length、contains、replace、split、hashcode、indexof、substring、trim、toUpperCase、toLowerCase、isEmpty等等。 12、普通类和抽象类有哪些区别? 抽象类不能被实例化; 抽象类可以有抽象方法&…

分享米筐量化的使用方法

米筐量化都是量化金融分析经常会用到的数据提供平台,今天主要是来讲一下关于米筐量化的使用方法: 基本操作: 在这里把tushare和rqdatac是import为ts和rq,这import as会对之后的缩写产生影响。 例如: rq.get_price(o…

Docker网络模式

目录 网络模式 bridge模式(默认模式) host模式(仅主机模式) 初识网络模式 查看桥接模式 查看仅主机模式的特点 host模式 自定义网络 数据卷挂载tomcat 4.2自定义网络 网络模式 bridge模式(默认模式) docker run时使用–netbridge,这…

MySQL RR级别下,什么场景会产生不可重复读、幻读?

1 背景 最近在复习MySQL相关知识,忽然想到MVCC真的能完全解决不可重复读、幻读问题吗?于是做了下述测试。 2 准备环境 MySQL版本: ➜ ~ mysql --version mysql Ver 8.0.31 for macos12 on x86_64 (MySQL Community Server - GPL)MySQL隔…

Python学习-8.2.2 库(wordcloud库的基础与实例)

第三方库的介绍及安装方式见::Python学习-8.库(第三方库介绍与下载安装) wordcloud库概述 词云概念 是由词汇组成类似云的彩色图形,可以过滤掉大量的文本信息,使读者只要一眼扫过文本就可以领略文本的主旨…