词法分析

词法分析其实是编译的第一个阶段,它的主要任务就是从左到右逐个字符地对源程序进行扫描,会去产生一个一个单词序列,用于语法分析。执行词法分析的程序称为词法分析程序或者是扫描程序

词法分析工作可以是独立的遍历一遍源程序,把字符流的源程序变成单词序列,输出到一个中间文件,这个文件作为语法分析程序的输入而继续编译过程。不过更一般的情况就是将词法分析程序设计成一个子程序,每当语法分析程序需要一个单词的时候就会去调用该子程序,词法分析每次调用都会从源程序文件当中读取一些字符,直到识别出一个单词,或者就是知道下一个单词的第一个字符为止

上面的这种设计方案就是词法分析程序和语法分析程序放在同一遍里,而省掉了中间文件或存储区

这里写图片描述

当从语法分析程序接到下一个单词的请求的时候,词法分析程序就会从左到右读入源程序的字符流,以识别下一个单词。在识别出下一个单词的同时验证其词法的正确性之后,词法分析程序就会将结果以单词符号的形式发送至语法分析程序以回应其请求

如果在单词识别的过程当中发现词法错误,那么就返回出错信息

单词符号一般可分为下列5类:

  • 1、关键字(保留字),比如说Pascal语言当中的begin、end
  • 2、标识符,用来表示各种名字,比如说常量名、变量名和过程名等
  • 3、常数、各种类型的常数,比如说25、3.1415、TRUE和”ABC”等
  • 4、运算符,比如说”+”、”*”、”<=”
  • 5、界符、如逗号、分号、括号等

词法分析程序所输出的单词符号可以采用下面的二元式表示

(单词种别,单词自身的值)

这里写图片描述

词法其实也是语法的一部分,词法的描述完全可以归并到语法描述当中,单为什么还要独立出来呢?为什么要把编译过程的分析工作划分为词法分析和语法分析两个阶段?原因如下所示

  • 1、使整个编译程序的结构更加简洁、清晰和条理化。因为词法分析有的时候可能会在识别单词当中做很多曲折和费时的操作,比如说空白和注释的处理,还有就是对于FORTRAN这种受书写格式限制的语言,需要在识别单词的时候进行特殊处理,如果把这样的词法分析程序全部整合到语法分析程序当中那么就会使语法分析程序变得很复杂
  • 2、编译程序的效率会改进,大部分编译时间花费在扫描字符以把单词符号分离出来,把词法分析独立出来去采用专门的读字符和分离单词的计算可以大大的加快编译速度,以及单词的结构可用有效的方法和工具进行描述和识别,进而可建立词法分析程序的自动构造工具
  • 3、增强编译程序的可移植性。在同一个语言的不同实现当中,或多或少地会涉及与设备有关的特征,比如说采用的是ASCII还是EBCDIC字符编码,以及语言的字符集的特殊性的处理,这样分开来处理,把这些特殊处理都放在词法分析当中,这样我其他编译阶段程序的设计就不需要根据这个来,具有好的移植性

词法分析的主要功能就是从字符流的源程序当中识别单词,它要从左到右逐个字符地扫描源程序,因此它可以完成一些比如说过滤掉源程序当中的注释和空白(由空格、制表符或者是回车换行字符引起的空白),又比如说为了使编译程序能将发现的错误的信息与源程序的的出错的位置联系起来,词法分析程序就要去负责记录新读入的字符行的行号,以便行号和出错信息相关联

在支持宏处理功能的源语言当中,可以由词法分析程序完成其预处理等,其实很多的工作都是和源语言的具体要求和编译程序的整个设计是有关的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值