编译原理实验1扫描器的设计与实现

上传人:lisu****2020 文档编号:100167205 上传时间:2022-06-02 格式:DOC 页数:26 大小:168.92KB
收藏 版权申诉 举报 下载
编译原理实验1扫描器的设计与实现_第1页
第1页 / 共26页
编译原理实验1扫描器的设计与实现_第2页
第2页 / 共26页
编译原理实验1扫描器的设计与实现_第3页
第3页 / 共26页
资源描述:

《编译原理实验1扫描器的设计与实现》由会员分享,可在线阅读,更多相关《编译原理实验1扫描器的设计与实现(26页珍藏版)》请在装配图网上搜索。

1、实验1: 扫描器的设计与实现1.1. 目的和要求1 加深对词法分析理论的理解,培养动手实践的能力。2 学会从以字符串表示的源程序中识别出具有独立意义的基本语法单位,同时指出它们的属性的方法和技术。1.2. 实验环境Windows XP + WinTC1911.3. 实验准备1、先将课本3.5节词法分析程序的生成认真的学习一遍,理解词法分析程序的构成过程。2、写出C语言测试程序,分析可能得到的结果。测试程序:#define pi 3.14void main() double r = 2.5; double s = 0.0; s = pi*r*r; printf(%f,s);预测结果:(513,#

2、)(14,define)(100,pi)(200,3)(514,.)(200,14)(1,void)(2,main)(502,()(503,)(506,)(15,double)(100,r)(402,=)(200,2)(514,.)(200,5)(501,;)(15,double)(100,s)(402,=)(200,0)(514,.)(200,0)(501,;)(100,s)(402,=)(100,pi)(416,*)(100,r)(416,*)(100,r)(501,;)(12,printf)(502,()(509,)(511,%)(100,f)(509,)(512,)(100,s)(50

3、3,)(501,;)(507,)1.4. 实验内容及步骤1、输入已给的文本格式的扫描程序Lexical.c文件,然后编译运行,检查修改错误。2、编译成功后,提示输入C语言测试程序,用回车键查看输出的单词流,即单词符号及其属性。3、比较自己分析的结果和屏幕上的输出结果。1.5. 实验小结1、得到的经验。通过本次实验,我了解了如何设计、编制并调试词法分析程序,加深了对词法分析原理的理解。同时,在编制和调试程序时要全面考虑,避免漏掉或者错误定义定界符等,造成不必要的错误。2、遇到的主要问题。忘记对空格、回车符等定界符进行设置等。3、改进方案。(1)char *keywords15 = void,ma

4、in,if,then,break,int,char,float,include,for,while,printf,scanf,define,double;(2)case 13:flag = 14;status = 1;break;case 14:flag = 15;status = 1;break;(3)case.:wordsj = ch;wordsj+1 = 0;flag = 514;break;case :wordsj = ;flag = 250;break;casen:flag = 251;break;(4)else if(flag = 250|flag = 251)修改前源代码:#in

5、cludestdio.h#includestdlib.h#includestring.hint i,j,k,flag,number,status;/*status which is use to judge the string is keywords or not!*/char ch;char words10 = ;char program500;int Scan(char program)char *keywords13 = void,main,if,then,break,int,char,float,include,for,while,printf,scanf;number = 0;st

6、atus = 0;j = 0;ch = programi+; /* To handle the lettle space ands tab*/*handle letters*/if (ch = a) & (ch = a) & (ch = z )wordsj+=ch;ch=programi+;i-;wordsj+ = 0;for (k = 0; k = 0) & (ch = 0 ) & (ch :if (ch = )wordsj+ = ch;wordsj = 0;ch= programi+;if (ch = =)wordsj+ = ch;wordsj = 0;flag = 403;elsei-;

7、flag = 404;break;case:if (ch = = a) & (ch = a) & (ch = z )wordsj+=ch;ch=programi+;i-;wordsj+ = 0;for (k = 0; k = 0) & (ch = 0 ) & (ch :if (ch = )wordsj+ = ch;wordsj = 0;ch= programi+;if (ch = =)wordsj+ = ch;wordsj = 0;flag = 403;elsei-;flag = 404;break;case:if (ch = )wordsj+ = ch;wordsj = 0;ch= prog

8、rami+;if (ch = =)wordsj+ = ch;wordsj= 0;flag = 405;elsei-;flag = 406;break;case!:if (ch = !)wordsj+ = ch;wordsj= 0;ch = programi+;if (ch = =)wordsj+ = ch;wordsj= 0;flag= 407;elsei-;flag = 408;break;case+:if (ch = +)wordsj+ = ch;wordsj = 0;ch= programi+;if (ch = =)wordsj+ = ch;wordsj = 0;flag= 409;el

9、se if (ch = +)wordsj+ = ch;wordsj = 0;flag= 410;elsei-;flag= 411;break;case-:if (ch = -)wordsj+ = ch;wordsj = 0;ch= programi+;if (ch = =)wordsj+ = ch;wordsj = 0;flag = 412;else if( ch = -)wordsj+ = ch;wordsj = 0;flag = 413;elsei-;flag = 414;break;case*:if (ch = *)wordsj+ = ch;wordsj = 0;ch= programi

10、+;if (ch = =)wordsj+ = ch;wordsj = 0;flag = 415;elsei-;flag = 416;break;case/:if (ch = /)wordsj+ = ch;wordsj = 0;ch= programi+;if (ch = =)wordsj+ = ch;wordsj = 0;flag= 417;elsei-;flag = 418;break;case;:wordsj = ch;wordsj+1 = 0;flag = 501;break;case(:wordsj = ch;wordsj+1 = 0;flag = 502;break;case):wo

11、rdsj = ch;wordsj+1 = 0;flag = 503;break;case:wordsj = ch;wordsj+1 = 0;flag = 504;break;case:wordsj = ch;wordsj+1 = 0;flag = 505;break;case:wordsj = ch;wordsj+1 = 0;flag= 506;break;case:wordsj = ch;wordsj+1 = 0;flag = 507;break;case:wordsj = ch;wordsj+1 = 0;flag = 508;break;case:wordsj = ch;wordsj+1

12、= 0;flag = 509;break;case%:if (ch = %)wordsj+ = ch;wordsj = 0;ch = programi+;if (ch = =)wordsj+ = ch;wordsj = 0;flag= 510;elsei-;flag = 511;break;case,:wordsj = ch;wordsj+1 = 0;flag = 512;break;case#:wordsj = ch;wordsj+1 = 0;flag = 513;break;case:wordsj = #;flag = 0;break;case.:wordsj = ch;wordsj+1

13、= 0;flag = 514;break;case :wordsj = ;flag = 250;break;casen:flag = 251;break;default:flag = -1;break;return flag;main()i=0;printf(please input a program end with );doch = getchar();programi+ = ch;while(ch != );i = 0;doflag = Scan(program);if (flag = 200)printf(%2d,%4d),flag,number);else if (flag = -1)printf(%d,error),flag);else if(flag = 250|flag = 251)elseprintf(%2d,%4s),flag,words);while (flag != 0);system(pause);

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!