Top Banner
第第第 第第第第 第第第第 第第第第第 第第第第第第第第第第第第第第第第第 :, 第第第第第第第第第 第第第 第第第第第第第第第第第第第第 第第第第第 第第第第第第第第第第第第第 第第第第第 第第第第第 第第第 第第 第第 第第第 第第第
32

第二章 词法分析

Mar 15, 2016

Download

Documents

jana-bryant

记号. 词法分析器. 语法分析器. 源程序. 取下一个记号. 符号表. 第二章 词法分析. 本章内容 词法分析器:把构成源程序的字符流翻译成记号流, 还完成和用户接口的一些任务 围绕词法分析器的自动生成展开 介绍正规式、状态转换图和有限自动机概念. 本 章 要 点. 词法分析器的作用和接口,用高级语言编写词法分析器等内容,它们与词法分析器的实现有关。 掌握下面涉及的一些概念,它们之间转换的技巧、方法或算法。 非形式描述的语言  正规式 正规式  NFA 非形式描述的语言  NFA NFA  DFA DFA  最简 DFA - PowerPoint PPT Presentation
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: 第二章  词法分析

第二章 词法分析

• 本章内容– 词法分析器:把构成源程序的字符流翻译成记号流,还完成和用户接口的一些任务– 围绕词法分析器的自动生成展开– 介绍正规式、状态转换图和有限自动机概念

词法分析器 语法分析器

符号表

记号取下一个记号

源程序

Page 2: 第二章  词法分析

本 章 要 点• 词法分析器的作用和接口,用高级语言编写词法分析器等内容,它们与词法分析器的实现有关。• 掌握下面涉及的一些概念,它们之间转换的技巧、方法或算法。

– 非形式描述的语言 正规式– 正规式 NFA– 非形式描述的语言 NFA– NFA DFA– DFA 最简 DFA– 非形式描述的语言 DFA (或最简 DFA )

Page 3: 第二章  词法分析

P37 习题 2.3 ( e)叙述正规式描述的语言。(00 | 11) ( (01 | 10) (00 | 11) (01 | 10) (00 | 11) )

答案 :该正规式所描述的语言是,所有由偶数个 0 和偶数个 1 构成的串。

• 另外:和该正规式等价的正规式有 ( 00 | 11 | ( (01 | 10) (00 | 11) (01 | 10) ) ) 。

Page 4: 第二章  词法分析

P37 习题 2.4 ( g )写出语言的正规定义。 “ 由偶数个 0 和奇数个 1 构成的所有 0 和 1 的串”答案: • (偶 0 偶 1 ) even_0_even_1 (00 | 11) ( (01 | 10) (00 | 11) (01 | 10) (00 | 11) )

• (偶 0 奇 1 ) even_0_odd_1 1 even_0_even_1 | 0 (00 | 11) (01 | 10) even_0_even_1

Page 5: 第二章  词法分析

P37 习题 2.4 ( d )写出语言的正规定义。 “ 所有相邻数字都不相同的非空数字串 ” 123031357106798035790123

answer (0 | no_0 0 ) (no_0 0 ) (no_0 | ) | no_0 no_0 (1 | no_0-1 1 ) (no_0-1 1 ) (no_0-1 | ) | no_0-1

. . .no_0-8 9

将这些正规定义逆序排列就是答案

Page 6: 第二章  词法分析

P37 习题 2.4 ( d ) 写出语言的正规定义。 “ 所有相邻数字都不相同的非空数字串 ” 答案 • no_0-8 9• no_0-7 (8 | no_0-8 8 ) (no_0-8 8 ) (no_0-8 | ) | no_0-8• no_0-6 (7 | no_0-7 7 ) (no_0-7 7 ) (no_0-7 | ) | no_0-7• no_0-5 (6 | no_0-6 6 ) (no_0-6 6 ) (no_0-6 | ) | no_0-6• no_0-4 (5 | no_0-5 5 ) (no_0-5 5 ) (no_0-5 | ) | no_0-5• no_0-3 (4 | no_0-4 4 ) (no_0-4 4 ) (no_0-4 | ) | no_0-4• no_0-2 (3 | no_0-3 3 ) (no_0-3 3 ) (no_0-3 | ) | no_0-3• no_0-1 (2 | no_0-2 2 ) (no_0-2 2 ) (no_0-2 | ) | no_0-2• no_0 (1 | no_0-1 1 ) (no_0-1 1 ) (no_0-1 | ) | no_0-1• answer (0 | no_0 0 ) (no_0 0 ) (no_0 | ) | no_0

