- 1、本文档共18页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
编译原理三级项目 ——PL/0编译程序的研究与改进 PL/0的简介 PL/0语言是Pascal语言的一个子集,这里分析的PL/0的编译程序包括了对PL/0语言源程序进行分析处理、编译生成类PCODE代码,并在虚拟机上解释运行生成的类PCODE代码的功能。 PL/0语言编译程序采用以语法分析为核心、一遍扫描的编译方法。词法分析和代码生成作为独立的子程序供语法分析程序调用。语法分析的同时,提供了出错报告和出错恢复的功能。在源程序没有错误编译通过的情况下,调用类PCODE解释程序解释执行生成的类PCODE代码。 1 我们组的改进 (1)添加了C++风格的注释/*.......*/; (2)定义!=为不等号; (3)改进了error的报错; (4)添加了计时的时钟; (5)增加条件语句的ELSE子句 2 (1)添加了C++风格的注释/*.......*/; 思路:在词法分析功能函数getsym()中添加识别/的while语句,内层嵌套识别*,如果getch()连续两个获取的符号符合要求,每次用getch()读取字符后就用getchdo对其进行忽略处理,直至有连续两个获取的符号分别为*,/跳出对注释内字符串的忽略。 3 程序源码 L1:while(ch== ||ch==10||ch==9) {getchdo;} while(ch==/) {getchdo; if(ch==*) {L2:do } } {getchdo;getch();}while(ch==*); getchdo; getch(); if(ch==/) {getchdo;goto L1;} else goto L2; 4 测试结果 未修改的PL/0 结果: 加入注释后报错 修改后的PL/0 插入注释:/*sakkdkasdahdashdadhashdsajdhsaj*/ 5 (2)定义!=为不等号 添加的代码 else if { if(ch==!) {getchdo; if(ch===) {sym=neq;getch();} } 分析:类似于添加注释,先识别!,=,全部识别后,将当前符号变为neq(即不等号#),在语句处理函数statement()里可指导程序按neq状态处理 6 结果演示 7 (3)改进了error的报错 void error(int n) { char space[81]; memset(space,32,81); space[cc-1]=0; switch(n) {case 1:printf(常数说明中的\=\写成\:=\\n);fprintf(fa1,常数说明中的\=\写成\:=\\n);break; case 2:printf(常数说明中的\=\后应是数字\n);fprintf(fa1,常数说明中的\=\后应是数字\n);break; ....... default:printf(未知错误\n);fprintf(fa1,未知错误\n);break; }error++; } 用switch语句详细的反馈错误原因 8 建立一个错误的PL/0程序 error.txt const a=10; var B,c; procedure p; begin c:=b+a end; begin read(b); while b#0 do begin call p write(2*c); read(b); end end 大家看看这个程序有什么语法错误? 9 报错演示 10 (4)添加了计时的时钟 添加代码: #includetime.h time_t rawtimenow,rawtimeStart,rawtimeEnd; struct tm * timenow; struct tm * timestart; struct tm * timeend; 。。。。。。 time ( rawtimeStart ); timestart = localtime( rawtimeStart ); printf ( Start time: %s, asctime (timestart) ); 。。。。。。 time ( rawtimeEnd ); timeend = localtime ( rawtimeEnd ); printf ( End time: %s, asctime (timeend) ); 11 效果演示 12 (5)增加条件语句的ELSE子句 流程 If语
您可能关注的文档
最近下载
- 项目管理知识体系指南.pptx VIP
- 2025年春季学期开学思政第一课:以科技创新铸就民族复兴之魂7篇.pdf
- 青海电网新型储能电站调度运行管理办法-10.10.docx VIP
- (部编版一年级语文下册生字练字帖).pdf
- 计算机控制系统课后习题答案1.pdf VIP
- GB_T 31497-2024 信息技术 安全技术 信息安全管理 监视、测量、分析和评价.pdf
- 《企业现金流量管理国内外文献综述》4000字.docx
- 《公共管理》教学大纲(本科).pdf VIP
- GB55015-2021 建筑节能与可再生能源利用通用规范.docx
- 《电机学》(华中科技大学)中国大学MOOC(慕课)章节测验试题(答案).pdf
文档评论(0)