1、本章 主要 讨论词法分析程序的任务、设计原则,单词的描述技术、识别机制及词法分析程序的自动构造原理。1 词法分析程序的任务2 词法分析程序的设计3 正规式与 有穷自动机4 词法分析程序的自动生成第三章 词法分析本章重点 词法分析器的功能和接口 单词的描述工具是正规文法和正规式 单词的识别机制是有穷状态自动机 设计和实现词法分析程序词法分析程序所处的位置:语法分析器词法分析器 符号表编译程序的后续部分token取下一个单词语法树词法分析程序 功能: 逐个读入源程序字符并按照构词规则切分成一系列单词 主要任务: 读入源程序,输出单词符号 其他任务: 滤掉空格,跳过注释、换行符 追踪换行标志,指出源
2、程序出错的行列位置 宏展开, 关键: 找出单词的分隔符源程序 词法分析程序 Token串 语法分析程序 单词 : 是语言中具有独立意义的最小单位, 常用单词分类 : 保留字: 具有固定意义的标识符 运算符 界符 标识符: 表示各种名字 常数 对于一个程序设计语言,保留字、运算符和界符都是确定的,可以给以固定的编号 (种别码 )。 标识符是根据构词规则定义的,常数是符合定义的各种类型的常数 种别码:是对能识别的单词的分类编码有多种编码方式: 标识符一般统一为一种:一个编号 常数按类型分别编码:整数、实数、布尔、字符 关键字一般一字一种 运算符一般一符一种 界符一般一符一种某语言单词的种别码定义举
3、例单词 种别码 单词 种别码 单词 种别码and 1 procedure 21 * 41array 2 program 22 */ 42begin 3 read 23 + 43bool 4 real 24 , 44call 5 repeat 25 45case 6 set 26 、 46char 7 then 27 47constant 8 to 28 / 48do 9 true 29 /* 49else 10 until 30 : 50end 11 var 31 := 51false 12 while 32 ; 52for 13 write 33 55integer 16 实常数 36 =
4、56not 17 字符常数 37 57of 18 38 = 58or 19 ( 39 59output 20 ) 40 60词法分析器的输出 1. Token串 : 输出源文件中各个 有用 的单词格式: (单词的种别码,单词符号的属性值 )单词种别 : 是对能识别的单词的分类编码 (P42)单词符号的属性值 : 单词的某种特性或特征常数的值,标识符的名字等保留字、运算符、分界符的属性值可以省略 文件存放最好有格式,如每个单词占一行方便 “语法分析 ”程序调用P38 例this is a sample program writing in simple languageprogram examp
5、le1;used for illustrating compiling processvara,b,c:integer;x:char;beginif (a+c*3 b) and (b3) then c:=3;end.program example1 ; var a , b , c : integer ; x : char ; begin if (a +c * 3 b ) and ( b 3 ) then c := 3 ; end.源程序 token文件注意 token文件的格式 2. 符号表各种常数和标识符一般放在符号表中,在输出的token文件中的单词属性值则存放单词在符号表中的指针符号表的
6、格式:字符串 if (ab2) test:=3;格式 1: (数组 )入口 单词 名及 长 度 类 型 种属 值 内存地址1 a 1 整 简单变 量 未知 未知2 b2 2 整 简单变 量 未知 未知3 test 4 实 简单变 量 未知 未知 格式 2: (用指针 )this is a sample program writing in simple languageprogram example1;used for illustrating compiling processvara,b,c:integer;x:char;beginif (a+c*3 b) and (b3) then c:
7、=3;End.源程序 符号表 3. 其它输出: 错误信息和源程序清单错误信息应该详细,准确,指出出错的具体行、列位置,发生了哪类错误等,方便用户修改错误处理 应尽可能发现更多的错误 处理方式每个程序段单独处理错误统一处理错误(商用软件系统) 记录式的文件 数据库 统计表明,现代软件系统中, 75%的程序代码都是用于处理错误与错误信息 商业系统中错误处理的特点是:统一错误编号,编制文档指出错误信息的含义、应对措施、解决方案词法错误类型 非法字符 单词拼写错误 难以发现下面的错误fi (a = x ) 在实数是 a.b格式下,可以发现下面的错误123. 词法分析是编译过程中的一个阶段,在语法分析前
8、进行。可以作为一个独立的子程序,独立出来的原因:简化设计改进编译效率增加编译系统的可移植性 可以和语法分析结合在一起作为一遍,由语法分析程序调用词法分析程序来获得当前单词供语法分析使用。3.2 词法分析程序的设计扫描器的任务4 组织源程序的输入;4 按规则拼单词,并转换成二元式形式;4 删除注解行、空格及无用符号;4 行计数、列计数;4 列表打印源程序;4 发现并定位 词法错误 ;4 如需要,还要建立关键字表、符号表、常数表等表格。3.2 词法分析程序的设计词法分析器的接口图 识别单词前作如下假定:关键字就是保留字单词中间不能有分界符 (如空格、空白、界符和算符等 )单词中间不能有注释单词必须
9、在一行内写完,换行后认为是另一个单词一个单词不能超过规定长度识别单词 主要包括如下几种单词的识别:标识符的识别: 字母 +(字母 /数字 )关键字的识别:与标识符相同,最后查表常数的识别界符和算符的识别超前搜索技术:如在读取 /* */时,当读到 /时,如何判别是注释还是除法运算?识别单词:掌握 单词的构成规则 很重要单词的构成规则用 状态转换图 表示状态转换图 是一张有限方向图。有限个状态,用结点表示状态,其中 有一个初态 (初态用箭头指出 ), 至少有一个终态 (终态用双圈表示 )。状态之间用带箭头的弧线连结,弧线上标记的字符表示在射出状态下可能出现的输入字符或字符类。识别标识符的转换图0
10、 1 2字母字母或数字其它*一个状态图可用于识别一定的字符串,大多数程序设计语言的单词符号都可以用转换图来识别。识别过程是 :从初始状态 0开始,若读入一个字母,转入 1状态,若再读入字母或数字,仍处于 1状态,否则转向 2状态,结束一个标识符的识别过程。状态上的 *表示多读入一个符号。0 1 2字母字母或数字其它*写成 C语言的函数形式:recog_id() char state = 0;ch = getch();do switch(state)Case 0: if ch 是字母 state = 1; ch = getch();break;Case 1: if ch 是字母或数字 state = 1; ch = getch(); else state = 2; break; while (state != 2); 回退一个符号。0 1 2字母字母或数字其它*0 1 2数字数字其它识别整数的转换图*练 习 1 画出 Pascal中无符号实数的状态转换图 (不带正负号,可表示整数、可表示小数,可带指数部分 ) 如:下面几个数应该是符合规则的数:3, 3.51, 34E3,34.5E2,34.5E+2,34.5E-2练 习 2 画出识别标识符和整常数 (可带正负号 )的状态转换图 练 习 3 以下状态转换图接受的字符集合是什么?X Y001