您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 编译原理标准实验报告
电子科技大学实验报告学生姓名:学号:指导教师:实验地点:实验时间:一、实验室名称:计算机学院软件工程实验室二、实验项目名称:词法分析器的设计与实现三、实验学时:4学时四、实验原理1.编译程序要求对高级语言编写的源程序进行分析和合成,生成目标程序。词法分析是对源程序进行的首次分析,实现词法分析的程序为词法分析程序。2.词法分析的功能是从左到右逐个地扫描源程序字符串,按照词法规则识别出单词符号作为输出,对识别过程中发现的词法错误,输出相关信息。3.状态转换图是有限有向图,是设计词法分析器的有效工具。五、实验目的通过设计词法分析器的实验,使同学们了解和掌握词法分析程序设计的原理及相应的程序设计方法,同时提高编程能力。六、实验内容实现求n!的极小语言的词法分析程序,返回二元式作为输出。七、实验器材(设备、元器件)1.操作系统:WindowsXP2.开发工具:VC6.03.普通PC即可八、实验步骤(1)启动VC6.0,创建空白工程项目。选择菜单中的“文件”-“新建”-“项目”,在弹出的对话框中,左边的“项目类型”框中,选择“VisualC++项目”,在右边框中,选择“空项目(.Net)”,在对话框下边,选择工程文件存放目录及输入名称,如Example1,单击“确定”。(2)建立相应的单词符号与种别对照表;(3)根据状态转换图编写相应的处理函数;(4)完成词法分析器;(5)编译与调试以上程序;(6)生成相应的*.dyd文件,作为后面语法分析的输入文件。九、实验数据及结果分析可以对源程序进行词法分析,如果有错给出出错信息和所在行数,如果无错则生成二元式文件。十、实验结论本实验程序较好地完成了词法分析程序的设计与实现,能够对所给文法的程序进行词法分析,在没有词法错误的时候生成相应的二元式文件。该实验程序可一次性给出源程序中的词法错误。十一、总结及心得体会通过该实验,对词法分析程序的设计,以及运用C语言进行编程有了更深刻的理解,同时加深了自己对词法分析程序的原理的理解与掌握,提高了自己的动手能力。十二、对本实验过程及方法、手段的改进建议程序设计合理,代码可进一步优化。报告评分:指导教师签字:本实验参考源代码如下:#includestring#includeiostream#includestdio.husingnamespacestd;charch,cache;boolretracted,ended;intnum,cur_line;stringtoken;voidclear_output(){freopen(example.dyd,w,stdout);fclose(stdout);freopen(LexAnalyze.err,w,stdout);fclose(stdout);}structpair_val{strings;intval;};voidgetnbc(){if(retracted){ch=cache;retracted=false;}elsech=getchar();while(ch==''||ch=='\n'){if(ch=='\n'){printf(%16s24\n,EOLN);cur_line++;}ch=getchar();}}voidconcat(){token+=ch;}boolletter(){if(ch='A'&&ch='Z')returntrue;if(ch='a'&&ch='z')returntrue;returnfalse;}booldigit(){if(ch='0'&&ch='9')returntrue;returnfalse;}voidretract(){retracted=true;cache=ch;}intreserve(){if(token==begin)return1;if(token==end)return2;if(token==integer)return3;if(token==if)return4;if(token==then)return5;if(token==else)return6;if(token==function)return7;if(token==read)return8;if(token==write)return9;return0;}voidreturn_val(pair_valv){freopen(example.dyd,a+,stdout);while(v.s.length()16)v.s=''+v.s;coutv.s'';printf(%2d\n,v.val);if(!(retracted&&cache!=''&&cache!='\n')){getnbc();if(ch==EOF){printf(%16s25\n,EOF);ended=true;}retract();}fclose(stdout);}voiderror(inttype){freopen(LexAnalyze.err,a+,stdout);printf(***LINE%d:,cur_line);if(type==0)printf(illegaloperator\n);elseprintf(unknowncharacter\n);fclose(stdout);}voidLexAnalyze(){pair_valret;token=;getnbc();switch(ch){case'a':case'b':case'c':case'd':case'e':case'f':case'g':case'h':case'i':case'j':case'k':case'l':case'm':case'n':case'o':case'p':case'q':case'r':case's':case't':case'u':case'v':case'w':case'x':case'y':case'z':case'A':case'B':case'C':case'D':case'E':case'F':case'G':case'H':case'I':case'J':case'K':case'L':case'M':case'N':case'O':case'P':case'Q':case'R':case'S':case'T':case'U':case'V':case'W':case'X':case'Y':case'Z':while(letter()||digit()){concat();ch=getchar();}retract();num=reserve();if(num!=0){ret.s=token;ret.val=num;return_val(ret);}else{ret.s=token;ret.val=10;return_val(ret);}break;case'0':case'1':case'2':case'3':case'4':case'5':case'6':case'7':case'8':case'9':while(digit()){concat();ch=getchar();}retract();ret.s=token;ret.val=11;return_val(ret);break;case'=':ret.s==;ret.val=12;return_val(ret);case'':ch=getchar();if(ch==''){ret.s=;ret.val=13;return_val(ret);}elseif(ch=='='){ret.s==;ret.val=14;return_val(ret);}else{retract();ret.s=;ret.val=15;return_val(ret);}break;case'':ch=getchar();if(ch=='='){ret.s==;ret.val=16;return_val(ret);}else{retract();ret.s=;ret.val=17;return_val(ret);}break;case'-':ret.s=-;ret.val=18;return_val(ret);break;case'*':ret.s=*;ret.val=19;return_val(ret);break;case':':ch=getchar();if(ch=='='){ret.s=:=;ret.val=20;return_val(ret);}elseerror(0);break;case'(':ret.s=(;ret.val=21;return_val(ret);break;case')':ret.s=);ret.val=22;return_val(ret);break;case';':ret.s=;;ret.val=23;return_val(ret);break;default:error(1);}}intmain(){freopen(example.pas,r,stdin);clear_output();retracted=ended=false;cur_line=1;while(!ended){LexAnalyze();}return0;}电子科技大学实验报告学生姓名:学号:指导教师:实验地点:实验时间:一、实验室名称:计算机学院软件工程实验室二、实验项目名称:递归下降分析器的设计与实现三、实验学时:12学时四、实验原理1.语法分析是对源程序经过词法分析后转换成的单词流按方法规则进行判断,对能构成正确句子的单词流,给出相应的语法树;对不能构成正确句子的单词流判断其语法错误并做出相应处理。2.语法分析方法有自上而下和自下而上的分析方法。在不含左递归的文法G中,如果对每一个非终结符的所有候选式的第一个终结符都是两两不相交的(即无公共左因子),则可能构造出一个不带回溯的自上而下的分析程序,这个分析程序由一组递归过程组成,每个过程对应文法的一个非终结符。这样的分析程序称为递归下降分析程序。七、实验目的通过设计递归下降分析器的设计与实现实验,使同学们掌握自上而下的递归分析法的语法分析原理和程序设计方法。八、实验内容根据给定的方法,编写相应的递归下降的语法分析程序,实现对词法分析后的单词序列的语法检查和程序结构的分析,生成相应的变量名表和过程名表,并将编译中语法检查出来的错误写入相应的文件。语法错分类:(1)缺少符号错;(2)符号匹配错(3)符号无定义或重复定义。七、实验器材(设备、元器件)1.操作系统:WindowsXP2.开发工具:VC6.03.普通PC即可十、实验步骤(1)启动VC6.0,创建空白工程项目。选择菜单中的“文件”-“新建”-“项目”,在弹出的对话框中,左边的“项目类型”框中,选择“VisualC++项目”,在右边框中,选择“空项目(.Net)”,在对话框下边,选择工程文件存放目录及输入名称,如Example1,单击“确定”。(2)消除文法中的左递归;(3)实现对方法进行递归向下的分析过程;(4)利用词法分析器生成的二元式文件*.dyd进行语法分析;(5)编译与调试以上程序;十一、实验数据及结果分析可以对源程序进行语法分析,图中给出了出错行数及出错类型。十一、实验结论本实验程序较好地完成了递归下降分析器的设计与实现,能够对所给文法的程序进行语法分析,生成变量名表和过程名表,如果源程序有语法错误则给出出错类型及所在行数。十一、总结及心得体会通过该实验,对递归下降分析程序的设计,以及运用C语言进行编程有了更深刻的理解,同时加深了自己对语法分析程序的原理的理解与掌握,提高了自己的动手能力。十二、对本实验过程及方法、手段的改进建议程序设计合理,代码可进一步优化。报告评分:指导教师签字:本实验参考源代码如下:#includevector#includestring#includeiostream#includestdio.husingnamespacestd;structvariable
本文标题:编译原理标准实验报告
链接地址:https://www.777doc.com/doc-4876190 .html