《 编译原理 》 冶金工业出版社

41
1 编编编编编 编编编编编编编 《》 编编编编——编编编 编编编编——编编编 编3编 编编编编 编编编编编编 编编编编编编编编编 编编编编编编 一, 编编编编编编编编编编编编编编编编编编编编编编编编编编编 编编编编编 编编编编编编编一。

Upload: plato-slater

Post on 15-Mar-2016

94 views

Category:

Documents


4 download

DESCRIPTION

编译原理 —— 第三章. 第 3 章 词法分析. 编译过程的第一步是进行词法分析,该任务是由词法分析程序来完成的。 词法分析程序又称为词法分析器或扫描器,是编译程序的基本子过程之一。. 1. 《 编译原理 》 冶金工业出版社. 编译原理 —— 第三章. 本章首先讨论用手工方式设计并实现词法分析程序,主要内容有:词法分析程序的功能、正规文法及其状态图、词法分析程序的设计与实现。然后介绍词法分析程序的自动生成,其内容为:正规表达式和有穷自动机、词法分析程序的自动生成系统。. 2. 《 编译原理 》 冶金工业出版社. 编译原理 —— 第三章. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 《 编译原理 》   冶金工业出版社

1

《编译原理》 冶金工业出版社

编译原理——第三章编译原理——第三章

第 3 章 词法分析 编译过程的第一步是进行词法分析,该任务是由词法分析程序来完成的。 词法分析程序又称为词法分析器或扫描器,是编译程序的基本子过程之一。

Page 2: 《 编译原理 》   冶金工业出版社

2

《编译原理》 冶金工业出版社

编译原理——第三章编译原理——第三章

本章首先讨论用手工方式设计并实现词法分析程序,主要内容有:词法分析程序的功能、正规文法及其状态图、词法分析程序的设计与实现。然后介绍词法分析程序的自动生成,其内容为:正规表达式和有穷自动机、词法分析程序的自动生成系统。

Page 3: 《 编译原理 》   冶金工业出版社

3

《编译原理》 冶金工业出版社

编译原理——第三章编译原理——第三章

3.1 词法分析器的作用

词法分析器与语法分析器之间的交互

Page 4: 《 编译原理 》   冶金工业出版社

4

《编译原理》 冶金工业出版社

编译原理——第三章编译原理——第三章

词法分析器是编译器中读入源程序的部分,因此它还可以完成一些相关的辅助任务。一个任务是滤掉源程序中的注释、空格、制表符、换行符等;另一个任务是使编译器能将发现的错误信息与源程序的出错位置联系起来。

Page 5: 《 编译原理 》   冶金工业出版社

5

《编译原理》 冶金工业出版社

编译原理——第三章编译原理——第三章

3.1.1 词法分析中的问题 把编译过程中的分析阶段划分为词法分析和语法分析的原因如下:( 1 )简化编译器的设计可能是最重要的考虑。( 2 )提高编译器的效率。( 3 )增强编译器的可移植性。

Page 6: 《 编译原理 》   冶金工业出版社

6

《编译原理》 冶金工业出版社

编译原理——第三章编译原理——第三章

3.1.2 记号、模式、词素 记号 词素示例 模式的非形式描述

const const constif if ifrelation < , <= , = , != , > , >=

< 或 <= 或 = 或 != 或 > 或 >=

id pi , count , D2 字母开头的字母数字串num 3.1416 , 0 , 6.2E2

1任何数字常数

literal "core dumped" 在双引号“与”之间除“与”外的任何字符

Page 7: 《 编译原理 》   冶金工业出版社

7

《编译原理》 冶金工业出版社

编译原理——第三章编译原理——第三章

3.1.3 记号的属性 如果一个模式能匹配的单词符号不止一个,词法分析器必须为记号提供附加的信息。 记号影响语法分析的决策,属性影响语义分析和代码生成。

Page 8: 《 编译原理 》   冶金工业出版社

8

《编译原理》 冶金工业出版社

编译原理——第三章编译原理——第三章

3.1.4 词法错误 词法分析器可以采用下列可能的错误恢复动作:( 1 )删除一个多余的字符。( 2 )插人一个遗漏的字符。( 3 )用一个正确的符号代替一个不正确的符号。( 4 )交换两个相邻的字符。

Page 9: 《 编译原理 》   冶金工业出版社

9

《编译原理》 冶金工业出版社

编译原理——第三章编译原理——第三章

3.1.5 输入缓冲 为了节省存储空间,通常在内存中开辟一个输入缓冲区,先将源程序顺序地分批读入输入缓冲区。

Page 10: 《 编译原理 》   冶金工业出版社

10

《编译原理》 冶金工业出版社

