编译原理ch2-5e.ppt

  1. 1、本文档共23页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
编译原理ch2-5e

编译原理习题课 中国海洋大学计算机系 葛 琳 green.lyn@ 第二章习题重点: 掌握下面一些转换的技巧、方法或算法 非形式描述的语言 ? 正规式(正规定义) 正规式 ? NFA(DFA、最简DFA) NFA ? DFA DFA ? 最简DFA 非形式描述的语言 ? NFA (DFA、最简DFA) 第二章习题 例一:叙述下面正规式描述的语言,并画出接受该语言的最简DFA的状态转换图 (1|01)* 0* 思路:从(1|01)* 可以看出,任何1的前面不可能有多于一个0,即不可能出现001这种状况,但是最后一个1后面可以有任意多个0。 描述的语言是,所有不含子串001的0和1的串(包括空串) 第二章习题 例一:叙述下面正规式描述的语言,并画出接受该语言的最简DFA的状态转换图 (1|01)* 0* 状态转换图: 3 start 0 0 1 . 1 0 1 2 刚读过的不是0 连续读过一个0 连续读过不少于两个0 第二章习题 例二:用状态转换图表示接受(a|b)?a(a|b)(a|b)的DFA 思路:考虑当前串的最末三位的状态 第二章习题 (a|b)?a(a|b)(a|b) bbb a a b a a b b start abb aaa aab aba bba baa bab a b b a b a b a b 末三位的 8个状态 第二章习题 例二的练习: 画出接受正规式(a | b)*aa的DFA a no a aa start a b a b a b ab ba bb aa start b a a a a b b b 化简 第二章习题 例三:写出语言“所有相邻数字都不相同的非空数字串”的正规定义 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 将这些正规定义逆序排列就是答案 第二章习题 例四:用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); } 第二章习题 例四:现在少了第一个注释的结束符号后,反而不报错了,请从词法分析角度分析为何此时不报错。 long gcd(p,q) long p,q; { if (p%q == 0) /* then part return q 此处遗漏分号 else /* else part */ return gcd(q, p%q); } 第二章习题 例五:为正规式(a|b)*a(a|b)(a|b)构造NFA。 思路:寻求简单手工构造。可以先对正规式进行分割 0 a b start 1 a 2 a b 3 a b 第二章习题 例六:若L是正规语言,证明下面L’也是正规语言。L’定义为: L’={x | xR?? L},其中xR表示x的逆。 思路:如果能构造出接受语言L’的NFA,就可以证明L’是正规语言。(因为NFA接受的是正规集) 第二章习题 例六(续): 因为L是正规语言,因此必有一接受L的DFA M,可以基于M构造L’的NFA。 关键字:“反向”。 将M的所有边反向,M的开始状态变M’的接受状态,并新增一M’开始状态,令其有指向所有原M的接受状态的?转换。 这样构造的M’就是接受L’的NFA 第二章习题 作业1(P36/2.3(a)):叙述 0(0|1)*0 的描述语言 答案:0开始,0结尾的0、1串,串长大于等于2。 第二章习题 作业2(P36/2.3(b)):叙述((?|0)1*)*的描述语言 思路: (?|0)1*描述的语言为集合 {?,1,11,111,…,0,01,011,0111,…} 其中含有0,1两个串。因此,(0|1)*描述的语言是((?|0)1*)*描述语言的子集。 (0|1)*描述所有的0,1串

文档评论(0)

dajuhyy + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档