二、编译原理-词法分析

一、词法分析器的作用

1、词法分析器的作用

读入字符流,组成词素,输出词法单元序列
过滤空白、换行、制表符、注释等
将词素添加到符号表中,以便编译的各个阶段取用

2、词法单元、模式、词素

(1)词法单元 (token)
  1.  <词法单元名、属性值 (可选) >
  2. 单元名是表示词法单位种类的抽象符号,语法分析器通过单元名即可确定词法单元序列的结构
  3.  属性值通常用于语义分析之后的阶段
(2) 模式 (pattern)
  1. 描述了一类词法单元的词素可能具有的形式
(3) 词素 (lexeme)
  1. 源程序中的字符序列
  2. 它和某个词法单元的模式匹配,被词法分析器识别为该词法单元的实例

二、词法单元的规约 (正则表达式)

正则表达式助记-CSDN博客文章浏览阅读129次。https://blog.csdn.net/m0_74161592/article/details/140027909?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522E80E9AD4-1FD2-4D32-AEC8-09FB80BE9503%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=E80E9AD4-1FD2-4D32-AEC8-09FB80BE9503&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-2-140027909-null-null.nonecase&utm_term=%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F&spm=1018.2226.3001.4450

1、串和语言

(1)概念

1)字母表 (alphabet) :一个有穷的符号集合 ( 字母、数字、标点符号 )
  1.  Eg:{ 0, 1 }, ASCII, Unicode
  2. 在理论上,我们可以把任意的有限集合看作字母表
2) 字母表上的串 (string) :是该表中符号的 有穷序列
  1. 串s的长度,即 |s|,是指s中符号出现的次数
  2. 空串:长度为0的串,ε
3) 语言 (language) :是某个给定字母表上的串的 可数 集合

(2)术语

1)前缀 (prefix):从串的尾部删除0个或多个符号后得到的串 (ban、banana、ε)
2)后缀 (suffix):从串的开始处删除0个或多个符号后得 到的串 (nana、banana、ε)
3) 子串 (substring):删除串的某个前缀和某个后缀得到的串 (banana、nan、ε)
4) 真前缀、真后缀、真子串:既不等于原串,也不等于空串的前缀、后缀、子串

(3)串的运算

连接 (concatenation)xy的连接是把y附加到x的后面而形成的串,记作xy

2、语言上的运算

3、正则表达式和正则定义

4、正则表达式的扩展

三、词法单元的识别 (状态转换图)

词法分析器的重要组件之一

1、状态转换图 (transition diagram)

(1)状态 (state):表示在识别词素时可能出现的情况

  1. 状态看作是已处理部分的总结
  2. 某些状态为接受状态最终状态,表明已找到词素
  3. 加上*的接受状态表示最后读入的符号不在词素中
  4. 开始状态 (初始状态):用Start边表示

(2)边 (edge):从一个状态指向另一个状态

  1. 边的标号是一个或多个符号,当前状态为s,下一个输入符号为a,就沿着从s离开, 标号为a

2、保留字和标识符的识别

(1) 在很多时候,保留字也符合标识符的模式
识别标识符的状态转换图也会识别保留字
(2) 解决方法
在符号表中 先填保留字 ,并指明它们不是普通标识符
为保留字建立独立的、 高优先级 的状态转换图

3、词法分析器的体系结构

从转换图构造词法分析器的方法 :
(1) 变量 state 记录当前状态
(2) 一个 switch 语句根据 state 的值转到相应的代码
(3)每个状态对应于一段代码
  1. 这段代码根据读入的符号,确定下一个状态
  2.  如果找不到相应的边,则调用fail()进行错误恢复
(4) 进入某个接受状态时,返回相应的词法单元
注意状态有 * 标记时,需要回退 forward 指针

4、处理多个模式的方法

词法分析器需要匹配多个模式
(1) 解决方法
  1. 按照优先级,顺序地尝试各个状态转换图,如果引发fail(),回退并尝试下一个状态图
  2. 更好的方法:并行地运行各个状态转换图;通过greedy策略,识别最长的与某个模式匹配的输入前缀
  3. 实际使用的方法:预先把各个状态转换图合成一个状态转换图,然后运行这个状态转换图 (后面介绍)

四、词法分析器生成工具及设计

