您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 电子科大-编译原理实验报告(得分70分)
电子科技大学计算机学院实验中心计算机专业类课程实验报告课程名称:编译原理学院:计算机科学与工程学院专业:计算机科学与技术专业学生姓名:郫县库里学号:2014666666666指导教师:日期:2017年5月14日电子科技大学实验报告实验一一、实验名称:词法分析器的设计与实现二、实验学时:4三、实验内容和目的:(一)实验内容:1.源语言:求n!的极小语言2.输入输出:源程序*.pas文件作为输入,经过自己编程实现的词法分析器进行处理,生成二元式,保存到*.dyd文件中,如下图所示。(二)实验目的:通过设计词法分析器的实验,使同学们了解和掌握词法分析程序设计的原理及相应的程序设计方法,同时提高编程能力。四、实验原理:(一)结合“数据结构”进行分析:1.二元式文件*.dyd(1)二元式形式:电子科技大学计算机学院实验中心分析:由输出二元式形式可知,使用printf输出可以很方便达到要求:(2)每行后加一分析:对输入文件中的换行符“\n”,要采取相应的策略:(3)文件结尾加分析:对于文件末尾的“EOF”,要采取相应的策略:2.错误信息文件:*.err(1)错误信息格式分析:设置出错处理的函数,并且需要记录错误行号、错误性质:(2)注意:进入每一阶段,首先打开如果无错误,则为空。(二)词法分析的实现方法——利用状态转换分析:根据状态转化图,编写读到不同的内容时的状态转化函数,是设计词法分析器的核心。(三)对“输入输出”文件的分析——文件相关操作因为需要读写文件,并生成错误文件,涉及许多文件相关操作,通过相关函数函数实现功能:五、实验器材(设备、元器件)(一)操作系统:Windows8Professional(二)开发工具:VisualStudio2015(三)编程语言:C电子科技大学计算机学院实验中心六、实验步骤:(一)启动VisualStudio2015,新建一个项目LxicalAnalyzer(二)编写LxicalAnalyzer.h文件,声明项目将要用到的自定义函数:(三)编写LxicalAnalyzer.cpp文件,根据“状态转化图”、“单词符号与种别对照表”实现LxicalAnalyzer.h中声明的函数(详细代码附在实验报告最后);(四)编写main.cpp文件,完成编码;(五)根据给出的测试程序,编写输入文件test.pas(六)运行写好的词法分析器程序,并结合输出文件test.err、test.dyd进行调试;(七)完成实验。七、实验数据及结果分析:(一)输入文件test.pas(二)执行词法分析器程序(三)检查输出文件test.err因为输入文件中测试程序没有错误,所以文件为空:(四)检查输出文件test.dyd检查可知,输出文件内容为符合实验要求的二元式:(五)修改输入文件,在输入文件中添加错误电子科技大学计算机学院实验中心(六)再次执行词法分析器程序(七)重新检查输出文件test.err可见,本词法分析器成功实现检查多处词法错误:八、实验结论、心得体会和改进建议:(一)实验结论通过编码与反复调试,成功完成了词法分析器的设计与实现,能够对给出文法的测试程序进行正确的词法分析,按要求输出二元式的*.dyd文件。同时,也可以检测出所给源程序中的多处词法错误。(二)心得体会1.对于这种需要多次重复同一操作的实验,将相应的操作写成函数,可以方便编码,减少错误和代码行数。2.第一次编码忽略了状态转化之后的回退工作,导致bug的出现,以后需要吸取经验教训。3.尽量在第一次编写程序时,写出较多的提示信息和注释,便于发现bug后的调试。(三)改进建议上课使用的教材P134页“第六章词法分析”中的内容对本实验的完成有很大帮助,认真阅读后思路更加清晰。*********为便于老师评阅报告,两次实验代码都添加底纹后放在在文档最后部分*********电子科技大学实验报告实验二一、实验名称:递归下降分析器的设计与实现二、实验学时:4三、实验内容和目的:(一)实验内容:根据给定的方法,编写相应的递归下降的语法分析程序,实现对词法分析后的单词序列的语法检查和程序结构的分析,生成相应的变量名表和过程名表,并将编译中语法检查出来的错误写入相应的文件。语法错分类:(1)缺少符号错;(2)符号匹配错;(3)符号无定义或重复定义。(二)实验目的:通过设计递归下降分析器的设计与实现实验,使同学们掌握自上而下的递归分析法的语法分析原理和程序设计方法。四、实验原理:(一)语法分析的定义和功能语法分析是根据语法规则,将单词符号构成各类语法单位,并进行语法检查。在本实验中,对源程序经过词法分析后转换成的单词流按方法规则进行判断,对能构成正确句子的单词流,给出相应的语法树;对不能构成正确句子的单词流判断其语法错误并做出相应处理。电子科技大学计算机学院实验中心(二)语法分析的方法语法分析方法有自上而下和自下而上的分析方法。(1)自上而下语法分析法:或从开始符号出发,找最左推导;或从根开始,构造推导树。(2)自下而上语法分析法:从输入串开始,归约,直至文法开始符。本实验中,我们采用自上而下的递归下降分析法,在不含左递归的文法G中,如果对每一个非终结符的所有候选式的第一个终结符都是两两不相交的(即无公共左因子),则可能构造出一个不带回溯的自上而下的分析程序,这个分析程序由一组递归过程组成,每个过程对应文法的一个非终结符。这样的分析程序称为递归下降分析程序。(三)数据结构1.*.dys同*.dyd2.变量名表·变量名vname:char(16)·所属过程vproc:char(16)·分类vkind:0..1(0—变量、1—形参)·变量类型vtype:types·变量层次vlev:int·变量在变量表中的位置vadr:int(相对第一个变量而言)3.过程名表·过程名pname:char(16)·过程类型ptype:types·过程层次plev:int·第一个变量在变量表中的位置fadr:int·最后一个变量在变量表中的位置ladr:int4.四元式表(oprd,op1,op2,result)·oprd——整数码·op1——第一操作数·op2——第二操作数·result——结果·op1、op2、result可用“值/地址”表示5.目标代码——P码电子科技大学计算机学院实验中心(四)给定文法产生式实验中给定文法如下:程序→分程序分程序→begin说明语句表;执行语句表end说明语句表→说明语句│说明语句表;说明语句说明语句→变量说明│函数说明变量说明→integer变量变量→标识符标识符→字母│标识符字母│标识符数字字母→a│b│c│d│e│f│g│h│i│j│k│l│m│n│o│p│q│r│s│t│u│v│w│x│y│z数字→0│1│2│3│4│5│6│7│8│9函数说明→integerfunction标识符(参数);函数体参数→变量函数体→begin说明语句表;执行语句表end执行语句表→执行语句│执行语句表;执行语句执行语句→读语句│写语句│赋值语句│条件语句读语句→read(变量)写语句→write(变量)赋值语句→变量:=算术表达式算术表达式→算术表达式-项│项项→项*因子│因子因子→变量│常数│函数调用常数→无符号整数无符号整数→数字│无符号整数数字条件语句→if条件表达式then执行语句else执行语句条件表达式→算术表达式关系运算符算术表达式关系运算符→│=││=│=│五、实验器材(设备、元器件)(一)操作系统:Windows8Professional(二)开发工具:VisualStudio2015(三)编程语言:C六、实验步骤:(一)启动VisualStudio2015,新建一个项目GrammerAnalyzer;(二)消除文法中的左递归;(三)编写GrammerAnalyzer.h文件,定义将要用到的结构,并声明项目将要用到的自定义函数:(四)编写GrammerAnalyzer.cpp文件,根据“文法产生式”实现LxicalAnalyzer.h中声明的函数和具体的递归下降分析法(详细代码附在实验报告最后);(五)编写main.cpp文件,完成编码;(五)将词法分析器的输出文件test.dyd作为实现的语法分析器的输入文件:电子科技大学计算机学院实验中心(六)运行写好的词法分析器程序,并结合输出文件test.dys、变量名表文件test.var、过程名表文件test.pro、错误文件等进行调试;(七)完成实验。七、实验数据及结果分析:(一)输入文件test.dyd,内容为2元式子(二)执行词法分析器程序(三)检查输出文件test.dys,与输入文件相同,正确:(四)检查变量名表文件test.var,符合要求:(五)检查过程名表文件test.pro,符合要求:(六)检查过程名表文件test.err,基本符合要求:八、实验结论、心得体会和改进建议:(一)实验结论:本实验程序较好地完成了递归下降分析器的设计与实现,能够对所给文法的程序进行语法分析,生成变量名表和过程名表,如果源程序有语法错误则给出出错类型及所在行数。(二)心得体会:1.标识符中不能包含关键字,以免出错;2.要注意文法中公共左因子的消除;3.思路要清晰,加一些提示信息,避免出现逻辑错误;4.由于对Pascal语言语法细节不是特别熟悉,所以对错误的识别不一定准确,还有改正和提高的空间,期末考试过后有时间,可以做进一步的完善。(三)改进建议:可以改成对C语言等我们经常接触到的语言作为本次实验的源语言,实验做起来可能会更有趣。电子科技大学计算机学院实验中心************************以下为实验一源代码,共三个文件************************(一)LexicalAnalyzer.h#pragmaonce#ifndefLEXICALANALYZER_H#defineLEXICALANALYZER_HchargetNextC();//获取下一个字符boollexAnalyzer();//用于词法分析的函数boolisLetter(charch);//判断ch是否为字母boolisDigit(charch);//判断ch是否为数字voidretract(char&ch);//回退字符intreserve(char*token);//返回保留字对应种别intsymbol();//返回标识符的对应种别intconstant();//返回常数的对应种别voidoutput_token(constchar*token,intkindNum);//按要求格式输出单词符号和种别boolprintError(intlineNum,interrNum);//按要求打印错误提醒voidgetPath(char*in,char*out);//获得路径voidgetFilename(char*in,char*out);//获得文件名boolinit(intargc,char*argv[]);//初始化函数#endif//!LEXICALANALYZER_H(二)LexicalAnalyzer.cpp#includeLexicalAnalyzer.h#includestring#defineMAX_COUNT1024#defineILLEGAL_CHAR_ERROR1#defineUNKNOWN_OPERATOR_ERROR2FILE*file;boollexAnalyzer(){//用于词法分析的函数if(feof(file)){returnfalse;}staticintlineNum=1;charch;chartoken[17]=;ch=getNextC();swi
本文标题:电子科大-编译原理实验报告(得分70分)
链接地址:https://www.777doc.com/doc-5457740 .html