A2013-9-CH03--词法分析-1

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第3章 词法分析
基础知识:PASCAL、C语言、正规表达式 正规文法、有限自动机
知识点:词法分析器的作用、地位 记号、模式 词法分析器的状态转换图
词法分析
简介
3.1 词法分析程序与语法分析程序的关系
3.2 词法分析程序的输入与输出 3.3 记号的描述和识别 3.4 词法分析程序的设计与实现 小结
正规表达式
↓ 正规文法
↓ 状态图(识别单词)
↓ 识别过程的实现算法
↓ 程序实现和测试
2
简介
词法分析任务由词法分析程序完成 本章内容安排
讨论用手工方式设计并实现词法分析程序的方法和步骤 –词法分析程序的作用 –词法分析程序的地位 –源程序的输入与词法分析程序的输出 –单词符号的描述及识别 –词法分析程序的设计与实现
表示标识符集合的正规定义式:
letter A|B|…|Z|a|b|…|z digit 0|1|…|9
id letter(letter|digit)*
引入名字id表示标识符,引入名字letter和digit分 别表示字母和数字的正规表达式。
对正规式命名,并用 这些名字来引用相应 的正规式,以求得表 示上的简洁。这些名 字也可以像符号一样 出现在正规式中。
–二者具有同等表达能力 –正规表达式(正规式):清晰、简洁 –正规文法:便于识别
开始使用正规表达式描述单词符号的结构,然后根 据需要将其转换为等价的正规文法。正规定义式为 这种转换提供了条件。
26
3.3 记号的描述和识别
一、词法与正规文法 二、记号的文法 三、状态转换图与记号的识别
27
一、词法与正规文法
16
测试指针的过程(1)
… … i f x = y t h e n j : = j + 2 ; eof …
IF (向前指针在左半区的终点) { 读入字符串,填充右半区; 向前指针前移一个位置; }
ELSE IF (向前指针在右半区的终点) { 读入字符串,填充左半区; 向前指针移到缓冲区的开始位置;
–标识符:单词在符号表中入口的指针 –常数:它所表示的值 –关键字:(一符一种、或一类一种) –运算符:(一符一种、或一类一种) –分界符:(一符一种、或一类一种)
22
赋值语句 P:=I+R*60 的词法分析结果
<id,指向标识符P在符号表中入口的指针> <assign_op,- > <id,指向标识符I在符号表中入口的指针> <plus_op,- > <id,指向标识符R在符号表中入口的指针> <mul_op,- > <num,整数值60>
6
2、词法分析程序作为语法分析程序的子程序
字符串 字符
词法
取下一记号
语法
源程序
分析程序 记号 分析程序
符号表
安排在同一遍中
避免了中间文件 有利于提高编译程序的效率
7
3、词法分析程序与语法分析程序作为协同程序
词法分析程序与语法分析程序在同一遍中,以生产者 和消费者的关系同步运行。
协同程序:
–需要直接管理源程序字符流的读入
加快词法分析的速度是编译程序设计的一个重要问题!
12
二、输入缓冲区
词法分析程序工作的第一步是输入源程序 文本。 输入串一般放在ห้องสมุดไป่ตู้个缓冲区中,这个缓冲 区称输入缓冲区。 词法分析程序的工作可以直接在这个缓冲 区中进行。
13
为了得到某一个单词符号的确切性质,需要超前扫 描若干个字符。
把源语言的文法G分解为若干子文法: G0、 G1、G2、…、Gn
文法?
语法
词法
词法:描述语言的标识符、常数、运算符和标点符
号等记号的文法
—— 正规文法
语法:借助于记号来描述语言的结构的文法
—— 上下文无关文法
28
例1:文法G1(A): A c|Ab G1(A)的语言? L(G1)={c,cb,cbb,} 以c开头,后继若干个b
38
将正规定义式转换为相应的正规文法
( letter | digit )* = | ( letter | digit )+
} ELSE 向前指针前移一个位置;
17
每半区带有结束标记的缓冲器
… i f x = y t h eof e n j : = j + 2 ; eof eof
开始指针 向前指针
18
测试指针的过程(2)
… i f x = y t h eof e n j : = j + 2 ; eof eof
向前指针前移一个位置; IF (向前指针指向 eof ) {
注意:如果+,- 和or都可归入plus_op ,则plus_op在此需要第二元。
24
词法分析的关键之一是如何识别单词的 问题,其中最重要的是标识符的识别。
25
识别单词是按照记号的模式进行的,一种记号的模 式匹配一类单词的集合。
–为设计词法分析程序,对模式要给出规范、系统的描述。
正规表达式和正规文法是描述模式的重要工具。
P (full); 从缓冲区中取出产品; V (empty) Until false;
Empty:表示可以使用的空缓冲区的数目;初值为1,可以向缓冲 区内放入一件产品。
Full:表示能否取产品;初值为0,表示缓冲区内没有产品,不能 取!
10
3.2 词法分析程序的输入与输出
一、词法分析程序的实现方法 实现方法不同,源程序的输入方法也不同
15
配对缓冲区
把一个缓冲器分为相同的两半,每半各含N个字符, 一般N=1KB或4KB。
… … i f x = y t h e n j : = j + 2 ; eof …
开始指针 向前指针
如果向前指针从单词起点出发,搜索到半区的边缘但尚未达到 单词的终点,就调用系统的读入命令或预处理子程序,令其把 后续的N个字符装入另半区。我们认定在另半区一定可以达到 单词的终点。这意味着标识符和常数的长度实际上必须加以限 制,否则缓冲区再大也无济于事。
注意:有些二元组没有属性值,它的一个成分足以辨别词法单元。
23
赋值语句 P:=I+R*60 的词法分析结果
<id,指向标识符P在符号表中入口的指针> <assign_op, > <id,指向标识符I在符号表中入口的指针> <plus_op,+ > <id,指向标识符R在符号表中入口的指针> <mul_op,*> <num,整数值60>
33
正规文法、正规集与正规式三个概念间关系
–一个正规语言可以用正规文法定义,也可 以用正规式定义,对任意一个正规文法,存 在一个定义同一个语言的正规式;同样,对 每个正规式,存在一个生成同一语言的正规 文法;有些正规语言很容易用文法定义,有 些则用正规式定义更容易;两者之间是可以 转换的,结构上具有等价性。
3
词法分析程序的作用
扫描源程序字符流 按照源语言的词法规则识别出各类单词符号 产生用于语法分析的记号序列 词法检查 创建符号表 把识别出来的标识符插入符号表中 与用户接口的一些任务:
–跳过源程序中的注释和空白 –把错误信息和源程序联系起来(如,行号)
4
3.1 词法分析程序与语法分析程序的关系
(h)正规式:(ab)*abb 正规集:任何以abb结尾的a,b符号串。
36
二、记号的文法
标识符 常数
–整数 –无符号数
运算符 分界符 关键字
37
标识符
标识符定义为“由字母打头的、由字母或数字组成 的符号串”
正规表达式?
描述标识符集合的正规表达式:
letter(letter|digit)*
如果两个或两个以上的程序,它们之间交叉地 执行,这些程序称为协同程序。
8
进程同步举例:
缓冲区初始状态为空, 生产者先生产产品,消费者再取产品
生产者
消费者
9
生产者进程: Repeat
P (empty); 生产一个产品; 送产品到缓冲区; V (full) Until false;
消费者进程: Repeat
模式:是指某一类单词符号的构词规则,如标识符 的模式是“由字母开头的字母数字串”。
单词:是指某一类单词符号的一个特例,如 position是标识符。
21
记号的属性
词法分析程序在识别出一个记号后,需要给记号以 属性,用来记住记号的附加信息,以便需要时使用。
记号影响语法分析的决策,属性影响记号的翻译。 在词法分析阶段,对记号只能确定一种属性
29
例2:文法G2(S): S AB A aA|a B bB|b G2(S)的语言? L(G2)={ambn|m,n>0}
30
例3:给出产生语言为{anbn|n1}的文法。 G3(S): S aSb S ab
31
例4:给出产生语言为 {ambn|1nm2n}的文法。 G4(S): S aSb | aaSb S ab | aab
例如,以下合法的FORTRAN语句(没有保留字,关 键字不保留):
DO 99 K = 1,10 和 DO 99 K = 1.10
为了区别这两个语句,必须超前扫描到等号后的 第一个分界符处。(是逗号?还是句点?只有看 到逗号才能确定DO是关键字)
例如,
DO 99 K = 1 , 10
Pascal语言该中语句:有7:个=记号:关键字、标号、标识符、算符、常数1和常数10
C语言中:==、/*、//、--、++、for_loop
14
分析程序对输入缓冲区进行扫描时,一般使 用两个指针(指示器),一个指向当前正在 识别单词的开始位置(开始指针,指向新单 词的首字符),另一个用于向前搜索以寻找 单词的终点(向前指针或搜索指针)。
不论缓冲区设得多大,都不能保证单词符 号不会被缓冲区的边界所打断。因此,缓冲 区最好使用一分为二的区域,即,配对缓冲 区。
正规集:{ ,a,b,aa,ab,ba,bb,aaa,... a和b构成的所有串的集合,包括空串。
35
(e)正规式:aab* 正规集:a后跟随大于等于0个b的所有符号串。
(f)正规式:(ab)*(aabb)(ab)* 正规集: 所有含有两个相继a或b的符号串。
(g)正规式:(aabaabbb)* 正规集: 空串和任何长度为偶数的a,b符号串。
二、输入缓冲区 三、词法分析程序的输出
11
一、词法分析程序的实现方法
利用词法分析程序自动生成器
–从基于正规表达式的规范说明自动生成词法分析程序。 –生成器提供用于源程序字符流读入和缓冲的若干子程序
利用传统的系统程序设计语言来编写
–利用该语言提供的输入/输出能力来处理读入操作
利用汇编语言来编写
32
2型(上下文无关文法,非确定下推自动机): 产生式形如: A 其中:A VN; (VT VN)*。
3型(正规文法,有限自动机): 产生式形如: A B 或 A 右线性文法 其中: VT*;A,BVN 产生式形如: A B 或 A 左线性文法 其中: VT*;A,BVN
CLASS VAL
TOKEN:
其中,CLASS表示种类部分,VAL是值部分 (种别码,属性值)(类别、内部码值)(种别,自身的值)
20
记号、模式和单词 表3-1
记号:是指某一类单词符号的类别编码(种别编码), 如标识符的记号为id,数的记号为num等。 关键字/基本字、标识符、常数、运算符、分界符等
IF (向前指针在左半区的终点) { 读入字符串,填充右半区; 向前指针前移一个位置;
}; ELSE IF (向前指针在右半区的终点) {
读入字符串,填充左半区; 向前指针指向缓冲区的开始位置; }; ELSE 终止词法分析; }
19
三、词法分析程序的输出——记号
确切地说,是一个二元组序列 <记号,属性> 其他教材: TOKEN的结构通常是一个二元组:
–由正规文法或正规式定义的正规语言的集 合构成正规集。
34
正规式与正规集举例
例:令 字母表=a,b (a)正规式 ab
正规集: a,b (b)正规式 (ab )(ab )
正规集: aa,ab,ba,bb (c)正规式 a*
正规集: ,a,aa,aaa,aaaa,… (d)正规式:(ab)*
词法分析程序与语法分析程序之间的三种关系
–词法分析程序作为独立的一遍 –词法分析程序作为语法分析程序的子程序 –词法分析程序与语法分析程序作为协同程序
5
1、词法分析程序作为独立的一遍
字符串源程序 字符 词法分析程序 记号 记号流表示的源程序 输出放入一个中间文件
磁盘文件 内存文件(提高存取效率)
相关文档
最新文档