1、词法分析工具Lex

(1)Lex/Flex是一个有用的词法分析器生成工具,通常和Yacc一起使用,生成编译器的前端

(2)声明部分
常量:表示常数的标识符
正则定义
(3) 转换规则
模式 { 动作 }
  1. 模式是正则表达式
  2. 动作表示识别到相应模式时应采取的处理方式
  3. 处理方式通常用是C语言代码表示
(4) 辅助函数
各个动作中使用的函数

(5) 词法分析器的工作方式
Lex生成的词法分析器作为一个函数被调用 , 在每次调用过程中,不断读入余下的输入符号 , 发现最长的、与某个模式匹配的输入前缀时
  1. 调用相应的动作,该动作进行相关处理
  2. 之后词法分析器继续寻找其它词素

五、有穷自动机

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

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

相关文章

NLP开端:Tokenizer-文本向量化

Tokenizer 问题背景 An was a algorithm engineer 如上所示&#xff0c;在自然语言处理任务中&#xff0c;通常输入处理的数据是原始文本。但是算法模型自能处理数值类型&#xff0c;因此需要找到一种方法&#xff0c;将原始的文本数据转换为数值类型的数据。这就是分词器所…

Java 方法重写(难)

目录 1&#xff0e;A类和B类都写一个相同的方法&#xff0c;先用static&#xff0c;两边都是一样的&#xff1a; 2&#xff0e;A类和B类都去掉static&#xff0c;出现了两个圆圈的符号&#xff0c;代表重写&#xff1a; 3&#xff0e;总结 4&#xff0e;为什么需要重写&…

thinkPHP 8.0.4 安装

windows 上安装最新版 thinkPHP8.0.4 下载phpStudy V8.1&#xff1a;小皮面板安装Composer2.x&#xff0c;Composer是PHP的一个依赖管理工具&#xff0c;主要功能包括依赖管理、版本控制、自动加载、扩展开发以及集成其他工具。安装 php8.0.2 4. 网站-管理-compose&#xff0c…

204页PPT金税四期监管要求与最新政策及风险防范-培训课件

读者朋友大家好&#xff0c;最近有会员朋友咨询晓雯&#xff0c;需要《204页PPT金税四期监管要求与最新政策及风险防范-培训课件&#xff08;经典》资料&#xff0c;欢迎大家下载学习。 金税四期稽查的重点包括以下方面&#xff1a; 企业发票&#xff1a;关注资金流、发票流、…

前后端独立部署的企业级私有化文档管理系统丨无忧·企业文档

大家好&#xff0c;我是软件部长&#xff0c;今天给大家介绍一款企业级在线知识库项目-JVS的无忧企业文档。 JVS提供低代码、物联网、规则引擎、智能BI、逻辑引擎、无忧企业文档&#xff08;在线协同&#xff09;、无忧企业计划、无忧企业邮筒等平台&#xff0c;欢迎关注微信公…

vscode连接不上远程服务器

删除缓存.vscode 然后再删除.ssh

Vue3快熟

Vue3快速上手 1. Vue3简介1.1. 【性能的提升】1.2.【 源码的升级】1.3. 【拥抱TypeScript】1.4. 【新的特性】 2. 创建Vue3工程2.1. 【基于 vue-cli 创建】2.2. 【基于 vite 创建】(推荐)2.3. 【一个简单的效果】 3. Vue3核心语法3.1. 【OptionsAPI 与 CompositionAPI】Options…

【C语言】常见的C语言概念

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 1. 什么是C语言2.C语言的历史3. 编译器的选择VS20223.1 编译和链接3.2 编译器的对比3.3 VS2022的优缺点 4.VS项目和源文件、头文件介绍5. 第一个C语言程序6. main函数7. printf和库函数8. 关键字介绍9. 字符和ASCII编…

react hooks--useReducer

概述 很多人看到useReducer的第一反应应该是redux的某个替代品&#xff0c;其实并不是 ◼ useReducer仅仅是useState的一种替代方案&#xff1a;  在某些场景下&#xff0c;如果state的处理逻辑比较复杂&#xff0c;我们可以通过useReducer来对其进行拆分&#xff1b; 或…

gma 2.0.13 (2024.09.16) 更新日志

