编译原理实验报告编写词法分析程序_第1页
编译原理实验报告编写词法分析程序_第2页
编译原理实验报告编写词法分析程序_第3页
编译原理实验报告编写词法分析程序_第4页
编译原理实验报告编写词法分析程序_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

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

文档简介

1、编译原理实验报告实验名称: 编写词法分析程序 实验类型: 验证型实验 指导教师: 专业班级: 姓名: 学号: 电子邮件: 实验地点: 实验成绩: 日期:201 年 4 月 20 日一、 实验目的通过设计、调试词法分析程序,实现从源程序中分出各种单词的方法;熟悉词法分析程序所用的工具自动机,进一步理解自动机理论;掌握文法转换成自动机的技术及有穷自动机实现的方法;确定词法分析器的输出形式及标识符与关键字的区分方法;加深对课堂教学的理解;提高词法分析方法的实践能力;通过本实验,应达到以下目标:1、掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法。2、掌握词法分析的实现方法。3、上

2、机调试编出的词法分析程序。二、 实验过程先思考如何实现,画出流程图,然后变成实现所需功能。流程图如下:三、实验结果词法分析实验成功。四、讨论与分析本以为这个程序会很难,没想到真正写起来感觉还不错。主要是要先画好流程图,有个自己的思路,这样才好进行下一步。流程图很关键,一方面在自己写起来的时候,思路清晰,明了;另一方面,也可以让别人很轻松的看懂你的程序思想。五、附录:关键代码(给出适当注释,可读性高)#include<stdio.h>#include<ctype.h>#include <string.h>/保留字表char* keyword8 = "

3、if","else","for","while","do","int","read","write"/纯单分界符char singleword50 = "+-*();,:#&|"/双分界符char doubleword10 = "><=!&"/用于接收输入输出文件名char Scanin300,Scanout300;/用于指向输入输出文件的指针FILE* fin,* fout;

4、/词法分析函数int TESTscan() char ch,token40; /CH为每次读入的字符,TOKEN用于保存识别出的单词int es = 0,j,n; /es为错误代码,0表示没有错误printf("请输入源程序文件名(包括路径):");scanf("%s",Scanin);printf("请输入词法分析输出文件名(包括路径):");scanf("%s",Scanout);if(fin = fopen(Scanin,"r") = NULL) /判断输入文件名是否正确printf(&q

5、uot;n打开词法分析输入文件出错!n");es=1; /如果出错es置为1if(fout = fopen(Scanout,"w") = NULL) /判断输出文件名是否正确printf("n创建词法分析输出文件出错!n");es=2; /如果出错es置为2ch = getc(fin);while(ch!=EOF)while(ch=' '|ch='n'|ch='t') ch=getc(fin); if(isalpha(ch) /如果是字母 则进行标识符处理 token0 = ch;j = 1;ch

6、 = getc(fin);while(isalnum(ch) /如果是字母数字则组合标识符tokenj+ = ch; /组合的标识符存在TOKEN中ch = getc(fin);tokenj = '0' /标识符组合结束n = 0;while(n<8)&&strcmp(token,keywordn)n+;if(n >= 8) /如果不是保留字输出标识符fprintf(fout,"%st%sn","标识符",token); /输出标识符符号 printf("%st%sn","标识符&

7、quot;,token); /打印出来else /是保留字 输出保留字fprintf(fout,"%st%sn","保留字",token);/输出保留字符号 printf("%st%sn","保留字",token); else if(isdigit(ch)token0 = ch;j = 1;ch = getc(fin); /读下一个字符while(isdigit(ch)/如果是数字则组合整数 如果不是则整数组合结束tokenj+ = ch; /组合整数保存在TOKEN 中ch = getc(fin);/读下一个字符

8、tokenj = '0'/整数组合结束fprintf(fout,"%st%sn","无符号整数",token);/输出整数符号printf("%st%sn","无符号整数",token);else if(strchr(singleword,ch)>0)/单分解符处理token0 = ch;token1 = '0'ch = getc(fin);/读下一个符号以便识别下一个单词fprintf(fout,"%st%sn","单分界符",toke

9、n);/输出单分界符好printf("%st%sn","单分界符",token);/打印单分界符else if(strchr(doubleword,ch)>0)/双分界符处理token0 = ch;ch = getc(fin);/读下一个字符判断是否为双分界符if(ch = '=')/如果是= 组合双分界符token1 = ch;token2 = '0'/组合双分界符结束ch = getc(fin);/读下一个符号以便识别下一个单词else if(ch = '&')/如果是& 组合双分

10、界符token1 = ch;token2 = '0'/组合双分界符结束ch = getc(fin);/读下一个符号以便识别下一个单词else /不是=则为但分界符token1 = '0'fprintf(fout,"%st%sn","双分界符",token);/输出双分界符符号printf("%st%sn","双分界符",token);else if(ch='/')ch = getc(fin);if(ch = '*') /如果是* 则开始处理注释char

11、 ch1;ch1 = getc(fin); /读下一个字符doch = ch1;ch1 = getc(fin);while(ch !='*'|ch1 != '/')&&(ch1 !=EOF);ch = getc(fin);/不是*则处理单分界符elsetoken0 = '/'token1 = '0'fprintf(fout,"%st%sn","单分界符",token);/输出单分界符printf("%st%sn","单分界符",token);else /错误处理token0 = ch;token1 = '0'ch = getc(fin); /读下一个符号以便识别es = 0; /设置错误代码fprintf(fout,"%st%sn","ERROR",token);/输出错误符号 并提示ERROR printf("%st%sn","ERROR",token);fclose(fin); /关闭输入输出文件fclose(fout);return

温馨提示

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

评论

0/150

提交评论