编译原理龙书-词法分析

news2025/1/11 4:24:50

词法分析

词法分析器的作用

词法分析器的主要任务是读入源程序的输入字符,将它们组成词素,生成并输出一个词法单元序列,每个词法单元对应于一个词素

有时,词法分析器可以分成两个级联的处理阶段:

  • 扫描阶段主要负责完成一些不需要生成词法单元的简单处理,比如删除注释和将多个连续的空白字符压缩成一个字符
  • 词法分析阶段是较为复杂的部分,它将处理扫描阶段的输出并生成词法单元

词法单元,模式和词素

  • 词法单元  由一个词法单元名和一个可选的属性值组成
  • 模式 描述了一个词法单元的词素可能具有的形式
  • 词素 是源程序中的一个字符序列,他和某个词法单元的模式匹配,并被词法分析器识别为该词法单元的一个实例

 在很多程序设计语言中,下面的类别覆盖了大部分或者所有的词法单元

  • 每个关键字都有一个词法单元。一个关键字的模式就是该关键字本身
  • 表示运算符的词法单元,它可以表示单个运算符,也可以表示一类运算符
  • 一个表示所有标识符的词法单元
  • 一个或多个表示常量的词法单元,比如数字和字面值字符串
  • 每一个标点符号有一个词法单元,比如左右括号,逗号,分号

输入缓冲

缓冲区对

哨兵标记

用一个不会在正文中出现的符号作为哨兵(eof字符)放在末尾,就可以将移动指针时的是否到达缓冲区的末尾的检查和确定读入的字符是什么的检查合二为一

任何不是出现在某个缓冲区末尾的 eof 都表示到达了输入的结尾

词法单元的规约

串和语言

串 s 的长度,通常记作 |s|,是指 s 中符号出现的次数,banaba 是一个长度为6的串,长度为0的串叫做空串,用 表示

串的各部分的术语

正则表达式

正则定义

C标识符对应的语言的一个正则定义:

正则表达式的扩展

词法单元的识别

词法分析器负责消除空白符,方法是让它识别如下定义的“词法单元” ws

当我们识别到 ws 时,并不会将它返回给语法分析器,而是从这个空白之后的字符开始继续进行词法分析

状态转换图

状态转换图有一组被称为状态的节点或圆圈

状态图中的边从图的一个状态指向另一个状态,每条边的标号包含了一个或多个符号

因为最后一位字符不是标识符的一部分,我们必须将输入回退一个位置  *表示回退一位

词法分析器生成工具Lex

它支持使用正则表达式来描述各个词法单元的模式,由此给出一个词法分析器的规约。Lex 工具的输入表示方法称为 Lex 语言,而工具本身则称为 Lex 编译器,在它的核心部分,Lex 编译器将输入的模式转换成一个状态转换图,并生成相应的实现代码,并存放到文件 lex.yy.c 中

Lex 的使用

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

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

相关文章

Base64编码与打印标签(label)实例

文章目录 前言一、Base64 的简单认识二、Base64的使用场景三、 Base64的解码注意问题举个最近与后端配合的例子 四、 base64 转换为arrayBuffer,blod总结 前言 文件格式转换,在日常编程尤为常见,例如pdf文件大小的压缩存储,前端用…

Arduino驱动MMA7260三轴加速度传感器(惯性测量传感器篇)

目录 1、传感器特性 2、控制器和传感器连线图 3、驱动程序 Arduino驱动MMA7260三轴加速度传感器芯片,可以应用到摩托车和汽车放倒报警、遥控航模、游戏手柄、人形机器人跌倒检测、硬盘冲击保护、倾斜度测量等场合。 1

Java初级到中级:技术提升的策略与方法

文章目录 1 问题背景2 前言3 方法 1 问题背景 截至2023年7月,笔者已经毕业2年了,每天都在搬砖打螺丝,自我感觉需要沉淀、思考、总结一下。思考和总结一下如何从Java初级提升到Java中级,需要掌握一些什么方法论,有效地去…

使用命令行快速创建Vite项目

一、构建项目 在终端中使用如下命令行: npm create vite 二、定义项目名称 三、选择项目类型 Vanilla是我们常用的JavaScript,Vue和React是常用前端框架,可以根据自己的需要进行选择 通过上下键进行选择,按下回车进行确认 创建…

CMU15-445 format\clang-format\clang-tidy 失败

CMU15-445 format\clang-format\clang-tidy 失败 问题修改 问题 -- Setting build type to Debug as none was specified. -- Youre using Clang 14.0.0 CMake Warning at CMakeLists.txt:67 (message):BusTub/main couldnt find clang-format.CMake Warning at CMakeLists.tx…

VS2019创建GIt仓库时剔除文件或目录

假设本地有解决方案“SomeSolution” 1、首先”团队资源管理器“-“创建Git存储库”,选择“仅限本地”、“创建” VS会在解决方案目录下自动生成.gitattributes、.gitignore 2、编辑gitignore,直接拖到VS里或者用记事本打开。添加要剔除的文件或文件夹…

git --- 回滚 restore, reset, revert

git --- 回滚 restore, reset, revert git revertgit restoregit resetgit reset --softgit reset --mixedgit reset -- hard git revert git revert 是用于“反做”某一个版本,以达到撤销该版本的修改的目的也就是git revert会生成一个新的commit, 而这个commit需要…

Spring Cloud Alibaba快速整合OpenFeign

文章目录 spring cloud alibaba 整合OpenFeign整合流程1.导入依赖2. 编写调用接口2.1 service(这里写的是clients)2.2 controller 3.设置其最大链接时间3.1 配置文件3.2 client3.3 接口3.4 被访问的controller spring cloud alibaba 整合OpenFeign Fore…

C++之lseek64应用总结(二百三十六)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

基于STM32的宠物托运智能控制系统的设计(第十七届研电赛)

一、功能介绍 使用STM32作为主控设备,通过DHT11温湿度传感器、多合一空气质量检测传感器以及压力传感器对宠物的托运环境中的温湿度、二氧化碳浓度和食物与水的重量进行采集,将采集到的信息在本地LCD显示屏上显示,同时,使用4G模块…

IO模型学习

一、IO读写的基本原理 一个原则:操作系统将内存划分为两部分:一个是内核空间,一个是用户空间。在linux操作系统中,内核模块运行在内核空间,相应的进程处在内核态;用户程序运行在用户态,对应的进…

Vis.js教程(一):基础教程

1、Vis.js是什么 一个动态的、基于浏览器的可视化库。 该库的设计易于使用,能够处理大量动态数据,并能够对数据进行操作和交互。 该库由 DataSet、Timeline、Network、Graph2d 和 Graph3d 组件组成。 Vis.js官网:https://visjs.org/ github…

MS COCO数据集介绍以及pycocotools使用

MS COCO数据集介绍以及pycocotools使用 1、MS COCO数据集简介2、MS COCO数据集目录结构3、 MS COCO标注文件格式3.1 使用Python的json库查看3.2 使用官方cocoAPI查看 4、目标检测验证任务mAP 1、MS COCO数据集简介 2、MS COCO数据集目录结构 ├── coco2017: 数据集根目录├─…

Elasticsearch(Es搜索(简单使用、全文查询、复合查询)、地理位置查询、特殊查询、聚合操作、桶聚合、管道聚合)

Elasticsearch(三)——Es搜索(简单使用、全文查询、复合查询)、地理位置查询、特殊查询、聚合操作、桶聚合、管道聚合 一、Es搜索 这里的 Es 数据博主自己上网找的,为了练习 Es 搜索。 1、Elasticsearch 搜索入门 …

<十二>objectARX开发:Arx注册命令类型的含义以及颜色索引对应RGB值

1、注册命令类型 我们经常在acrxEntryPoint.cpp中看到注册命令如下: 那么各个宏定义代表什么意思呢? 主标识:(常用的) ACRX_CMD_MODAL: 在别的命令执行的时候该命令不会在其中执行。ACRX_CMD_TRANSPARENT: 命令可以再其它命令中执行,但在该标志下ads_sssetfirst()不能使…

Python实现猎人猎物优化算法(HPO)优化LightGBM回归模型(LGBMRegressor算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 猎人猎物优化搜索算法(Hunter–prey optimizer, HPO)是由Naruei& Keynia于2022年提出的一种最新的…

MySQL学习笔记13

DISTINCT数据去重: 案例:获取tb_student学生表学员年龄的分布情况。 mysql> select * from tb_student; ------------------------------------------------- | id | name | age | gender | address | --------------------------…

Go内置函数make和new的区别?

首先纠正一下make 和 new 是内置函数,不是关键字。 变量初始化,一般分为2步,变量声明变量内存分配,var 关键字就是用来声明变量的,new和make 函数主要是用来分配内存的。 var 声明值类型的变量时,系统会默…

[数据结构】栈和队列

目录 1.栈 1.1概念 1.2 栈的使用 1.3.栈的模拟实现 2.队列 2.1概念 2.2队列的使用 2.3队列的模拟实现 2.4 循环队列 2.5双端队列 1.栈 1.1概念 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一…

PPT系统化学习 - 第1天

文章目录 更改PPT主题更改最大撤回次数自动保存禁止PPT压缩图片字体嵌入PPTPPT导出为PDFPPT导出为图片PPT导出为图片型幻灯片PPT导出成视频添加参考线设置默认字体设置默认形状建立模板、保存模板、使用模板建立模板保存模板使用模板 更改PPT主题 更改PPT的主题: 夜…