安装 gma 2.0.13 pip install gma2.0.13网盘下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1P0nmZUPMJaPEmYgixoL2QQ?pwd1pc8 提取码&#xff1a;1pc8 注意&#xff1a;此版本没有Linux版&#xff01; 编译gma的Linux虚拟机没有时间修复&#xff0c;本期Linux版…

Angular17+leaflet集成天地图组件

Angular17leaflet集成天地图组件 例图 需要的包 "asymmetrik/ngx-leaflet": "^17.0.0","types/leaflet": "^1.9.12","leaflet": "^1.9.4",去天地图网站获取一个token https://www.tianditu.gov.cn/ 创建Angul…

8、创建一般资产负债科目

定义解释 在前台创建资产负债类科目。定义资产负债类会计科目。 在 SAP 中,会计科目的定义分为两层&#xff1a;科目表层和公司代码层。 比如&#xff1a;一个集团企业可以定义一套会计科目表&#xff0c;但是下面的每个公司代码&#xff0c;从中选择哪些科目&#xff0c;这…

透明LED模块的应用场景

随着科技的不断进步和市场需求的增长&#xff0c;透明LED显示屏的应用越来越广泛&#xff0c;成为了众多领域中的创新亮点。透明LED模块凭借其高通透率、轻薄设计以及与环境的完美融合&#xff0c;正逐步替代传统显示方式&#xff0c;为现代化的展示和广告提供了全新的解决方案…

PicoQuant公司:探索铜铟镓硒(CIGS)太阳能电池技术,引领绿色能源革新

铜铟镓硒&#xff08;‌CIGS&#xff09;‌薄膜太阳能电池具有生产成本低、污染小、不衰退、弱光性能好等显著特点&#xff0c;光电转换效率居各种薄膜太阳电池之首&#xff0c;接近于晶体硅太阳电池&#xff0c;而成本只是它的三分之一&#xff0c;被称为下一代非常有前途的新…

window批处理脚本:将本地的三个文件通过SCP传输到Linux设备上

文件名send_file.bat&#xff1a; echo off setlocal:: 提示用户输入远程IP地址 set /p remoteIpAddressplease input IP::: 定义本地文件名 set "localFile1111" set "localFile2222" set "localFile3333":: 获取本地文件的完整路径 set "…

项目与产品的生命周期

在项目管理领域有两个关键概念&#xff0c;即项目生命周期和产品生命周期。它们是理解项目管理过程中的关键要素。 项目生命周期是一个项目从概念到完成所经过的所有阶段。所有项目都可分成若干阶段&#xff0c;且所有项目无论大小&#xff0c;都有一个类似的生命周期结构。阶…

学习大数据DAY59 全量抽取和增量抽取实战

目录 需求流程&#xff1a; 需求分析与规范 作业 作业2 需求流程&#xff1a; 全量抽取 增量抽取 - DataX Kettle Sqoop ... 场景: 业务部门同事或者甲方的工作人员给我们的部门经理和你提出了新的需 求 流程: 联系 > 开会讨论 > 确认需求 > 落地 需求文档( 具体…

day-56 整数转罗马数字

思路 因为题目已经告知num<3999&#xff0c;所以只需依次对1000,900,500,400,100,90,50,40,10,9,5,4,1这些数进行除法&#xff0c;判断商是否大于等于1&#xff0c;如果大于等于1则将对应的罗马数字拼接到字符串中即可 解题过程 为了方便拼接&#xff0c;可以使用哈希键值对…

关于用matplotlib.pyplot加载图片颜色不对的解决方法

1.原理&#xff1a;用opencv加载的图片是BGR存储的。而用matplotlib.pyplot 需要RGB的格式,故在加载之前使用下面的语句改成RGB格式。 img2 cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 或使用 # img2 img[:, :, ::-1]#将图像img的颜色通道进行反转。 ::-1 表示在最后一个维度…

【吊打面试官系列-MySQL面试题】LIKE 声明中的%和_是什么意思?

大家好&#xff0c;我是锋哥。今天分享关于【LIKE 声明中的&#xff05;和_是什么意思&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; LIKE 声明中的&#xff05;和_是什么意思&#xff1f; &#xff05;对应于 0 个或更多字符&#xff0c;_只是 LIKE 语句中的…