词法分析
从字符流到单词序列
一段高级语言代码,送入编译器后首先会被进行「词法分析」,将输入的程序代码(字符串)转化成与之「等价」的数据结构——单词序列
词法分析器的输入是一个「平滑的字符流」,空格 `、制表符\t和换行\n及\r` 都是字符,例如下面的就是一个字符流
语法分析器的任务是把它分解成下面的一组「单词」:#include < stdio.h > int main ( ) { int a = 10 ; printf ( " %d " ) , a ) ; return 0 ; }
容易知道,词法分析器的工作,就是先根据语言的词法规则来识别和组合单词,检查词法,将无意义的空格、换行等剔除,同时忽略注释
词法分析器输出的是与原有代码等价的序列
单词(Token)
单词是程序语言中具有独立意义的最小语法单位
分为下面的类型:
- 关键字:如
iffor等,又称为「基本字」 - 标识符:如
int a;中的a,是用来表示变量、函数等名字的单词 - 常数:以字面形式给出的量,如
123.14'z'"HIT"等 - 运算符:如算术运算符
+-/,逻辑运算符||&&^,关系运算符><=!=等 - 分界符:如行尾分号
;,分隔用逗号,和各种括号{()}等
单词的描述
在组织上,单词由「种别」和「属性值」两个部分组成
- 种别即这个单词的种类,如「关键字」「标识符」「常数」等
- 「属性值」则根据种别而有不同,如常数的属性值就是这个数本身,而运算符就没有属性值
例如,对于代码
下面是对它的单词序列的一种可能的描述: