编译原理-词法分析入门

2019-05-10  本文已影响0人  平凡码农

想要理解一种语言的意思,首先要理解语言中的单词。词法分析就是将源程序拆解为一个个的单词,并确定单词的类型。

识别出单词后,将其转换成统一的机内表示(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,并记录了其位置。

上一篇 下一篇

猜你喜欢

热点阅读