编译原理--编译过程中的词法分析--简述

在预编译之后 生成的纯粹源代码文件 从左向右读取源程序的每一个字符 形成一个字符流 作为编译阶段的输入文件

编译阶段: 词法分析:–>从输入流中识别各个单词 、确定单词类型、将识别出的单词类型转换为统一的机内表示 这个表示被称为词法单元(token)

词法单元token是一个 二元组: token<种别码,属性值>
在机器编译的过程中 有一张表 记录了 字符组成的种种可能 为了便于理解 下文 称之为种别码表

种别码表中有 五种"规则"
关键字 、标识符、常量、运算符、界限符

从字符流中读取每个 “单词” (至于这些单词如何识别 个人认为可能与空格有关) 将读取的这个单词 与种别码表进行对比 将其转换成一个机内表示的token
比如 int var = 10; 将其认为一小段字符流
识别出 第一个单词 int 那么这个int 是关键字 所以将int 转换成token<int,–>
识别 第二个单词 var 这很显然是一个标识符 所以将其转换为 token<IND,var> (IDN 是标识符的种别码,var是其字面值 用于识别)
识别出 第三个单词 = 这是一个运算符 将其装换成token<NE,–>
识别出 第四个单词 10 这是一个常量 。。。。。。。

言而总之 种别码表其中对应了字符流中的种种可能
其中
关键字是编程语言定义好的 所以每一个关键字都对应着一个种别码,而其属性值为 – 表示空 所谓一词一码
关键之: if else then begin

标识符 由于编译前无法枚举出所有的字符组成可能 所以所有的标识符都是一个种别码 为了区分不同的标识符 采用第二个属性值用来区分属性值用于保存当前单词字面上的值 所谓 多词一码
标识符 数组名 函数名 过程名

常量 是同一类型的不同常量 所谓一型一码 同样为了区分 属性值保存的是其当前的字面值
常量 整型 浮点型

运算符 逻辑运算符 或则算数运算符 都要算进去 一词一码 或者一型一码
运算符 ±*。。。 > < = ~ !..

界限符: { } ()【】 之类的

这些token能唯一标记一个字符或者单词 从而可以被计算机编译器识别

总之 这些种别码的存在就是为了进行词法分析将源代码程序转换成一个token的序列作为下一个阶段的输入

(注意:我这里的阶段指的是编译过程中某个阶段 比如下一个阶段语法分析 但是我上一篇说的阶段指的是整个从源代码到目标代码的流程阶段 不要搞混淆了)

猜你喜欢

转载自blog.csdn.net/qq_41325777/article/details/86408610