词法分析程序构造原理与实现技术实验报告文档_第1页
词法分析程序构造原理与实现技术实验报告文档_第2页
词法分析程序构造原理与实现技术实验报告文档_第3页
词法分析程序构造原理与实现技术实验报告文档_第4页
词法分析程序构造原理与实现技术实验报告文档_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、词法分析程序构造原理与实现技术实验报告变更说明日期版本变更位置变更说明作者2014/4/91.0初稿生成房皓2014/4/91.0完善截稿房皓一、 实验目的:本实验的目的在于在教师的引导下以问题回朔与思维启发的方式,使学生在不断的探究过程中掌握编译程序设计和构造的基本原理和实现技术,启迪学生的抽象思维、激发学生的学习兴趣、培养学生的探究精神和专业素养,从而提高学生发现问题、分析问题和解决问题的能力。2、 实验内容:实验项目 完成以下正则文法所描述的Pascal 语言子集单词符号的词法分析程序。<标识符>字母 <标识符>字母 <标识符>数字<无符号整数&

2、gt;数字 <无符号整数>数字<单字符分界符> + * ; ()<双字符分界符><大于>=<小于>=<小于>><冒号>=<斜竖>* <小于><<等于>= <大于>> <冒号> : <斜竖> /该语言的保留字:begin end if then else for do while and or not设计说明 (1)该语言大小写不敏感;(2)字母为a-z A-Z,数字为0-9;(3)可以对上述文法进行扩充和改造;(4) /*

3、/为程序的注释部分。设计要求 (1)给出各单词符号的类别编码;(2)词法分析程序应能发现输入串中的错误;(3)词法分析作为单独一遍编写,词法分析结果为二元式序列组成的中间文件;(4)设计两个测试用例(尽可能完备),并给出测试结果。3、 实验环境:操作系统:Windows 7软件:VC+6.04、 程序功能描述:l 给出了各单词符号的类别编码;l 词法分析程序能够对给出的文件中的输入串做出正确的词法;l 词法分析程序能发现文件输入串中的错误;l 词法分析结果为二元式序列组成的中间文件;l 词法分析程序能兼容注释并能发现文件注释未关闭的错误五、数据结构设计:六、程序结构描述:l 设计方法:本程序采

4、用从文件读取字符串,根据已有文法、词法的构成及规定对字符串进行词法分析,其种类主要包括保留字、标识符、无符号数字、字符等,将分析的结果写入另一个文件。程序规定的单词符号及其种别码见下表:单词符号及其种别码表单词符号种别码单词符号 种别码begin1无符号整数13end2+14If3-15then4 *16else5;17for6(18do 7)19while8=20and9>21or 10>=22not 11<23标识符 12<=24<>25:=26/27/*28*/29l 主要函数说明:lookup():每调用一次,就以TOKEN中的字符串查保留字表,若查

5、到,就将相应关键字的类别码赋给整型变量c;否则将c置为0;main():主函数;scanner():扫描函数,完成程序的主要功能,包括读字符串、分析处理、分析处理等。l 函数调用关系说明:main()函数调用scanner()函数;scanner()函数调用lookup()函数。l 执行框图:1) 总体结构图:2)扫描程序结构框图:七、 实验过程结果截图:l 测试用例一:结果一:l 测试用例二:结果二:八、 实验总结:l 实验心得:通过本次实验我锻炼了自己的上机操作能力及编程能力,并对理论知识有了进一步的了解。本实验基本思路比较清晰,用较为简单的算法就能实现;解决实验中遇到的问题也花费了一部分

