词法分析

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工具基本学习相关推荐

  1. 使用Lex工具进行tiny+语言的词法分析

    词法分析程序实验报告 实验环境 架构:Intel x86_64 (虚拟机) 操作系统:Ubuntu 20.04 汇编器:gas (GNU Assembler) in AT&T mode 编译器 ...

  2. Python for虚幻引擎编辑器工具脚本学习教程

    Python for Unreal Engine Editor Tools Scripting MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz,2 Ch 语言:英语+中英 ...

  3. [译]通过使用Chrome的开发者工具来学习JavaScript

    原文:https://gist.github.com/4158604 本文作者是Peter Rybin,Chrome开发者工具团队成员. 本文中,我们将通过使用Chrome的开发者工具,来学习Java ...

  4. 工具的学习使用(二):快捷键、工具、批处理

    快捷键 Ctrl + Shift + A 核心快捷键 : 查看 Phpstorm 的 action,所谓 action 便是 Phpstorm 的一个原子操作,只要记住这些操作的关键字,进行搜索便可以 ...

  5. python 持续集成工具_持续集成工具: Jenkins学习

    持续集成工具: Jenkins学习 -- 部分内容收集自网络,如有侵权,请联系作者删除 一. 概念 在过去的开发整体流程中,是所有人写好代码之后统一进行合并(svn,git),然后进行测试,确保准发布 ...

  6. 7.4 用学习工具提高学习的效率——《逆袭大学》连载

    返回到[全文目录] 目录 7.4 用学习工具提高学习的效率 用周计划安排好你的时间 番茄钟来帮忙 用思维导图用好我们的大脑 7.4 用学习工具提高学习的效率 古语云:"工欲善其事,必先利其器 ...

  7. 元数据管理工具Atlas学习笔记之集成

    文章目录 背景 环境 Atlas安装 solr Atlas Atlas启动 启动Hadoop.ZooKeeper.HBase.Kafka.Hive和MySQL Hadoop 启动ZooKeeper 启 ...

  8. Java:计算机编程语言Java的简介、安装(编程环境/工具)、学习路线(如何学习Java以及几十项代码编程案例分析)之详细攻略

    Java:计算机编程语言Java的简介.安装(编程环境/工具).学习路线(如何学习Java以及几十项代码编程案例分析)之详细攻略 目录 Java的简介 1.Java的工作原理--基于Eclipse等编 ...

  9. locust压测工具【学习】

    locust压测工具[学习] 1.安装:pip3 install locust 检验版本:locust -V 2.使用脚本: from locust import task, HttpUser, co ...

最新文章

  1. linux运维/自动化开发__目录
  2. Flutter State 的生命周期
  3. Java RSA加密(一)--BCD输出
  4. C#之四十二 C# 读写文本文件乱码解决方案
  5. 金蝶云星空表单插件开发常用事件、方法、函数
  6. MATLAB实现离散傅里叶变换DFT
  7. 助你获取微信亿级流量的21种小程序推广攻略
  8. 纳米金13nm|金属纳米粒子/Nano gold制备方法-齐岳生物
  9. 利用php curl暴力破解urp账号密码
  10. Swift编程二十四(不透明类型)
  11. 打开计算机不显示硬盘一直在加载中,硬盘加载不出来怎么办 下面5个步骤帮你解决...
  12. 全网首发:relocation R_X86_64_PC32 against symbol can not be used when making a shared object recompile
  13. Android平台简介
  14. 静电场电位与电场强度matlab,基于MATLAB的静电场模拟
  15. Hadoop精华问答 | 基于Hadoop的数据中心有什么好处?
  16. runtime-compiler和runtime-only的区别
  17. Python实现GIF动图以及视频卡通化,两脚踢碎次元壁 | 机器学习
  18. linux卸载socat,linux rinetd、socat端口转发部署
  19. JAVA 进制转换工具类 10进制转16进制 10进制转2进制 16进制转2进制 16进制10进制 2进制转10进制 2进制转16进制
  20. Python系列14-外星人入侵项目

热门文章

  1. undefined reference to `_imp___Py_NoneStruct'
  2. 在方法的形参位置使用@Qualifier注解||@Autowired 与@Resource的区别
  3. Windows 技术篇-是否允许程序连接网络误操作解除方法,如何解除阻止程序连接网络,程序连接网络设置方法
  4. CTFshow php特性 web94
  5. win10系统下“从开始屏幕取消固定”无反应解决方法
  6. 第三周实践项目8 以第一个元素为分界线,将所有小于它的元素移到该元素的前面,将所有大于它的元素移到该元素的后面。
  7. cdf2rdf--复对角矩阵转化为实对角矩阵
  8. 【笔记】大数定理证明
  9. Python包、模块、类以及遇到的问题
  10. 1.2.1 Logistic回归和梯度下降简介