手工编写词法分析器指导书.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
编译原理 湖南科技学院 计算机与通信工程系 吕兰兰 讲师 zsu-ll@163.com Tel:189-7462-2835 《编译原理》课程实验安排 实验一 熟悉BNF定义 实验二 手工编写词法分析器 实验三 自动生成词法分析器 实验四 编写递归分析程序 实验五 编写预测分析程序 实验六 自动生成语法分析器 词法分析器的构造步骤 (0)用自然语言描述词法规则 (1)用正规式描述词法规则 (2)用NFA描述词法规则 (3)用DFA描述词法规则 (4)用最少状态DFA描述词法规则 (5)用C/C++/Java程序描述词法规则 词法分析器的构造步骤 (0)用自然语言描述词法规则 (1)写出正规式 (2)正规式到NFA的转换 (3)NFA到DFA的转换 (4)对DFA进行化简 (5)根据DFA写出程序 DFA到词法分析程序 DFA的3种实现方式 1、简单方法 2、直接转向法 3、表格驱动法 1、使用简单方法为DFA编写程序 正规式letter ( letter | digit )* 先对DFA进行扩展 1、简单方法:识别一个标识符DFA_PL0_ID_Simple_v1.1.cpp //starting in state 0 if ((a=ch ch=z) || (A=ch ch=Z)) { //now in state 1 ch=strInput[idx++];//取下一个字符 while ((a=ch ch=z) || (A=ch ch=Z) || (0=ch ch=9)) { //stay in state 1 ch=strInput[idx++];//取下一个字符 } //go to state 2 without advancing the input coutaccept endl; } 1、简单方法(续):DFA_PL0_ID_Simple_v1.1.cpp else { //error or other cases coutreject endl; } 测试: 1、输入abc,输出? 2、输入123,输出? 3、输入abc+123,输出? 小结: 1、简单方法使用代码中的位置来隐含状态,正如注释所指出的那样。 2、使用简单方法为DFA编写程序的有哪些具体原则? 练习1:简单方法识别一个整数 正规式 digit·digit* 练习1:简单方法识别一个整数(续) 正规式 digit·digit* 练习2:简单方法识别一个标识符或整数 作业1:简单方法识别一个标识符、整数、运算符、分界符或关键字 DFA的状态转换图:教材P35的图3-3 PL/0词法规则的状态转换图。 教材:《编译原理》 王生原、董渊、杨萍、张素琴 清华大学出版社,2010.08出版 练习3:为下图中的DFA编写程序 正规式(a|b)*(aa|bb) (a|b)* 练习3:为下图中的DFA编写程序(续) 正规式(a|b)*(aa|bb) (a|b)* 你遇到了什么问题? 简单方法的缺点 如果DFA没有太多的状态(要求有许多嵌套层),并且DFA中的循环较少,那么使用简单方法为DFA编写程序就很合适。 但这个方法有个缺点: 当状态增多时,或循环较多,或相异的状态与任意路径增多时,代码会变得非常复杂。 DFA到词法分析程序 DFA的3种实现方式 1、简单方法 2、直接转向法 3、表格驱动法 2、使用直接转向法为DFA编写程序 正规式(a|b)*(aa|bb) (a|b)* 2、直接转向法: DFA_aa_bb_Direct.cpp while (state is not Accept){ switch(state) { /*根据当前状态进行转换*/ case 0: /*状态0的分支转向程序*/ case 1: /*状态1的分支转向程序*/ case 2: /*状态2的分支转向程序*/ case 3: /*状态3的分支转向程序*/ } ch=strInput[idx++]; } 2、直接转向法(续):DFA_aa_bb_Direct.cpp case 0: /*状态0的分支转向程序*/ switch(ch) { case a:state=1; break; case b:state=2; break; default:state=-1; }break; 2、直接转向法(续2):DFA_aa_bb_Direct.cpp case 1: /*状态1的分支转向程序*/ switch(ch) { case a:state=3

文档评论(0)

wxc6688 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档