编译原理-词法分析入门

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • http://www.starming.com/index.php?v=index&view=107 http:/...
    111浪子111阅读 3,185评论 0 11
  • 链接地址:https://www.tutorialspoint.com/compiler_design/compi...
    dannyvi阅读 4,801评论 1 12
  • 引言 维基百科:编译语言(英语:Compiled language)是一种以编译器来实现的编程语言。它不像解释型语...
    Flame_Dream阅读 8,608评论 5 52
  • 编译器做些什么? 本文主要探讨一下编译器主要做些什么,以及如何有效的利用编译器。 简单的说,编译器有两个职责:把 ...
    评评分分阅读 1,166评论 1 5
  • TITLE: 编程语言乱炖 码农最大的烦恼——编程语言太多。不是我不学习,这世界变化快! 有时候还是蛮怀念十几、二...
    码园老农阅读 5,374评论 2 35