想要理解一种语言的意思,首先要理解语言中的单词。词法分析就是将源程序拆解为一个个的单词,并确定单词的类型。
识别出单词后,将其转换成统一的机内表示(token)<种别码,属性值>。
一般的种别码的类型
单词类型 | 种别 | 种别码 |
---|---|---|
关键字 | if、else、return、continue、function | 一词一码 |
标识符 | 变量名、数组名、函数名 | 多词一码 |
常量 | 整数、浮点数、字符型 | 一型一码 |
运算符 | + 、-、*、/ | 一词一码 一型一码 |
界限符 | ;、(、)、{、} | 一词一码 |
我们可以思考一个问题,大部分的编程语言是不是基本就是这些元素来构成的?回忆一下我们熟悉的C语言、Java等等。
一个最简单的C程序的源码
int main() {
int a;
int b = 10;
a = b;
return a;
}
通过使用clang的词法分析命令
clang -E -Xclang -dump-tokens main.c
可以输出clang对此源码的词法分析结果
int 'int' [StartOfLine] Loc=<main.c:3:1>
identifier 'main' [LeadingSpace] Loc=<main.c:3:5>
l_paren '(' Loc=<main.c:3:9>
r_paren ')' Loc=<main.c:3:10>
l_brace '{' [LeadingSpace] Loc=<main.c:3:12>
int 'int' [StartOfLine] [LeadingSpace] Loc=<main.c:4:2>
identifier 'a' [LeadingSpace] Loc=<main.c:4:6>
semi ';' Loc=<main.c:4:7>
int 'int' [StartOfLine] [LeadingSpace] Loc=<main.c:5:2>
identifier 'b' [LeadingSpace] Loc=<main.c:5:6>
equal '=' [LeadingSpace] Loc=<main.c:5:8>
numeric_constant '10' [LeadingSpace] Loc=<main.c:5:10>
semi ';' Loc=<main.c:5:12>
identifier 'a' [StartOfLine] [LeadingSpace] Loc=<main.c:6:2>
equal '=' [LeadingSpace] Loc=<main.c:6:4>
identifier 'b' [LeadingSpace] Loc=<main.c:6:6>
semi ';' Loc=<main.c:6:7>
return 'return' [StartOfLine] [LeadingSpace] Loc=<main.c:7:2>
identifier 'a' [LeadingSpace] Loc=<main.c:7:9>
semi ';' Loc=<main.c:7:10>
r_brace '}' [StartOfLine] Loc=<main.c:8:1>
eof '' Loc=<main.c:8:2>
从结果可以清晰的看到,是把源程序拆成了一个个的token,并记录了其位置。