跳转至

词法分析

从字符流到单词序列

一段高级语言代码,送入编译器后首先会被进行「词法分析」,将输入的程序代码(字符串)转化成与之「等价」的数据结构——单词序列

词法分析器的输入是一个「平滑的字符流」,空格 `、制表符\t和换行\n\r` 都是字符,例如下面的就是一个字符流

#include <stdio.h>
int main() {
  int a = 10;
  printf("%d\n", a);
  return 0;
}

语法分析器的任务是把它分解成下面的一组「单词」:#include < stdio.h > int main ( ) { int a = 10 ; printf ( " %d " ) , a ) ; return 0 ; }

容易知道,词法分析器的工作,就是先根据语言的词法规则来识别和组合单词,检查词法,将无意义的空格、换行等剔除,同时忽略注释

词法分析器输出的是与原有代码等价的序列

单词(Token)

单词是程序语言中具有独立意义的最小语法单位

分为下面的类型:

  • 关键字:如 if for 等,又称为「基本字」
  • 标识符:如 int a; 中的 a,是用来表示变量、函数等名字的单词
  • 常数:以字面形式给出的量,如 12 3.14 'z' "HIT"
  • 运算符:如算术运算符 + - /,逻辑运算符 || && ^,关系运算符 > <= !=
  • 分界符:如行尾分号 ;,分隔用逗号 , 和各种括号 {()}

单词的描述

在组织上,单词由「种别」和「属性值」两个部分组成

  • 种别即这个单词的种类,如「关键字」「标识符」「常数」等
  • 「属性值」则根据种别而有不同,如常数的属性值就是这个数本身,而运算符就没有属性值

例如,对于代码

if (cnt > 7) result = 3.14;

下面是对它的单词序列的一种可能的描述:

(if, 0)
(left_parenthesis, 0)
(id, -> cnt)
(greater_than, 0)
(const, 7)
(id, -> result)
(assign, 0)
(const, 3.14)
(semicolon, 0)