词法分析器和lex工具基本学习
词法分析
lexical analysis,是计算机科学中将字符序列转换为单词(Token)序列的过程。
进行词法分析的程序或者函数叫作词法分析器(Lexical analyzer,简称Lexer),也叫扫描器(Scanner)。
词法分析器供语法分析器调用。
词法分析阶段是编译过程的第一个阶段,是编译的基础。
这个阶段的任务是从左到右一个字符一个字符地读入源程序,即对构成源程序的字符流进行扫描然后根据构词规则识别单词(也称单词符号或符号)。
词法分析程序可以使用Lex等工具自动生成。
编译程序把一个源程序翻译成目标程序的工作过程分为五个阶段:词法分析;语法分析;语义检查和中间代码生成;代码优化;目标代码生成。
从输入字符流中生成单词的过程叫作单词化(Tokenization),在这个过程中,词法分析器还会对单词进行分类。
词法分析器通常不会关心单词之间的关系(属于语法分析的范畴),例如,词法分析器能够将括号识别为单词,但并不保证括号是否匹配。
单词经常使用正则表达式进行定义,像lex一类的词法分析器生成器就支持使用正则表达式。
词法分析的第一阶段即扫描器,通常基于有限状态自动机。
开发一个词法分析器是在词法定义的基础上的,词法定义需要使用正则表达式
正则表达式可以转换为NFA(Non-determinate finite automata 不确定的有穷自动机)
NFA可以转换为DFA(determinate finite automata确定的有穷自动机)
DFA可以极小化,进而使用为开发词法分析器的工具
DFA的正式定义
一个DFA定义了一个字符串集合
每个字符串是一个字符的序列,字符属于∑
起始状态给出生成字符串的起始点
终端状态给出了终点
转换函数制定了生成字符串的规则
Lex 基本
Lex编译器将输入的模式转换成一个状态转换图,并生成相应的实现代码,并存放到文件lex.yy.c中。
Lex 的常规表达式
常规表达式是一种使用元语言的模式描述。表达式由符号组成。符号一般是字符和数字,但是 Lex 中还有一些具有特殊含义的其他标记。 下面两个表格定义了 Lex 中使用的一些标记并给出了几个典型的例子。
用 Lex 定义常规表达式
字符 含义
A-Z, 0-9, a-z 构成了部分模式的字符和数字。
. 匹配任意字符,除了 \n。
- 用来指定范围。例如:A-Z 指从 A 到 Z 之间的所有字符。
[ ] 一个字符集合。匹配括号内的 任意 字符。如果第一个字符是 ^ 那么它表示否定模式。例如: [abC] 匹配 a, b, 和 C中的任何一个。
* 匹配 0个或者多个上述的模式。
+ 匹配 1个或者多个上述模式。
? 匹配 0个或1个上述模式。
$ 作为模式的最后一个字符匹配一行的结尾。
{ } 指出一个模式可能出现的次数。 例如: A{1,3} 表示 A 可能出现1次或3次。
\ 用来转义元字符。同样用来覆盖字符在此表中定义的特殊意义,只取字符的本意。
^ 否定。
| 表达式间的逻辑或。
"<一些符号>" 字符的字面含义。元字符具有。
/ 向前匹配。如果在匹配的模版中的“/”后跟有后续表达式,只匹配模版中“/”前 面的部分。如:如果输入 A01,那么在模版 A0/1 中的 A0 是匹配的。
( ) 将一系列常规表达式分组。
常规表达式举例
常规表达式 含义
joke[rs] 匹配 jokes 或 joker。
A{1,2}shis+ 匹配 AAshis, Ashis, AAshi, Ashi。
(A[b-e])+ 匹配在 A 出现位置后跟随的从 b 到 e 的所有字符中的 0 个或 1个。
词法分析器和lex工具基本学习相关推荐
- 使用Lex工具进行tiny+语言的词法分析
词法分析程序实验报告 实验环境 架构:Intel x86_64 (虚拟机) 操作系统:Ubuntu 20.04 汇编器:gas (GNU Assembler) in AT&T mode 编译器 ...
- Python for虚幻引擎编辑器工具脚本学习教程
Python for Unreal Engine Editor Tools Scripting MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz,2 Ch 语言:英语+中英 ...
- [译]通过使用Chrome的开发者工具来学习JavaScript
原文:https://gist.github.com/4158604 本文作者是Peter Rybin,Chrome开发者工具团队成员. 本文中,我们将通过使用Chrome的开发者工具,来学习Java ...
- 工具的学习使用(二):快捷键、工具、批处理
快捷键 Ctrl + Shift + A 核心快捷键 : 查看 Phpstorm 的 action,所谓 action 便是 Phpstorm 的一个原子操作,只要记住这些操作的关键字,进行搜索便可以 ...
- python 持续集成工具_持续集成工具: Jenkins学习
持续集成工具: Jenkins学习 -- 部分内容收集自网络,如有侵权,请联系作者删除 一. 概念 在过去的开发整体流程中,是所有人写好代码之后统一进行合并(svn,git),然后进行测试,确保准发布 ...
- 7.4 用学习工具提高学习的效率——《逆袭大学》连载
返回到[全文目录] 目录 7.4 用学习工具提高学习的效率 用周计划安排好你的时间 番茄钟来帮忙 用思维导图用好我们的大脑 7.4 用学习工具提高学习的效率 古语云:"工欲善其事,必先利其器 ...
- 元数据管理工具Atlas学习笔记之集成
文章目录 背景 环境 Atlas安装 solr Atlas Atlas启动 启动Hadoop.ZooKeeper.HBase.Kafka.Hive和MySQL Hadoop 启动ZooKeeper 启 ...
- Java:计算机编程语言Java的简介、安装(编程环境/工具)、学习路线(如何学习Java以及几十项代码编程案例分析)之详细攻略
Java:计算机编程语言Java的简介.安装(编程环境/工具).学习路线(如何学习Java以及几十项代码编程案例分析)之详细攻略 目录 Java的简介 1.Java的工作原理--基于Eclipse等编 ...
- locust压测工具【学习】
locust压测工具[学习] 1.安装:pip3 install locust 检验版本:locust -V 2.使用脚本: from locust import task, HttpUser, co ...
最新文章
- linux运维/自动化开发__目录
- Flutter State 的生命周期
- Java RSA加密(一)--BCD输出
- C#之四十二 C# 读写文本文件乱码解决方案
- 金蝶云星空表单插件开发常用事件、方法、函数
- MATLAB实现离散傅里叶变换DFT
- 助你获取微信亿级流量的21种小程序推广攻略
- 纳米金13nm|金属纳米粒子/Nano gold制备方法-齐岳生物
- 利用php curl暴力破解urp账号密码
- Swift编程二十四(不透明类型)
- 打开计算机不显示硬盘一直在加载中,硬盘加载不出来怎么办 下面5个步骤帮你解决...
- 全网首发:relocation R_X86_64_PC32 against symbol can not be used when making a shared object recompile
- Android平台简介
- 静电场电位与电场强度matlab,基于MATLAB的静电场模拟
- Hadoop精华问答 | 基于Hadoop的数据中心有什么好处?
- runtime-compiler和runtime-only的区别
- Python实现GIF动图以及视频卡通化,两脚踢碎次元壁 | 机器学习
- linux卸载socat,linux rinetd、socat端口转发部署
- JAVA 进制转换工具类 10进制转16进制 10进制转2进制 16进制转2进制 16进制10进制 2进制转10进制 2进制转16进制
- Python系列14-外星人入侵项目
热门文章
- undefined reference to `_imp___Py_NoneStruct'
- 在方法的形参位置使用@Qualifier注解||@Autowired 与@Resource的区别
- Windows 技术篇-是否允许程序连接网络误操作解除方法,如何解除阻止程序连接网络,程序连接网络设置方法
- CTFshow php特性 web94
- win10系统下“从开始屏幕取消固定”无反应解决方法
- 第三周实践项目8 以第一个元素为分界线,将所有小于它的元素移到该元素的前面,将所有大于它的元素移到该元素的后面。
- cdf2rdf--复对角矩阵转化为实对角矩阵
- 【笔记】大数定理证明
- Python包、模块、类以及遇到的问题
- 1.2.1 Logistic回归和梯度下降简介