二、编译原理-词法分析

news2024/11/13 10:36:45

一、词法分析器的作用

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.coloradmin.cn/o/2148618.html

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

相关文章

Halcon OCR检测 免训练版

一.前言&#xff1a; 目前新版的Halcon已经具备了DeepOcr的功能可以涵盖大部分的识别场景&#xff0c;缺点是有些特殊的应用场景依然需要大量的图片训练&#xff0c;而且Halcon22之前的版本DeepOCR是不支持训练的&#xff0c;我们都知道传统的OCR项目是通过Blob分析&#xff0…

Linux中的进程入门

冯诺依曼体系结构 操作系统(Operator System) 进程控制块&#xff08;PCB&#xff09; struct task_struct{//该进程的所有属性//该进程对应的代码和属性地址struct task_struct* next; }; struct task_struct 内核结构体——>创建内核结构体对象(task_struct&#xff09;…

【vue element-ui】表单连锁验证,el-form validate函数失效问题

实现效果:连锁表单验证,在LED版本号选择为升级版LED时候,标题名称不超过8 实现代码: <el-form:model="configuration"ref="form":rules="rule"size="small"label-width="130px"v-if="isture == 1"><…

Docker笔记-Docker Dockerfile

Docker笔记-Docker Dockerfile Dockerfile 是一个用来构建镜像的文本文件&#xff0c;文本内容包含了一条条构建镜像所需的指令和说明。 这里讲解如何运行 Dockerfile 文件来定制一个镜像。 DockerFile构建过程解析&#xff1a; 1、每条保留字指令都必须为大写字母且后面要…

基于SpringBoot的图书进销存管理系统【附源码】

基于SpringBoot的图书进销存管理系统&#xff08;源码L文说明文档&#xff09; 目录 4 系统设计 4.1 系统概述 4.2系统结构 4.3.数据库设计 4.3.1数据库实体 4.3.2数据库设计表 5系统详细实现 5.1 用户信息管理 5.2 图书类型管理 5.3 商品…

【雪球-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

JavaWeb 实验一

实验一 环境配置和Web工程的创建 目的&#xff1a; 掌握Java Web编程环境的配置创建简单的Web工程&#xff0c;并了解Web工程下各目录的作用掌握部署、运行Web工程的流程 实验过程&#xff1a; 一、完成如下要求。 安装并设置JDK 1.8、Tomcat 9.0&#xff08;tomcat和jdk版…

如何才能开发出最适合自己公司的网站?

开发最适合自己公司的网站是一个综合性的项目&#xff0c;需要从多个角度进行考虑和规划。以下是一些关键步骤和建议&#xff1a; 一、明确目标与定位 确定网站目标&#xff1a;明确网站的核心目的&#xff0c;如提升品牌知名度、展示公司产品或服务、促进销售、提供客户服务…

Zabbix_5.0 构建企业级监控告警平台----图形监控

目录 Apache监控示例&#xff08;图形监控&#xff09; 创建主机群组&#xff08;192.xx.xx.10&#xff09; 创建主机&#xff08;192.xx.xx.10&#xff09; 创建图形 查看是否添加成功 Apache监控示例&#xff08;图形监控&#xff09; 创建主机群组&#xff08;192.xx.…

数字化时代,住宅代理是怎样为企业赋能的?

在数字化时代&#xff0c;企业的发展也面临着转型&#xff0c;一方面是未知的挑战&#xff0c;一方面是不可多得的机遇。如何在全球市场中保持竞争力是企业要认真思考的问题。如果说主动寻找出路太过冒险&#xff0c;那不妨试试内省式的自我管理革新。代理服务器是一种中介服务…

LIN总线CAPL函数—— 设置与测量从节点的波特率(linSetRespBaudrate)

