- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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
您可能关注的文档
最近下载
- 2023年保险中介从业人员资格考试模拟题与答案217.pdf VIP
- 《2019版预防和治疗压力性损伤快速参考指南》简要分享.ppt VIP
- (2025秋新版)人教版二年级数学上册全册教案.doc
- 河北省2012装饰装修定额说明及计算规则(含定额总说明.doc VIP
- 新沪教牛津版九年级上册英语全册教案.pdf VIP
- 阀门井阀门更换施工方案.docx
- 2025年度酒店预订服务合作协议.docx VIP
- GB/T 4214.17-2024家用和类似用途电器噪声测试方法 干式清洁机器人的特殊要求.pdf
- 国防幼儿园主题课件.pptx
- 2025上海韩天衡美术馆招聘1人笔试模拟试题及答案解析.docx VIP
文档评论(0)