6、时间,我增长了处理关于文件错误的能力;l 实验中遇到的问题:主要问题就是在读取文件时对文件末尾的判断预处理,有两个问题花费了大部分时间,一个是在回退时要判断是否为文件末尾,若是则不需要回退;另外一个就是要先读取一个字符再用feof(fp)来判断是否为文件尾,且两个应紧密相连;l 程序的自我评价:此程序实现了要求中的所有功能,并增加了对注释的一些操作,但因编程能力的欠缺,其中有的地方不免有些繁杂,还有一些潜藏的问题,需要进一步测试来时程序变得更加具有健壮性。九、 程序清单:/*课题名称:词法分析程序构造原理与实现技术作者:房皓 进修生 13410801最后修改时间:2014.4.9 19:47*

7、/*单词符号及其分类编码单词符号种别码单词符号 种别码begin1无符号整数13end2+14if3-15then4*16else5;17for6(18do7)19while8=20and9>21or10>=22not11<23标识符12<=24<>25:=26/27/*28*/29/*/#include<iostream>#include<ctype.h>#include<string.h>#include<stdlib.h>using namespace std;/int lookup(char *str)

8、/每调用一次,就以TOKEN中的字符串查保留字表,若查到,就将相应关键字的类别码赋给整型变量c;否则将c置为0char*letter11="begin","end","if","then","else","for","do","while","and","or","not"/保留字int i;for(i=0;i<11;i+)if(strcmp(str,letteri)=0

9、)/比较是否相同return i+1;/若相同,返回相应的种别码return 0;/int scanner(FILE *fp)char TOKEN20;FILE *fp_out=fopen("result.txt","w");char ch;int i=0,c;int zhushi=0;/zhushi等于0表示当前不是注释,zhushi=1表示当前及以后的都是注释ch=fgetc(fp);while(!feof(fp)/判断文件结束if(zhushi=0)i=0;if(ch=' '|ch='')elseif(isalpha

10、(ch)/是否为字母ch=tolower(ch);/转换成小写TOKEN0=ch;i+;ch=fgetc(fp);while(isalnum(ch)/数字或字母if(isalpha(ch)ch=tolower(ch);TOKENi=ch;i+;ch=fgetc(fp);TOKENi='0'if(ch!=EOF)/经验证,若没有此判断,遇到文件结尾仍返回的话,则fseek(fp,-1L,1);/ch的值永远为文件最后一个字符c=lookup(TOKEN);/查找保留字if(c=0)fprintf(fp_out,"(%d,%s)",12,TOKEN);/标识符p

11、rintf("(%d,%s)n",15,TOKEN);/标识符elsefprintf(fp_out,"(%d,%s)",c,TOKEN);/保留字printf("(%d,%s)n",c,TOKEN);/保留字elseif(isdigit(ch)/是否为数字TOKEN0=ch;ch=fgetc(fp);i+;while(isdigit(ch)TOKENi=ch;i+;ch=fgetc(fp);TOKENi='0'if(ch!=EOF)fseek(fp,-1L,1);fprintf(fp_out,"(%d,%s)

12、",13,TOKEN);/无符号整数printf("(%d,%s)n",16,TOKEN);/无符号整数elseswitch(ch)case'<':if(!feof(fp)ch=fgetc(fp);if(ch='=')fprintf(fp_out,"(%d,%s)",24,"<=");printf("(%d,%s)n",24,"<=");elseif(ch='>')fprintf(fp_out,"(%d,

13、%s)",25,"<>");printf("(%d,%s)n",25,"<>");elseif(ch!=EOF)fseek(fp,-1,1);fprintf(fp_out,"(%d,%c)",23,'<');printf("(%d,%c)n",23,'<');break;case'=':fprintf(fp_out,"(%d,%c)",20,'=');printf(&

14、quot;(%d,%c)n",20,'=');break;case'>':if(!feof(fp)ch=fgetc(fp);if(ch='=')fprintf(fp_out,"(%d,%s)",22,">=");printf("(%d,%s)n",22,">=");elseif(ch!=EOF)fseek(fp,-1,1);fprintf(fp_out,"(%d,%c)",21,'>');print

15、f("(%d,%c)n",21,'>');break;case'+':fprintf(fp_out,"(%d,%c)",14,'+');printf("(%d,%c)n",14,'+');break;case'-':fprintf(fp_out,"(%d,%c)",15,'-');printf("(%d,%c)n",15,'-');break;case'*':fp

16、rintf(fp_out,"(%d,%c)",16,'*');printf("(%d,%c)n",16,'*');break;case'':fprintf(fp_out,"(%d,%c)",17,'');printf("(%d,%c)n",17,'');break;case'(':fprintf(fp_out,"(%d,%c)",18,'(');printf("(%d,%c)

17、n",18,'(');break;case')':fprintf(fp_out,"(%d,%c)",19,')');printf("(%d,%c)n",19,')');break;case'/':if(!feof(fp)ch=fgetc(fp);if(ch='*')zhushi=1;/zhushi=1;fprintf(fp_out,"(%d,%s)",28,"/*");printf("(%d,%s)n

18、",28,"/*");elseif(ch!=EOF)fseek(fp,-1,1);fprintf(fp_out,"(%d,%c)",27,'/');printf("(%d,%c)n",27,'/');break;case':':if(!feof(fp)ch=fgetc(fp);if(ch='=')fprintf(fp_out,"(%d,%s)",26,":=");printf("(%d,%s)n",26,":=");elseif(ch!=EOF)fseek(fp,-1,1);break;default:fprintf(fp_out,"(%s,%c)","非法字符",ch);

温馨提示

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

评论

0/150

提交评论