&#x1f345; 我是蚂蚁小兵&#xff0c;专注于车载诊断领域&#xff0c;尤其擅长于对CANoe工具的使用&#x1f345; 寻找组织 &#xff0c;答疑解惑&#xff0c;摸鱼聊天&#xff0c;博客源码&#xff0c;点击加入&#x1f449;【相亲相爱一家人】&#x1f345; 玩转CANoe&…

springsecurity+jwt实现前后端分离认证授权

文章目录 1.简介2.快速入门3.认证3.1登录校验流程3.2原理初探3.3认证详流程详解3.4 分析UsernamePasswordAuthenticationFilter 4.案例实战4.1 思路分析4.2准备工作4.3实战1.数据库校验用户2.核心代码1.创建UserDetailsService实现类2.创建UserDetails实现类3.密码加密存储模式…

基于Python的自然语言处理系列(13):TorchText + GRU + 上下文向量 + Teacher Forcing

在上一篇文章中&#xff0c;我们使用了LSTM来构建一个序列到序列模型&#xff08;seq2seq&#xff09;。虽然LSTM表现良好&#xff0c;但我们想看看能否通过使用门控循环单元&#xff08;GRU&#xff09;并改进信息压缩的方式来提升模型性能。GRU和LSTM在很多场景下表现相似&am…

Windows Server2016多用户登录破解

使用场景 很多时候&#xff0c;公司开发和测试运维会同时登录同一台windows服务器进行查询、更新、维护等操作&#xff0c;本文就来介绍一下Windows2016配置多人远程桌面登录实现&#xff0c;感兴趣的可以了解一下。 操作流程 &#xff08;1&#xff09;首先桌面需要安装远程…

etcd之etcd简介和安装(一)

1、etcd简介 1.1 etcd简介 etcd 是开源的、高可用的分布式key-value存储系统&#xff0c;可用于配置共享和服务的注册和发现&#xff0c;它专注于&#xff1a; 简单&#xff1a;定义清晰、面向用户的API&#xff08;gRPC&#xff09; 安全&#xff1a;可选的客户端TLS证书自…

uni-app功能 1. 实现点击置顶,滚动吸顶2.swiper一个轮播显示一个半内容且实现无缝滚动3.穿透修改uni-ui的样式

uni-app项目中遇到的功能 文章目录 uni-app项目中遇到的功能一、实现点击置顶&#xff0c;滚动吸顶、1.1、scroll-view设置不生效的原因和解决办法1.2 功能代码 二、swiper一个轮播显示一个半内容且实现无缝滚动三、穿透修改uni-ui的样式 一、实现点击置顶&#xff0c;滚动吸顶…

PMP--二模--解题--1-10

文章目录 4.整合管理--商业文件--商业论证&#xff08;是否值得所需投资、高管们决策的依据&#xff09;反映了&#xff1a;1、 [单选] 收到新项目的客户请求之后&#xff0c;项目经理首先应该做什么&#xff1f; 14.敏捷--角色--产品负责人PO–职责–1.创建待办列表并排序;2.确…

EmguCV学习笔记 VB.Net 12.3 OCR

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…

MATLAB给一段数据加宽频噪声的方法(随机噪声+带通滤波器)

文章目录 引言方法概述完整代码:结果分析结论参考文献引言 在信号处理领域,添加噪声是模拟实际环境中信号传输时常见的操作。宽频噪声可以用于测试系统的鲁棒性和信号处理算法的有效性。本文将介绍如何使用 M A T L A B MATLAB MATLAB给一段数据添加宽频噪声,具体方法是结合…

漏洞挖掘 | Selenium Grid 中的 SSRF

Selenium 网格框架上的基本服务器端请求伪造 最近&#xff0c;我正在阅读漏洞文章看到Peter Jaric写的一篇 Selenium Grid 文章&#xff1b;他解释了 Selenium Grid 框架上缺乏身份验证和安全措施强化的问题。 在网上进行了更多搜索&#xff0c;我发现 Selenium Grid 开箱即用…