您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 编译原理词法分析、语法分析、中间代码生成实验报告---副本
编译原理实验报告实验名称:编译原理实验报告(总)专业:计科学号:姓名:成绩:2018年6月16日一.报告目的1.总结1学期编译原理的学习2.整理词法分析、语法分析、四元式生成相关实验,为了加深记忆,日后有一天还能找到这份报告捡起来这部分的知识。3.总结实验中存在的问题与不足,并去改正。二.包含内容与实现思路实验项目实验内容1、词法分析程序设计与实现构造具有关键字、运算符、标识符、无符号常数等单词的词法分析程序。输入由符合及不符合规定单词类别结构的各类单词组成的源程序。输出单词串的二元式编码(CLASS,VALUE)。2、语法分析程序设计与实现将词法分析程序输出的单词串作为输入,针对常见的表达式、赋值语句、条件语句、循环语句等语法成分,选择有代表性的语法分析方法,如递归下降法、算符优先分析、LL(1)、LR等方法之一,设计实现相应的语法分析程序。3、语义分析程序设计与实现对各语法单位增加语义子程序,将表达式或可执行语句翻译为四元式序列输出,并能进行错误检查与处理,将错误信息输出。1、词法分析词法分析阶段是编译过程的第一个阶段,是编译的基础。这个阶段的任务是从左到右一个字符一个字符地读入源程序,即对构成源程序的字符流进行扫描然后根据构词规则识别单词(也称单词符号或符号)。词法分析程序实现这个任务。词法分析是编译程序的第一个阶段且是必要阶段;词法分析的核心任务是扫描、识别单词且对识别出的单词给出定性、定长的处理构造具有关键字、运算符、标识符、无符号常数等单词的词法分析程序。输入由符合及不符合规定单词类别结构的各类单词组成的源程序。输出单词串的二元式编码(CLASS,VALUE)。实现方法:递归实现实现步骤:Openfile();Delete_Comments1();Delete_Comments2();Insert_Space();Split_Words();Merge_Symbol();Print_All();2、语法分析在计算机科学和语言学中,语法分析(英:Syntacticanalysis,也叫Parsing)是根据某种给定的形式文法对由单词序列(如英语单词序列)构成的输入文本进行分析并确定其语法结构的一种过程。[1]语法分析器(Parser)通常是作为编译器或解释器的组件出现的,它的作用是进行语法检查、并构建由输入的单词组成的数据结构(一般是语法分析树、抽象语法树等层次化的数据结构)。语法分析器通常使用一个独立的词法分析器从输入字符流中分离出一个个的“单词”,并将单词流作为其输入。语法分析是编译过程的核心部分,其基本任务是根据语言的语法规则进行语法分析,如果不存在语法错误即给出正确的语法结果,并为语义分析和代码生成做准备。将词法分析程序输出的单词串作为输入,针对常见的表达式、赋值语句、条件语句、循环语句等语法成分,选择有代表性的语法分析方法,如递归下降法、算符优先分析、LL(1)、LR等方法之一,设计实现相应的语法分析程序。实现方法:自顶向下分析。根据形式语法规则,在语法分析树的自顶向下展开中搜索输入符号串可能的最左推导。单词按从左到右的顺序依次使用。3、四元式生成四元式是一种更接近目标代码的中间代码形式。由于这种形式的中间代码便于优化处理,因此,在目前许多编译程序中得到了广泛的应用。实现过程:在语法分析的基础上,修改输出格式,建立四元式表,同时解决while和if语句的有条件跳转和无条件跳转问题。设计回填函数。实现过程:递归实现,设计条件语句,赋值语句,布尔语句的分析过程。voidProgram(FILE*IN);voidProgram1(FILE*IN);voidBlock(FILE*IN);voidSentenList(FILE*IN);voidSentenList1(FILE*IN);AttrSenten(FILE*IN,Attrself);AttrIntSenten(FILE*IN,Attrself);AttrIntSenten1(FILE*IN,Attrself);AttrAssignSenten(FILE*IN,Attrself);AttrConSenten(FILE*IN,Attrself);AttrConSenten1(FILE*IN,Attrself);AttrWhileSenten(FILE*IN,Attrself);AttrProSenten(FILE*IN,Attrself);AttrComSenten(FILE*IN,Attrself);AttrRelaExp(FILE*IN,Attrself);AttrExpr(FILE*IN,Attrself);AttrExpr1(FILE*IN,Attrself);AttrTerm(FILE*IN,Attrself);AttrTerm1(FILE*IN,Attrself);AttrFactor(FILE*IN,Attrself);AttrConExp(FILE*IN,Attrself);AttrConExp1(FILE*IN,Attrself);AttrRelaID(FILE*IN,Attrself);三.代码与测试样例完整代码见附件测试样例:词法分析:++;==:=/*sdfsadfasdf23123123sdfsdf*22332376FDD_**///var32asg,&&&3sdf,sdf123:integer;-*/,;,a=b+c;a++;a=1234;=//sdfsadfasdf23123123sdfsdf;;,/*sdfsadfasdf23123123sdfsdf*22332376FDD_**/;4;,,,,,//*sdfsaf*22332376FDD_*a=b+c;/booleanmod;adivbab1234.123sdfddsasdfsdfaaaaasdfsdfsdfsdfsad12123sdfsdfsdfsdfabc123abegin/*23123dfsdfsdfdf++++dsfsdfbegin*/遇到的问题:编写代码过程中,被多行注释的删除所困扰,多行注释删除后,导致单词所在行数出现问题。语法分析测试样例:procedureabc;begindefa,b,c;a=1b=2;c=1+2*3+(4+5)*6;if(a==b)begina=a+b;b=b+a;endelsec=1000;while(c500andc2000andc12orc4)beginif(a3)c=c+500;if(aborc1)a=1;endend.四元式测试样例:procedureabc;begindefa,b,c;a=1;b=1;c=1+2*3+(4+5)*6;if(a+bc)begina=a+b;b=b+aendelsec=1000;while(c500andc2000andc12orc4)beginif(a3)c=c+500;if(c4)if(aborc1)a=1endend.测试结果:遇到的问题:四元式编写过程中一开始打算用自下而上的方法,通过构建ll(1)分析表做,发现无从下手。最后采用递归下降法。编写过程中bug不多,发现在程序中写一些与debug有关的代码可以为debug带来很大的便利。四.心得感想通过一个学期的编译原理学习,我对编译原理有了一定的了解。知道了编译程序一般包括词法分析程序、语法分析程序、语义分析程序、中间代码生成、代码优化程序、目标代码生成、表格处理程序和出错处理程序等等。理解了前几步具体的功能与实现方式。对于一个文法,我们需要研究它的句型、句子和语言。要识别一个符号串是不是一个文法的合法句子,需要对它进行语法分析。分析方法有两类,一列是自上而下分析法,另一类是自下而上分析法。经过此次编译课程实验,使我对递归下降算法有了更深更进一步理解,而且也锻炼了自己的程序编码能力,现在我们所涉及的分析器仅包含有限的模块,漏洞和错误还很多,没法跟正规的编译器程序相比,不过不足之处以后会慢慢改进。五.具体代码词法分析#includeiostream#includestdio.h#includestdlib.h#includestring.h#includectype.h#includefstream#includestring#includevector#includeiomanip#definemaxn100000usingstd::pair;usingnamespacestd;vectorpairstring,intwords;stringkeyword_list[10]={procedure,def,if,else,while,call,begin,end,and,or};//保留字不区分大小写stringoperator_list[]={+,-,*,/,=,,,=,=,,==};stringdelimiter_list[]={(,),,,;};stringText;intcnt_keywords=0,cnt_identifier=0,cnt_number=0,cnt_operator=4,cnt_delimiter=15;ofstreamout(output.txt);voidOpenfile()//打开文件{cout输入文件路径:(e.g.C://abc//bcd//text.txt/n);stringaddress;cinaddress;chartext[maxn];charbuffer[maxn];ifstreamin(address);if(!in.is_open()){cout********openingfilefailed********;exit(1);}while(!in.eof()){in.getline(buffer,10000);strcat(text,buffer);strcat(text,\n);}Text=text;}voidDelete_Comments1()//删除单行注释{while(Text.find(//,0)!=string::npos){intindex1=Text.find(//,0);intindex2=Text.find('\n',index1);Text.erase(index1,index2-index1);}}voidDelete_Comments2()//删除多行注释{while(Text.find(/*,0)!=string::npos){intindex1=Text.find(/*,0);if(Text.find(*/,0)!=string::npos){intindex2=Text.find(*/,0);intcnt=0;for(inti=index1;i=index2;i++){if(Text[i]=='\n')cnt++;}Text.erase(index1,index2-index1);while(cnt--){Text.insert(index1,\n);}}else{break;}}}voidInsert_Space()//在界符和运算符两边插入空格{for(inti=0;iText.length();i++){if(Text[i]=='+'||Text[i]=='-'||Text[i]=='*'||Text[i]=='/'||Text[i]==''||Text[i]==''||Text[i]=='='||Text[i]=='('||Text[i]==')'||Text[i]==','||Text[i]==';'){Text.insert(Text.begin()+i,'');Text.insert(Text.begin()+i+2,'');i+=2;}}}voidSplit_Words()//分离单词{introw=1;stringtemp;for(inti=0;iText.length();i++){if(Text[i]=
本文标题:编译原理词法分析、语法分析、中间代码生成实验报告---副本
链接地址:https://www.777doc.com/doc-1887921 .html