编译原理——第三章编译原理——第三章

一个分为两半的输入缓冲器

Page 11: 《 编译原理 》   冶金工业出版社

11

《编译原理》 冶金工业出版社

编译原理——第三章编译原理——第三章

在缓冲器每半之尾都设有结尾标记

Page 12: 《 编译原理 》   冶金工业出版社

12

《编译原理》 冶金工业出版社

编译原理——第三章编译原理——第三章

3.2 记号的描述 正规表达式是表示模式的一种重要方法,每个模式匹配一个字符串集,因此正规表达式将作为字符串集的名字。

Page 13: 《 编译原理 》   冶金工业出版社

13

《编译原理》 冶金工业出版社

编译原理——第三章编译原理——第三章

3.2.1 串和语言 字母表上的字符串是该字母表中符号的有穷系列。 语言是给定字母表上的任意一个字符串的集合,这个定义是广义的,像“空集”和仅包含空符号串的集合 {} 这样的抽象语言也符合此定义。

Page 14: 《 编译原理 》   冶金工业出版社

14

《编译原理》 冶金工业出版社

编译原理——第三章编译原理——第三章

术语 定义s 的前缀 去掉串 s 尾部的 0 个或多个符号后得到的字符串。例如, ban 是 banana 的前缀s 的后缀 去掉 s 头部的 0 个或多个符号后得到的字符串。例如, nana 是 banana 的后缀s 的子字符串 去掉 s 的一个前缀和一个后缀的字符串。例如,

nan 是 banana 的一个子串。 s 的每个前缀和后缀都是 s 的一个子串,但子串并不是总是 s 的前缀或后缀。对于每个字符串 s , s 和是 s 的前缀、后缀和子串s 的真前缀(真后缀、真子串) 如果非空串 x 是串 s 的前缀(后缀、子串),而且 s≠x ,则称 x 是 s 的真前缀(后缀、子串)s 的子序列 从串 s 中删除 0 个或多个符号后得到的串(这些被删除的符号可以不相邻)。例如, baaa 是 ban

ana 的子序列

Page 15: 《 编译原理 》   冶金工业出版社

15

《编译原理》 冶金工业出版社

编译原理——第三章编译原理——第三章

3.2.2 语言上的运算 ( 1 )语言 L 和 M 的合并( union ),记作 LM∪ ,定义为:L M ∪ = {s| s in L or s in M}此集合读作“所有属于 L 或属于M 的符号串 s所组成的集合”。

Page 16: 《 编译原理 》   冶金工业出版社

16

《编译原理》 冶金工业出版社

编译原理——第三章编译原理——第三章

( 2 )语言 L 和 M 的连接( concatenation ),记作 LM ,定义为:

LM = {st| s in L and t in M}此集合读作“满足 s 属于 L 和 t 属于M 的所有符号串 st所组成的集合”。

Page 17: 《 编译原理 》   冶金工业出版社

17

《编译原理》 冶金工业出版社

编译原理——第三章编译原理——第三章

( 3 )语言 L 的 Kleene闭包,记作 L* ,定义为:L* = Li = L0+ L1+ L2+ L3+…

0i

0i

0i

Page 18: 《 编译原理 》   冶金工业出版社

18

《编译原理》 冶金工业出版社

编译原理——第三章编译原理——第三章

( 4 )语言 L 的正闭包,记作 L+,定义为:L+ = Li = L1+ L2+ L3+…

0i

0i

0i

Page 19: 《 编译原理 》   冶金工业出版社

19

《编译原理》 冶金工业出版社

编译原理——第三章编译原理——第三章

3.2.3 正规表达式 一个正规表达式是按照一组定义规则由一些较简单的正规表达式所组成的。在字母表∑上的正规表达式可用如下规则来定义,其中与每一个规则相联系的是有关正规表达式所表示的语言的详细说明。 ( 1 )和 Φ 都是∑上的正规表达式,它们所表示的语言分别是 { } (即只含空符号串的集合)和 Φ (即空集 {} )。

Page 20: 《 编译原理 》   冶金工业出版社

20

《编译原理》 冶金工业出版社

编译原理——第三章编译原理——第三章

( 2 )如果 α 是∑内的一个符号,则 α 是一个正规表达式,它表示的语言是 {α} ,即包含符号串 α的集合。( 3 )如果 r 和 s 分别是表示语言 L(r) 和 L(s)的正规表达式,那么: ① (r)|(s) 是一个表示 L(r) L(s)∪ 的正规表达式。 ② (r)(s) 是一个表示 L(r)L(s) 的正规表达式。 ③ (r)* 是一个表示 (L(r))* 的正规表达式。 ④ (r) 也是一个表示 L(r) 的正规表达式。