Page 7: 第二章  词法分析

P38 习题 2.13构造一个 DFA ,它接受 = {0, 1} 上 0 和 1的个数都是偶数的字符串。答案:

3

1

2

011

11

0000

开始偶 0 偶 1

奇 0 奇 1奇 0 偶 1

偶 0 奇 1

Page 8: 第二章  词法分析

P38 习题 2.14• 构造一个 DFA ,它接受 = {0, 1} 上能被 5 整除的二进制数。

0 1 2 3开始 4

101 01110001010 11100010101 11000

Page 9: 第二章  词法分析

• 构造一个 DFA ,它接受 = {0, 1} 上能被 5 整除的二进制数。

0 1 2 3开始 4

0

P38 习题 2.14

Page 10: 第二章  词法分析

• 构造一个 DFA ,它接受 = {0, 1} 上能被 5 整除的二进制数。

0 1 2 3开始 41

0

P38 习题 2.14

Page 11: 第二章  词法分析

• 构造一个 DFA ,它接受 = {0, 1} 上能被 5 整除的二进制数。

0 1 2 3开始 41

0

0

P38 习题 2.14

Page 12: 第二章  词法分析

• 构造一个 DFA ,它接受 = {0, 1} 上能被 5 整除的二进制数。

0 1 2 3开始 41

0

0

1

P38 习题 2.14

Page 13: 第二章  词法分析

• 构造一个 DFA ,它接受 = {0, 1} 上能被 5 整除的二进制数。

0 1 2 3开始 41

0

0

1

0

P38 习题 2.14

Page 14: 第二章  词法分析

• 构造一个 DFA ,它接受 = {0, 1} 上能被 5 整除的二进制数。

0 1 2 3开始 41

0

0

1

01

P38 习题 2.14

Page 15: 第二章  词法分析

• 构造一个 DFA ,它接受 = {0, 1} 上能被 5 整除的二进制数。

0 1 2 3开始 41

0

0

1

01

0

P38 习题 2.14

Page 16: 第二章  词法分析

0 1 2 3开始 41

0

0

1

01

0

1

P38 习题 2.14• 构造一个 DFA ,它接受 = {0, 1} 上能被 5 整除的二进制数。

Page 17: 第二章  词法分析

0 1 2 3开始 41

0

0

1

01

0

1 0

P38 习题 2.14• 构造一个 DFA ,它接受 = {0, 1} 上能被 5 整除的二进制数。

Page 18: 第二章  词法分析

0 1 2 3开始 41

0

0

1

01

0

1 0

1

P38 习题 2.14• 构造一个 DFA ,它接受 = {0, 1} 上能被 5 整除的二进制数。

Page 19: 第二章  词法分析

0 1 2 3开始 41

0

0

1

01

0

1 0

1

10102 = 1010

1112 = 710

P38 习题 2.14• 构造一个 DFA ,它接受 = {0, 1} 上能被 5 整除的二进制数。

Page 20: 第二章  词法分析

P37 习题 2.10 处于 /* 和 */ 之间的串构成注解,注解中间没有 */ 。画出接受这种注解的

DFA 的状态转换图。。

标记为 others 的边是指字符集中未被别的边指定的任意其它字符。

1 2 4Start

52

others

others

/ * *

*

/

Page 21: 第二章  词法分析

• 用状态转换图表示接收 (a|b)a(a|b)(a|b) 的NFA 。

210 3开始 a a a

b b

a

b

P37 习题 2.12 ( b)

Page 22: 第二章  词法分析

P37 习题 2.12 ( b)• 用状态转换图表示接收 (a|b)a(a|b)(a|b) 的

DFA 。

0 a

