词法分析

在词法分析这一章主要通过学习了词法分析、正规表达式和有限自动机来了解词法分析器的构造。

词法分析器是执行词法分析的程序。将源程序输入词法分析器后,词法分析器从左至右逐个字符的对源程序进行扫描,输出相应的单词符号,把字符串形式的源程序改造成为由单词符号串组成的程序。输出的单词符号一般分为:基本字(保留字、关键字)、标识符、常数、运算符、界符。通常用二元式表示:<单词种别,单词符号的属性值(反映单词特性或特征的值)>。下图为词法分析器的结构图:

根据上图简单介绍词法分析器的工作流程。将源程序输入词法分析器之后,为方便单词识别很多情况下都会把源程序放入输入缓冲区中进行预处理。将输入串中的无用的空白、跳格(TAB)、回车、换行等编辑性字符以及注释行剔除(若空白符号为单词符号的界符,就将若干空白和并为1个),处理之后源程序变为一段确定长度的输入字符。将输入字符放入缓冲区中进行单词识别,单词识别主要有3种方法:超前搜索——在单词识别的过程中向前多读几个符号,这种方式相对准确,但是扫描指针需要多次回退;直接分析法——根据读到的第一个字符的种类转到不同的子程序处理,通过条件判断的方式提高效率;状态转换图法——使用状态转换图设计词法分析程序。状态转换图法是一种很好的方式,作为重点介绍。首先介绍状态转换图,状态转换由结点(代表状态,用圆圈表示)、箭弧及箭弧上的标记(在射出节点下可能出现的字符或字符串)三部分组成,可用于识别字符串, 有一个初态,至少要有一个终态(用双圆圈表示),需要注意当终态后有一个“*”表示在该状态下多读进一个字符,需退回。

首先了解正规式的概念,把具有相同特征的字放在一起组成一个集合叫做正规集,然后使用一种形式化的方法来表示正规集,这种表示方法就是正规式。正规式满足交换律(“或”形式的时候满足)、结合律、分配律,运算时要注意符号的优先级为:“ * ”  >  “ · ”   >  “ | ”,当且仅当两个正规式所表示的 正规集相同时,正规式等价。下面介绍有限自动机,有限自动机实际上就是状态转换图的形式化表示。有限自动机可分为确定有限自动机(DFA)和非确定有限自动机(NFA),都可用五元式(M= (S, ∑, f, s0, F))、状态转换图和状态转换矩阵表示,二者区别在于,确定有限自动机的初态唯一,映射S× ∑→S为单值函数,而非确定有限自动机的初态不唯一且为非单值映射。有限自动机的识别功能表现在对于∑*中任何字α,如果存在一条从初态结点到某个终态结点的道路,且这条路上所有的标识符连成的字(NFA忽略空字ε)等于α ,则α可被识别,所能识别的字的全体记为L(M)。由定义容易看出看出DFA为NFA的一种特例,则一定在某些条件下可将NFA确定化为DFA,这里采用子集法,即将准状态转换表中的每个状态子集视为新状态继续构造。由于正规式和有限自动机存在等价性,所以二者可以用各种替换规则进行转换。有限自动机还有一个重点就是确定有限自动机的化简,所谓化简即寻找一个状态比DFA M少的DFA M’,使得L(M’) = L(M)。转换与化简都将在下面的习题体现。

习题:

1.构造下面正规式相应的DFA

1(0|1)*101

解:

知识点:由一个正规式V,构造一个DFA M

由于正规式和有限自动机存在等价性,即任何正规式r都存在一个FA M,使得L(M) = L(r),则正规式可以转换成有限自动机,转换步骤为:(1)根据V,构造一个NFA M’,使得L(M’) = L(V)。构造一个拓广的转换图,利用替换规则将V分解,加入新的结点,直到把图转换成每条弧上标识为∑上的一个字符或ε;(2)将M’确定化,变为DFA M。用子集法找到每个输入字符x的J(可从I中的某一状态结点出发经过一条x弧而到达的状态结点的全体)和ε_CLOSURE(x)。

2.给出下面正规式的表达式

(1)以01结尾的二进制数串

(2)能被5整除的十进制数

解:(1)(0|1)*01

(2)S→BC*A|A

A=0|5

B=1|2|3|4|5|6|7|8|9

C=0|1|2|3|4|5|6|7|8|9

知识点:正规式 闭包

正规式用来表达具有相同特征的字的集合。根据题目分别找到字的相同特征,利用“或”、连接运算、闭包运算总结正规式。以第二题为例分析:5整除的十进制数分为两类,个位数和多位数,所以首先加一个或运算,多位数|个位数;个位数只能是0|5,多位数的第一位不为0,所以为1~9的自然数,中间位可以有也可以没有,所以为0~9的自然数的闭包,易得结果如上。

3.将下图分别确定化和最小化

确定化:

最小化:

知识点:有限自动机的确定化和最小化

      确定化:首先用子集法将当前图变成一张状态转换表,将每个子集看成一种新状态加入,直到不再有新状态,得到DFA M,此时DFA 中凡是含有原图终态的状态都是终态,如本题中原图终态为{0},DFA终态则为{0}和{0,1}即状态1、2。

最小化:用化简算法进行化简,把自动机的状态集分割为一些不相交的子集(一开始可分为终结状态和非终结状态),使得任何不同的两个子集状态都是可区别的,而同一个子集中的任何状态都是等价的,若将字符输入子集的结果属于终结状态的集合,则该子集不用再分,否则再分,最后从每个子集选一个代表,同时消去其他等价状态

