自己动手构造编译系统:编译、汇编与链接2.1.1 词法分析
2.1.1 词法分析
编译器工作之前,需要将用高级语言书写的源程序作为输入。为了便于理解,我们使用C语言的一个子集定义高级语言,本书后续章节的例子都会使用C语言的一些基本语法作为示例。现在假定我们拥有一段使用C语言书写的源程序,词法分析器通过对源文件的扫描获得高级语言定义的词法记号。所谓词法记号(也称为终结符),反映在高级语言语法中就是对应的标识符、关键字、常量,以及运算符、逗号、分号等界符。见图2-2。
例如语句:
var2=var1+100;
该语句包含了6个词法记号,它们分别是:“var2”“=”“var1”“+”“100”和分号。
对词法分析器的要求是能正常识别出这些不同形式的词法记号。词法分析器的输入是源代码文本文件内一长串的文本内容,那么如何从文本串中分析出每个词法记号呢?为了解决这个问题,需要引入有限自动机的概念。
有限自动机能解析并识别词法记号,比如识别标识符的有限自动机、识别常量的有限自动机等。有限自动机从开始状态启动,读入一个字符作为输入,并根据该字符选择进入下一个状态。继续读入新的字符,直到遇到结束状态为止,读入的所有字符序列便是有限自动机识别的词法记号。
图2-3描述了识别标识符的有限自动机。C语言标识符的定义是:一个不以数字开始的由下划线、数字、字母组成的非空字符串。图中的自动机从0号状态开始,读入一个下划线或者字母进入状态1,状态1可以接受任意数量的下划线、字母和数字,同时状态1也是结束状态,一旦它读入了其他异常字符便停止自动机的识别,这样就可以识别任意一个合法的标识符。如果在非结束状态读入了异常的字符,意味着发生了词法错误,自动机停止(当然,上述标识符的有限自动机不会出现错误的情况)。
图2-3 标识符有限自动机
我们以赋值语句“var2=var1+100;” 中的变量var2为例来说明有限自动机识别词法记号的工作过程。
识别var2的自动机状态序列和读入字符的对应关系如表2-1所示,结束状态之前识别的字符序列即为合法的标识符。
使用有限自动机,可以识别出自定义语言包含的所有词法记号。把这些词法记号记录下来,作为下一步语法分析的输入。如果使用一遍编译方式,就不用记录这些词法记号,而是直接将识别的词法记号送入语法分析器进行处理。
相关文章
- SHELL基础工具
- 零代码实现一对一表关系和无限主子表级联保存
- 香港服务器打开速度慢的几种解决方法
- ECS使用心得
- ECS体验日记
- 阿里云服务器使用有感
- ASM 磁盘头信息备份
- 使用WordPress搭建一个专属自己的博客
- 基于ECS和NAS搭建个人网盘
- 排查指南 | 两个案例学会从埋点排查 iOS 离线包
- 论网站打开速度对SEO优化排名的影响
- 重磅下载 | 如何构建Flutter企业级应用开发?闲鱼实战技术分享
- API 的一码多端方案 —— Uni API
- 阿里云ECS初体验
- 基于ECS搭建云上博客
- Midway 一体化研发 2.0 – 更快、更具生产力
- 基于ECS搭建GitLab服务
- 渲染性能优化的全局视角,教你做的比别人好
- 特别好用的国产接口调试工具apipost
- UNDO段头块格式深度解析