a

b

b

a

a

b

b

start

7

4

5

6

1

2

3

ab

ab

a

babbbabaabb

Page 23: 第二章  词法分析

化简 DFA ,简要说明执行过程:• 初始时将状态集分成两组: {0, 1, 2, 3} 和 {4, 5, 6, 7} 。• 1 .由于 move ({0, 1, 2, 3}, a) = {1, 2, 4, 6} move ({0, 1, 2, 3}, b) = {0, 3, 5, 7} move ({4, 5, 6, 7}, a) = {1, 2, 4, 6} move ({4, 5, 6, 7}, b) = {0, 3, 5, 7} 因此进一步分成 {0, 1} 、 {2, 3} 、 {4, 5} 和 {6, 7} 四组。• 2 .由于 move ({0, 1}, a) = {1, 2} move ({0, 1}, b) = {0, 3} 因此 {0, 1} 还要进一步分,其它几组也是这样。 因此最终分成了每个集合中都只有一个状态。• 3 .所以原来的 DFA 已经是最简形式了。这说明手工构造最简

DFA 是完全可能的。

P37 习题 2.12 ( b)

Page 24: 第二章  词法分析

若 L 是正规语言,证明下面 L 语言也是正规语言。 L 语言的定义是 L = {x | xR L } ( xR 表示 x 的逆)。 答案 若我们能定义出接受语言 L 的一个 NFA ,那么 L 是正规语言。因为 L 是正规语言,那么一定存在接受 L 的 DFA M ,我们就基于 M 来构造接受 L 的 NFA M ,并且我们基于 M 的状态转换图来叙述。• 1 .将状态转换图上的所有边改变方向,边上的标记不变。• 2 .将原来的开始状态改成接受状态。• 3 .增添一个状态作为开始状态,从它有转换到原来的每一个接受状态,并把原来的这些接受状态都改成普通的状态。• 所得到的新状态转换图就是 M 的状态转换图。

P37 习题 2.16

Page 25: 第二章  词法分析

下面 C 语言编译器编译下面的函数时,报告parse error before ‘else’

long gcd(p,q)long p,q;{ if (p%q == 0)

/* then part */return q 此处遗漏分号

else/* else part */return gcd(q, p%q);

}

P37 习题 2.17

Page 26: 第二章  词法分析

现在少了第一个注释的结束符号后,反而不报错了long gcd(p,q)long p,q;{ if (p%q == 0)

/* then part return q 此处遗漏分号

else/* else part */return gcd(q, p%q);

}

P37 习题 2.17

Page 27: 第二章  词法分析

答案:• 此时编译器认为• /* then part • return q• else• /* else part */• 是程序的注释,因此它不可能再发现 else 前面的语法错误。

P37 习题 2.12 ( b)

Page 28: 第二章  词法分析

分析 : 这是注释用配对括号表示时的一个问题。注释是在词法分析时忽略的,而词法分析器对程序采取非常局部的观点。当进入第一个注释后,词法分析器忽略输入符号,一直到出现注释的右括号为止,由于第一个注释缺少右括号,所以词法分析器在读到第二个注释的右括号时,才认为第一个注释处理结束。

P37 习题 2.12 ( b)

Page 29: 第二章  词法分析

将下图的 DFA极小化。

补充习题 1

a astart 0 1 2

3

a bbb

b b

4

一个 DFA 图

Page 30: 第二章  词法分析

本题要注意的是:在使用极小化算法前,一定要检查一下,看状态转换函数是否为全函数,即每个状态对每个输入符号都有转换。若不是全函数,需加入死状态,然后再用极小化算法。

补充习题 1

0 1 2

3

a

a

bb

a

b

b b

start

4 5

a

a

a, b

加入死状态后的 DFA

Page 31: 第二章  词法分析

极小化后的最简 DFA 。

补充习题 1

0 1 2bbb

b

4

aastart

最简 DFA

Page 32: 第二章  词法分析

如果不加死状态,我们来看一下极小化算法的结果。

补充习题 1

0 1

b b

aastart

a

4

一个不正确的结果显然,它和原来的 DFA 不等价。