资源描述
编译原理实验报告实验名称: 编写词法分析程序 实验类型: 验证型实验 指导教师: 专业班级: 姓名: 学号: 电子邮件: 实验地点: 实验成绩: 日期:201 年 4 月 20 日一、 实验目的通过设计、调试词法分析程序,实现从源程序中分出各种单词的方法;熟悉词法分析程序所用的工具自动机,进一步理解自动机理论;掌握文法转换成自动机的技术及有穷自动机实现的方法;确定词法分析器的输出形式及标识符与关键字的区分方法;加深对课堂教学的理解;提高词法分析方法的实践能力;通过本实验,应达到以下目标:1、掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法。2、掌握词法分析的实现方法。3、上机调试编出的词法分析程序。二、 实验过程先思考如何实现,画出流程图,然后变成实现所需功能。流程图如下:三、实验结果词法分析实验成功。四、讨论与分析本以为这个程序会很难,没想到真正写起来感觉还不错。主要是要先画好流程图,有个自己的思路,这样才好进行下一步。流程图很关键,一方面在自己写起来的时候,思路清晰,明了;另一方面,也可以让别人很轻松的看懂你的程序思想。五、附录:关键代码(给出适当注释,可读性高)#include#include#include /保留字表char* keyword8 = if,else,for,while,do,int,read,write;/纯单分界符char singleword50 = +-*();,:#&|;/双分界符char doubleword10 = =!&;/用于接收输入输出文件名char Scanin300,Scanout300;/用于指向输入输出文件的指针FILE* fin,* fout; /词法分析函数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(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 = getc(fin);while(isalnum(ch) /如果是字母数字则组合标识符tokenj+ = ch; /组合的标识符存在TOKEN中ch = getc(fin);tokenj = 0; /标识符组合结束n = 0;while(n= 8) /如果不是保留字输出标识符fprintf(fout,%st%sn,标识符,token); /输出标识符符号 printf(%st%sn,标识符,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);/读下一个字符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,单分界符,token);/输出单分界符好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 = &)/如果是& 组合双分界符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 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 es; int main()int es = 0;es = TESTscan();/调用词法分析程序if(es0)printf(词法分析有错!n);elseprintf(词法分析成功!n);return 0;六、实验者自评这次最大的收获就是学会画流程图。先给自己一个明确思路,再进行下一步。
展开阅读全文