总结:

本章学习词法分析,在有限自动机部分有很多状态转换的运算题:正规式转化成有限自动机、非确定有限自动机转化成确定有限自动机、确定有限自动机的化简,步骤看起来相似又比较多,在做的时候首先要确实弄清楚什么是确定状态自动机,什么是非确定状态自动机,了解二者区别,这样不容易混淆步骤也更容易理解。几种转化都运用了状态转换图,掌握状态转换图画法,列状态转化表的时候仔细,题目就比较好做了。本章学习之后会理解词法分析器的设计原理,另一个难点就是如何将词法分析器用代码形式表现。努力。

编译原理——第三章词法分析总结相关推荐

  1. 【笔记】编译原理——第三章 词法分析

    目录 编译过程结构框架 3.1 对于词法分析器的要求 3.1.1 词法分析器的功能和输出形式 3.1.2 词法分析器作为一个独立子程序 3.2 词法分析器的设计 3.2.1 输入.预处理 3.2.2 ...

  2. 编译原理第三章 词法分析与有穷自动机

    词法分析与有穷自动机 1.词法分析程序的功能 2.正规集.正规式.正规文法.确定的有穷自动机.不确定的有穷自动机的定义. 3.正规文法.有穷自动机.正规式三者之间的互相转换方法.不确定有穷自动机到确定 ...

  3. [编译原理]-----第三章 词法分析

    文章目录 @[toc] 1. 有穷自动机(Finite Automata) (1). FA转换图 (2). 最长子串匹配原则 2. 有穷自动机的分类 (1). 确定的有穷自动机(DFA) (2). 非 ...

  4. 文法分析——编译原理第三章、第四章

    归约与推导 归约: 将产生式右部替换为产生式的左部. 推导:将产生式左部替换为产生式的右部. 最左推导 如下: 就是把最左边的非总结符号替换成终结符号. 文法的存储结构 class LinkNode ...

  5. 编译原理第四章练习题

    目录 编译原理第四章作业 课本习题 补充习题 编译原理第四章作业 自己写的不包对,有错请指正 BY hllinyu 2023年3月31日 课本习题 编译原理 第三版 王生原- 清华大学出版社 的那本 ...

  6. 计算机组原理ppt,计算机组原理第三章.ppt

    计算机组原理第三章 计算机组成原理 毛典辉 北京工商大学计算机与信息工程学院 Email: amaode@ 进一步结论: 当最高有效位产生进位而符号位无进位时,产生上溢: 当最高有效位无进位而符号位有 ...

  7. 设某微型计算机内存ram区,微机原理第三章习题.doc

    微机原理第三章习题 第四章 指令与寻址方式习题解答 1.试分别说明下列各指令中源操作数和目的操作数使用的寻址方式: (1) AND AX,0FFH (2) AND BL,[OFFH] (3) MOV ...

  8. 微型计算机原理中jge,微机原理第三章课件.ppt

    微机原理第三章课件.ppt 3.2 8086/8088指令系统 控制转移指令特点 控制转移指令特点 控制转移指令特点 控制转移指令特点 控制转移指令特点 程序举例(1) 将20000H-20007H共 ...

  9. 编译原理第三版课后答案

    编译原理第三版课后答案: https://wenku.baidu.com/aggs/7c792566f5335a8102d22053?index=3&wkts=1669819610140

最新文章

  1. python常用字符大全_python字符串,列表,字典,集合的常用方法
  2. SpringBoot-MyBatis
  3. RabbitMQ封装实战
  4. Spring Boot 发布 jar 包转为 war 包秘籍。
  5. java openssl dgst_(7) openssl dgst(生成和验证数字签名)
  6. Linux进程通信的四种方式——共享内存、信号量、无名管道、消息队列|实验、代码、分析、总结
  7. Make.am中生成.la动态库的同时要链接.a静态库的问题
  8. 相亲中的最优停止理论-相亲中的数学
  9. Java使用融云SDK,推送聊天信息
  10. 灭世之Apache Log4j2 远程代码执行漏洞
  11. 高德离线地图vue-amap的api文档(1):创建地图,撒点等等
  12. 不小心删除JDK文件夹,无法重新安装该怎么办*
  13. 企业邮箱的优势有哪些
  14. 32位oracle10,Oracle10g32位升级到64位方法
  15. 飞思卡尔16位单片机(十五)—— 如何批量烧写芯片
  16. MySQL环境变量的配置(三)(Windows 11)
  17. Unity开发日记【第七天】——怪物的移动和动画及类的实现
  18. 精通计算机英语,学好英语有助于精通电脑
  19. 因为这份简历,我拿到了阿里的offer!
  20. Github 开源:升讯威 Winform 开源控件库( Sheng.Winform.Controls)

热门文章

  1. input获取焦点和失去焦点
  2. 计算机搜不到连接打印机主机,电脑搜索不到打印机设备?无法连接怎么办?一起看看处理方法...
  3. 5G NR PDSCH DM-RS
  4. jquery 移动端 按下和松开
  5. Python源码剖析pdf
  6. 微信小程序 - - 云开发の云函数学习笔记
  7. 2017年7月19日奥地利维也纳之旅
  8. 小型双轮差速底盘实现红外避障功能
  9. 享受高成长:国内数据中心IDC全分析(附19年机柜排名)
  10. linux系统上使用Python调用C++生成的.so动态链接库opencv