资源描述:
《编译原理实验报告 编写词法分析程序.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、编译原理实验报告实验名称:编写词法分析程序实验类型:验证型实验指导教师:专业班级:姓名:学号:电子邮件:实验地点:实验成绩:日期:201年4月20日一、实验目的通过设计、调试词法分析程序,实现从源程序中分出各种单词的方法;熟悉词法分析程序所用的工具自动机,进一步理解自动机理论;掌握文法转换成自动机的技术及有穷自动机实现的方法;确定词法分析器的输出形式及标识符与关键字的区分方法;加深对课堂教学的理解;提高词法分析方法的实践能力;通过本实验,应达到以下目标:1、掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法。2、掌握词法分析的实现方法。3、
2、上机调试编出的词法分析程序。二、实验过程先思考如何实现,画出流程图,然后变成实现所需功能。流程图如下:三、实验结果词法分析实验成功。四、讨论与分析本以为这个程序会很难,没想到真正写起来感觉还不错。主要是要先画好流程图,有个自己的思路,这样才好进行下一步。流程图很关键,一方面在自己写起来的时候,思路清晰,明了;另一方面,也可以让别人很轻松的看懂你的程序思想。五、附录:关键代码(给出适当注释,可读性高)#include#include#include//保留字表char*keyword[8]={"if","
3、else","for","while","do","int","read","write"};//纯单分界符charsingleword[50]="+-*(){};,:#&
4、";//双分界符chardoubleword[10]="><=!&";//用于接收输入输出文件名charScanin[300],Scanout[300];//用于指向输入输出文件的指针FILE*fin,*fout;//词法分析函数intTESTscan(){charch,token[40];//CH为每次读入的字符,TOKEN用于保存识别出的单词intes=0,j,n;//es为错误代码
5、,0表示没有错误printf("请输入源程序文件名(包括路径):");scanf("%s",Scanin);printf("请输入词法分析输出文件名(包括路径):");scanf("%s",Scanout);if((fin=fopen(Scanin,"r"))==NULL)//判断输入文件名是否正确{printf("打开词法分析输入文件出错!");es=1;//如果出错es置为1}if((fout=fopen(Scanout,"w"))==NULL)//判断输出文件名是否正确{printf("创建词法分析输出文件出错!");es=2;//如果
6、出错es置为2}ch=getc(fin);while(ch!=EOF){while(ch==''
7、
8、ch==''
9、
10、ch=='t')ch=getc(fin);if(isalpha(ch))//如果是字母则进行标识符处理{token[0]=ch;j=1;ch=getc(fin);while(isalnum(ch))//如果是字母数字则组合标识符{token[j++]=ch;//组合的标识符存在TOKEN中ch=getc(fin);}token[j]=' ';//标识符组合结束n=0;while((n<8)&&strcmp(token,keyword[n
11、]))n++;if(n>=8)//如果不是保留字输出标识符{fprintf(fout,"%st%s","标识符",token);//输出标识符符号printf("%st%s","标识符",token);//打印出来}else//是保留字输出保留字{fprintf(fout,"%st%s","保留字",token);//输出保留字符号printf("%st%s","保留字",token);}}elseif(isdigit(ch)){token[0]=ch;j=1;ch=getc(fin);//读下一个字符while(isdigit(ch
12、))//如果是数字则组合整数如果不是则整数组合结束{token[j++]=ch;//组合整数保存在TOKEN中ch=getc(fin);//读下一个字符}token[j]=' ';//整数组合结束fprintf(fout,"%st%s","无符号整数",token);//输出整数符号printf("%st%s","无符号整数",token);}elseif(strchr(singleword,ch)>0)//单分解符处理{token[0]=ch;token[1]=' ';ch=getc(fin);//读下一个符号以便识别下一个单词fprint
13、f(fout,"%st%s","单分界符",t