当前位置:
文档之家› 编译原理实用教程 第3章 词法分析
编译原理实用教程 第3章 词法分析
源程序
词法分析程序
图3-1词法分析单独作为一遍
单词序列
取符号
源程序
词法分析程序
送符号
语法分析程序
图3-2词法分析作为语法分析子程序
3.1.2单词符号
单词符号是程序设计语言的基本语法单位和最小语义单位。单词符号一 般分为五类。
(1)关键字(又称保留字或基本字)如if,then ,else,while,do, begin和end。 (2)标识符,用于表示变量名、过程名等。 (3)常数,如123,实数型45.67等。 (4)运算符,如+,-,*,/,<,=等。 (5)界限符,如逗号、分号和括号等。 程序设计语言中的关键字、运算符和界限符的数量都是确定的。而常数 和标识符的数量是不确定的。
3.1.1
词法分析
词法分析是编译过程的第一个阶段。这个阶段的任 务是从左到右一个字符一个字符地读入源程序,对 构成源程序的字符流进行扫描和分解,从而识别出 一个一个的单词。编译程序中完成词法分析任务的 程序段,称为词法分析程序。词法分析程序对源程 序进行扫描,从中识别出一个个的单词符号,因此, 词法分析程序又称为词法分析器,又称扫描器。
′0′‥′9′: begin
while digit do begin concat;getch; end; retract; return(2,dtb); end;
′+′: return(31, ); ′-′: return (32, ) ′ *′: return (33, ); ′/′: return (34, ); ′=′: return (37, ); ′:= ′: return (51, ); ′; ′: return (54, ); ′(′: return (52, ); ′) ′: return (53, ) ; end of case error;
例3.2 有状态转换图3-4所示,其中,0结点用‘S’标记,表 示初态结点;2结点用‘E’标记,表示终态结点。从初态结 点出发到某一终态结点所经过的路径,称为能为该状态转换 图所接受的符号串。
字母或数字 S 0 字母 其它字符
1
2
E
图3-4扫描缓冲区
字母或数字
S
—
0
字母
数字
非字母、数字1ຫໍສະໝຸດ 2+3.1.3 一个简单的词法分析程序的设计
1.预处理 词法分析器在识别单词符号之前,需要对输入区的源程序进行预处理。 预处理包括删除无用的空格、跳格、回车和换行等编辑性字符以及注释 部分。每一次对一串定长的输入字符进行预处理,并装进一个指定的缓 冲区。 2.状态转换图
利用状态转换图可以设计词法分析器。状态转换图是一个有向图,仅包 含有限个结点,每个结点表示一个状态,其中有一个初始结点,至少有 一个终态结点,结点间弧的标记是输入字符或字符类。
1.单词类别的表示
单词类别表示单词的种类,它是语法分析所需要的信息。一个语言的单 词符号如何划分种类、分为几种,如何编码都属于技术性的问题,主要 取决于处理上的方便。单词符号有5个类别:关键字、标识符、常数、 运算符和界限符,可以用1、2、3、4、5来表示。也可以用一字符一类 别码的编码形式,如保留字可以采用一字一类别。分界符也可以采用一 字一类别。对于一字一类别的单词,单词的类型就是单词的自身值,词 法分析程序就不必输出其值了。常数的自身值是其自身的二进制。
词法分析器作为编译程序的一部分,它与语法分析程序之间 接口方式有两种。一种方式是词法分析程序独立工作,把字 符流的源程序变为单词序列,输出在一个中间文件上,这个 文件称为语法分析程序的输入而继续编译,如图3-1所示就 是将词法分析单独作为一遍的接口方式。源程序词法分析程 序单词序列图3-1词法分析单独作为一遍 取符号源程序词法分析程序语法分析程序图3-2词法分析作 为语法分析子程序送符号 另一种方法,也是常用的一种方法就是把词法分析程序设计 成一个子程序,每当语法分析程序需要一个单词时,就调用 该程序。词法分析程序每得到一次调用,就从源程序文件中 读入一个字符,直到识别出一个单词为止。这种方法省去了 中间文件。
第三章 词法分析
本章学习目标
词法分析程序的主要任务是对源程序进行扫描,从 中识别出单词。它是编译程序的第一步,也是编译 过程中不可缺少的部分。本章的主要内容是: 正则表达式和有限自动机 文法、正规表达式、正规集及自动机的相互转换 词法分析器的C语言实现 词法分析器的自动生成
3.1词法分析器与单词符号
数字
非数字
3
4
+
E E
+
5
E + E+ E+ E+
+ E
—
— * — = — (
) ;
6 7
8
9
10
11
E+
= — 非=
+
126 136
E
+ E
/ 其他
146 17 E
*
156
非*
E+ EE +
166
图3-6识别各类单词符号的状态集合
词法分析程序的构造如下: 初始化:arr:=′′;getch;getnbc; case ch of ′a′‥′z′: begin while letter or digit do begin concat; getch end; retract; c:=reserve; if c=0 then return (1,arr) ; else return(c, ); end;
2.单词的自身值
单词自身的值是编译程序中其他阶段所需要的信息。对于单 词符号来说,如果一个种别只含有一个单词符号,那么这个 单词符号,其种别就安全地代表了它的自身值。如果一个种 别含有多个单词符号,那么对于它的每个单词符号,除了给 出种别编码之外,还应该给出单词符号自身的值,以便把同 一种单词区别开来。注意,标识符自身的值就是标识符自身 的字符串。而常数自身的值是常数本身的二进制数值。