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