Page 21: 《 编译原理 》   冶金工业出版社

21

《编译原理》 冶金工业出版社

编译原理——第三章编译原理——第三章

一个由正规表达式表示的语言称为一个正规集。

Page 22: 《 编译原理 》   冶金工业出版社

22

《编译原理》 冶金工业出版社

编译原理——第三章编译原理——第三章

如果采用如下的约定,则可把正规表达式中的不必要的括号省略:( 1 )正规表达式的三个运算符中,一元运算符“ *”具有最高的优先级,并且是左结合的。( 2 )连接运算具有次优先级,是左结合的。( 3 )运算符“ |”具有最低的优先级,是左结合的。

Page 23: 《 编译原理 》   冶金工业出版社

23

《编译原理》 冶金工业出版社

编译原理——第三章编译原理——第三章

公理 描述r|s = s|r | 是可交换的r|(s|t) = (r|s)|t | 是可结合的(rs)t = r(st) 连接是可结合的r(s|t) = rs|rt(s|t)r = sr|tr

连接对 | 是可分配的r = rr = r

是连接的单元位r* = (r|)* * 和之间的关系r** = r* * 是幂等的

Page 24: 《 编译原理 》   冶金工业出版社

24

《编译原理》 冶金工业出版社

编译原理——第三章编译原理——第三章

3.2.5 缩写表示法 在正规表达式中,某些结构出现频繁,为了方便起见,可以用缩写形式表示它们。( 1 )一个或多个实例。一元后缀操作符“ +” 的意思是“一个或多个实例”。( 2 )零个或一个实例。一元后主操作符“?”的意思是“零个或一个实例”。

Page 25: 《 编译原理 》   冶金工业出版社

25

《编译原理》 冶金工业出版社

编译原理——第三章编译原理——第三章

3.2.6 非正规集

正规表达式不能用于描述均衡或嵌套结构。重复符号串不能用正规表达式表示,。正规表达式只能表示固定次数的重复或给定结构的没有指定次数的重复。

Page 26: 《 编译原理 》   冶金工业出版社

26

《编译原理》 冶金工业出版社

编译原理——第三章编译原理——第三章

3.3 单词符号的识别 ( 1 )关键字的识别。( 2 )标识符的识别。 ( 3 )常数的识别。 ( 4 )算符和分界符的识别。

Page 27: 《 编译原理 》   冶金工业出版社

27

《编译原理》 冶金工业出版社

编译原理——第三章编译原理——第三章

3.3.1 状态转换图 状态转换图描绘语法分析器为得到下一个记号而调用词法分析器时词法分析器要做的动作。

Page 28: 《 编译原理 》   冶金工业出版社

28

《编译原理》 冶金工业出版社

编译原理——第三章编译原理——第三章

状态转换图的位置用圆圈表示,叫做状态。用双圆圈表示的状态称为接受状态。状态之间用边表示,称为边。由状态 s到状态 r 的边上标记的字符表示使状态 s转换到状态 r 的输入字符。

Page 29: 《 编译原理 》   冶金工业出版社

29

《编译原理》 冶金工业出版社

编译原理——第三章编译原理——第三章

状态转换图中具有一个标记为开始的状态,这个状态称为初始状态。识别记号时,将从这个状态开始。有些状态可以具有动作,当控制流达到下一个具有动作的状态时,将执行这些动作。当进入一个状态时,需要读下一个输入字符。若存在下一个离开当前状态的边,其标记和读入字符匹配,控制就转到由这条边指向的状态,否则表示失败。

Page 30: 《 编译原理 》   冶金工业出版社

30

《编译原理》 冶金工业出版社

编译原理——第三章编译原理——第三章

3.4 有穷自动机

有穷自动机是具有离散输入与输出的系统的一种数学模型。

Page 31: 《 编译原理 》   冶金工业出版社

31

《编译原理》 冶金工业出版社

编译原理——第三章编译原理——第三章

3.4.1 确定型有穷自动机( DFA ) 一个确定的有穷自动机 M (记作 DFA M )是一个五元组:M=(∑, Q , q0 , F , σ )其中:( 1 ) Q 是一个有限状态集合。( 2 )∑是一个字母表,它的每个元素称为一个输入符号。( 3 ) q0 Q∈ , q0 为初始状态。( 4 ) F Ì Q , F 称为终结状态集合。( 5 ) σ 是一个从 Q×∑到 Q 的单值映射:σ(q , α)= q’ (q , q’ Q∈ , α ∑)∈表示当前状态为 q ,输入符号为 α时,自动机将转换到下一个状态 q’ , q’ 成为 q 的一个后继。

Page 32: 《 编译原理 》   冶金工业出版社

