1 / 32

第二章 词法分析

记号. 词法分析器. 语法分析器. 源程序. 取下一个记号. 符号表. 第二章 词法分析. 本章内容 词法分析器:把构成源程序的字符流翻译成记号流, 还完成和用户接口的一些任务 围绕词法分析器的自动生成展开 介绍正规式、状态转换图和有限自动机概念. 本 章 要 点. 词法分析器的作用和接口,用高级语言编写词法分析器等内容,它们与词法分析器的实现有关。 掌握下面涉及的一些概念,它们之间转换的技巧、方法或算法。 非形式描述的语言  正规式 正规式  NFA 非形式描述的语言  NFA NFA  DFA DFA  最简 DFA

jana-bryant
Download Presentation

第二章 词法分析

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  2. 本 章 要 点 • 词法分析器的作用和接口,用高级语言编写词法分析器等内容,它们与词法分析器的实现有关。 • 掌握下面涉及的一些概念,它们之间转换的技巧、方法或算法。 • 非形式描述的语言  正规式 • 正规式 NFA • 非形式描述的语言 NFA • NFA  DFA • DFA 最简DFA • 非形式描述的语言 DFA(或最简DFA)

  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) ) ) 。

  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

  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 将这些正规定义逆序排列就是答案

  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

  7. 1 开始 1 0 1 偶0偶1 偶0奇1 0 0 0 0 1 2 3 奇0偶1 奇0奇1 1 P38 习题2.13 • 构造一个DFA,它接受 = {0, 1}上0和1的个数都是偶数的字符串。 • 答案:

  8. 构造一个DFA,它接受 = {0, 1}上能被5整除的二进制数。 0 1 2 3 4 开始 P38 习题2.14 101 0111000 1010 111000 10101 11000

  9. 构造一个DFA,它接受 = {0, 1}上能被5整除的二进制数。 0 0 1 2 3 4 开始 P38 习题2.14

  10. 构造一个DFA,它接受 = {0, 1}上能被5整除的二进制数。 0 0 1 2 3 4 1 开始 P38 习题2.14

  11. 构造一个DFA,它接受 = {0, 1}上能被5整除的二进制数。 0 0 0 1 2 3 4 1 开始 P38 习题2.14

  12. 构造一个DFA,它接受 = {0, 1}上能被5整除的二进制数。 0 0 0 1 2 3 4 1 开始 1 P38 习题2.14

  13. 构造一个DFA,它接受 = {0, 1}上能被5整除的二进制数。 0 0 0 0 1 2 3 4 1 开始 1 P38 习题2.14

  14. 构造一个DFA,它接受 = {0, 1}上能被5整除的二进制数。 0 0 1 0 0 1 2 3 4 1 开始 1 P38 习题2.14

  15. 构造一个DFA,它接受 = {0, 1}上能被5整除的二进制数。 0 0 1 0 0 1 2 3 4 1 开始 1 0 P38 习题2.14

  16. 0 0 1 1 0 0 1 2 3 4 1 开始 1 0 P38 习题2.14 • 构造一个DFA,它接受 = {0, 1}上能被5整除的二进制数。

  17. 0 0 1 1 0 0 0 1 2 3 4 1 开始 1 0 P38 习题2.14 • 构造一个DFA,它接受 = {0, 1}上能被5整除的二进制数。

  18. 0 0 1 1 0 0 0 1 2 3 4 1 开始 1 1 0 P38 习题2.14 • 构造一个DFA,它接受 = {0, 1}上能被5整除的二进制数。

  19. 0 0 1 1 0 0 0 1 2 3 4 1 开始 1 1 0 P38 习题2.14 • 构造一个DFA,它接受 = {0, 1}上能被5整除的二进制数。 10102 = 1010 1112 = 710

  20. others * Start / / 1 2 2 4 * * 5 others P37 习题2.10 • 处于/* 和 */之间的串构成注解,注解中间没有*/。画出接受这种注解的DFA的状态转换图。。 标记为others的边是指字符集中未被别的边指定的任意其它字符。

  21. a a a 开始 a 0 1 2 3 b b b P37 习题2.12(b) • 用状态转换图表示接收(a|b)a(a|b)(a|b)的NFA。

  22. a a 2 b b a b a start a 0 7 5 4 6 1 a b b a 3 a b b b P37 习题2.12(b) • 用状态转换图表示接收(a|b)a(a|b)(a|b)的DFA。 bbabaabb

  23. P37 习题2.12(b) • 化简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是完全可能的。

  24. P37 习题2.16 • 若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的状态转换图。

  25. P37 习题2.17 下面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); }

  26. P37 习题2.17 现在少了第一个注释的结束符号后,反而不报错了 long gcd(p,q) long p,q; { if (p%q == 0) /* then part return q 此处遗漏分号 else /* else part */ return gcd(q, p%q); }

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

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

  29. start a a 0 1 2 b b b a 3 4 b b 一个DFA图 补充习题1 • 将下图的DFA极小化。

  30. start a a 0 1 2 a b b b a a 5 3 4 b a, b b 加入死状态后的DFA 补充习题1 • 本题要注意的是:在使用极小化算法前,一定要检查一下,看状态转换函数是否为全函数,即每个状态对每个输入符号都有转换。若不是全函数,需加入死状态,然后再用极小化算法。

  31. start a a 0 1 2 b b b 4 b 最简DFA 补充习题1 • 极小化后的最简DFA 。

  32. start a a 0 1 4 a b b 一个不正确的结果 补充习题1 • 如果不加死状态,我们来看一下极小化算法的结果。 显然,它和原来的DFA不等价。

More Related