32

《编译原理》 冶金工业出版社

编译原理——第三章编译原理——第三章

若 Q= (q1,q2,…,qn),∑=( α1 , α2 ,…, αm ),则( σ(qi,αj))n×m )是一个 n行 m 列矩阵,它称为 DFA M 的状态转换矩阵,或称为转换表。

Page 33: 《 编译原理 》   冶金工业出版社

33

《编译原理》 冶金工业出版社

编译原理——第三章编译原理——第三章

3.4.2 不确定的有穷自动机( NFA )

-转换( -transition )是无需考虑输入串(且无需消耗任何字符)就有可能发生的转换。

Page 34: 《 编译原理 》   冶金工业出版社

34

《编译原理》 冶金工业出版社

编译原理——第三章编译原理——第三章

非确定有穷自动机 M 是一个五元组:M=(∑, Q , q0 , F , σ )其中∑, Q , q0 , F 的意义和 DFA 的定义一样,而 σ 是一个从 Q×∑到 Q 的子集的映射,即后继状态有若干个:σ(Qi,α) = {Qj1,Qj2,…,Qjn}

Page 35: 《 编译原理 》   冶金工业出版社

35

《编译原理》 冶金工业出版社

编译原理——第三章编译原理——第三章

3.4.3 从 NFA到 DFA 的变换

定理:对任何一个 NFA M ,都存在一个 DFA M ,使 L(M)= L(M) 。

Page 36: 《 编译原理 》   冶金工业出版社

36

《编译原理》 冶金工业出版社

编译原理——第三章编译原理——第三章

变换的算法:设 NFA N = (K,∑,σ,S,F) , DFA N' = (K',∑',σ',S',F') 。第一步,如果 NFA 的全部状态为 S1,S2,S3,…,SK ,则令DFA 的初始状态为:

S' = [S1,S2,S3,…,SK]其中方括号用来表示若干个状态构成的某一状态。第二步,若对某字符 α ∑∈ ,在 NFA 中有 σ(K,a) = {KJ1,KJ2,…,KJn} ,则令 σ'([Ki],a) = [KJ1,KJ2,…,KJn] ,即 [KJ1,KJ2,…,KJn] 为 DFA当前状态的一个后继状态。第三步,重复第二步,直到不出现新的状态为止。第四步,上面所得的所有状态构成 DFA 的状态集 K' 。第五步,在 DFA 的状态中,凡含有 NFA接受状态的状态构成 DFA 的接受状态集 F' 。

Page 37: 《 编译原理 》   冶金工业出版社

37

《编译原理》 冶金工业出版社

编译原理——第三章编译原理——第三章

3.5 词法分析器描述语言 Lex已经广泛地应用于各种语言的词法分析器的描述,这种工具称为 Lex 编译器,而 Le

x 编译器的输入称为 Lex 语言。

Page 38: 《 编译原理 》   冶金工业出版社

38

《编译原理》 冶金工业出版社

编译原理——第三章编译原理——第三章

小结 本章主要介绍了一个编译过程中的第一步:词法分析的一些基本概念。进行词法分析,首先要弄明白一些基本的概念,如记号、模式、词素、属性、缓冲等等。只有弄明白了这些概念,才能真正地进行词法分析。而词法分析又是为语法分析做准备的,词法分析的输出就是语法分析的输入。编译程序就是这样一环扣一环,完成整个编译的过程。

Page 39: 《 编译原理 》   冶金工业出版社

39

《编译原理》 冶金工业出版社

编译原理——第三章编译原理——第三章

词法分析涉及到语言的基本运算。一个正规表达式是按照一组定义规则由一些较简单的正规表达式所组成的。正规表达式在编译原理中的作用特别大,一定要将其概念和用法都好好掌握。

Page 40: 《 编译原理 》   冶金工业出版社

40

《编译原理》 冶金工业出版社

编译原理——第三章编译原理——第三章

可以用直观的方法画出单词符号识别的过程的状态转换图,再通过状态转换图来编写词法分析的代码。为了更好地使用状态转换图构造词法分析程序,为了词法分析程序的自动生成,而且也由于正规文法在语言理论及自动机理论中的奠基作用,编译程序提出了有穷自动机的概念。而有穷自动机又可以分为确定型有穷自动机和非确定型有穷自动机。非确定型有穷自动机可以通过一些算法转换为确定型有穷自动机。

Page 41: 《 编译原理 》   冶金工业出版社

41

《编译原理》 冶金工业出版社

编译原理——第三章编译原理——第三章

目前有很多基于正规表达式从特定表示法构建词法分析器的工具。本章挑选了其中最有名的 Lex 来进行讲解和示范使用。