课程设计报告课程设计名称:编译技术系别:三系学生姓名:班级:软件班学号:成绩:指导教师:开课时间:学年学期一.设计题目..............................................1二.主要内容..............................................1三.具体要求..............................................1四.进度安排..............................................1五.成绩评定..............................................2六.设计思路..............................................26.1单词符号及种别表..................................26.2SLR的分析表....................................36.21算术表达式的SLR(1)分析表.....................36.22布尔表达式的LR分析表........................46.23程序语句的LR分析表..........................5七.程序运行结果截图......................................6八.设计体会.............................................101一.设计题目设计和实现一个简单的小型高级程序设计语言的编译器二.主要内容自定义一种简单的小型高级程序设计语言,采用任意一种编程语言和编程工具设计并实现其编译器,展示编译系统中词法分析和语法分析(LR分析方法)的全过程。三.具体要求3.1对单词的构词规则有明确的定义;3.2编写的词法分析程序能够正确识别源程序中的单词符号;3.3识别出的单词以种别码,值的二元式形式保存并输出;3.4构造出程序设计语言各语法单位的SLR(1)分析表(其他分析表亦可);3.5能够对输入的源程序做出正确的语法分析并输出清晰的结果;3.6高级语言的规模不易过大,注重编译器内核的设计,对于界面无要求;3.7课程设计报告中应对所自定义高级语言进行简单描述,对编译器的设计进行简单的需求分析,给出设计说明和程序结构框架,阐明设计思路、用到的原理和方法。3.8不可更改课程设计报告中已有的字体和格式,课程设计报告中新加入内容,汉字采用宋体五号字,英文字符和数字采用TimesNewRoman五号字,行距全部采用单倍行距。3.9课程设计报告中的运行结果应以程序运行截图形式出现。3.10程序源代码以附件形式发送至指定邮箱:sqckcsj2011@126.com。附件名称为:“完整学号+姓名”四.进度安排序号内容时间(天)1设计题目、查找资料12概要设计13详细设计34调试分析并测试结果15总结并完成报告1总计8天2五.成绩评定5.1考核方法:通过现场考勤、检查源程序和批改课程设计报告相结合的方式考察学生的动手能力,独立分析解决问题的能力和创新精神,并根据学生的学习态度综合考评。5.2成绩评定:成绩分优、良、中、及格和不及格五等。六.设计思路6.1单词符号及种别表符号种别编码说明sy_if0保留字ifsy_then1保留字thensy_else2保留字elsesy_while3保留字whilesy_begin4保留字beginsy_do5保留字dosy_end6保留字enda7赋值语句semicolon8“;”e9布尔表达式jinghao10“#”S11语句L12复合语句tempsy15临时变量EA18Band(即布尔表达式中”B^”)EO19Band(即布尔表达式中”B^”)plus34“+”times36“*”become38“:=”op_and39“and”op_or40“or”op_not41“not”rop42关系运算符lparent48“(”rparent49“)”ident56变量intconst57整常量36.2SLR的分析表6.21算术表达式的SLR(1)分析表:算数表达式文法G[E]如下:E-E+E|E*E|(E)|i将文法G[E]拓广为文法G’[E]:(0)S’→E(1)E→E+E(2)E→E*E(3)E→(E)(4)E→i由此得到算数表达式的SLR(1)分析表如下:状态ACTIONGOTOi+*()#E0s3s211s4s5acc2s3s263r4r4r44s3s275s3s286s4s5s97r1s5r1r18r2r2r2r29r3r3r3r346.22布尔表达式的LR分析表布尔表达式的文法如下:B-B∧B|B∨B|¬B|iropi|i为了便于语法分析时加工处理,我们将上述文法改为文法G[S]:B-BAB|B0B|¬B|(B)|Iropi|iBA-B∧B0-B∨将文法G[S]拓广为文法G[S’]:(0)S’-B(1)B-i(2)B-iropi(3)B-(B)(4)B-NOTB(5)A-BAND(6)B-AB(7)O-BOR(8)B-OB由此得到布尔表达式的SLR(1)分析表如下:状态ACTIONGOTOirop()NOTANDOR#BAO0s1s4s513781s2r1r1r1r12s33r2r2r2r24s1s4s511785s1s4s56786r4s9s10r47s1s4s514788s1s4s515789r5r5r510r7r7r711s12s9s1012r3r3r3r313s9s10acc14r6s9s10r615R8s9s10r856.23程序语句的LR分析表:程序语句的文法G[S]如下S-ifethenSelseS|whileedoS|beginLend|aL-S;L|S由于在编译程序设计与实现中,我们是将赋值语句与算数表达式归为一类处理的,故在此将赋值语句仅看作是程序语句文法中一个终结符a,将布尔表达式B也看作为终结符e。将文法G[S]拓广为文法G[S’]:(0)S’-S(1)S-ifethenSelseS(2)S-whileedoS(3)S-beginLend(4)S-a(5)L-S(6)L-S;L由此得到程序语句的SLR(1)分析表如下:状态ACTIONGOTOifthenelsewhilebegindoenda;e#SL0s2s3s4s511acc2s63s74s2s3s4s5985r4r4r4r46s107s118s129r5s1310s2s3s4s51411s2s3s4s51512r3r3r3r313s2s3s4s591614s1715r2r2r2r216r617s2s3s4s51818r1r1r1r1词法分析:首先,扫描主函数,对构成源程序的字符串进行扫描和分解,识别出一个个单词符号。在扫描到6种关系运算符时,要特别的注意,例如扫描到“”时,要通过readch()函数再读入一个字符,如果是“=”则为“=”关系运算符,则赋予种别编码值。在扫描到终结运6算符时,按照种别表赋予对应的sy1。接着,通过for循环,将扫描到的单词符号的种别编码和具体的输出。最后,输出变量名表。语法分析:函数从二元式读入一个字符串,然后进行程序语句处理。最后通过一些的处理输出四元式分析结果。七.程序运行结果截图7.1词法分析结果77.2变量名表87.3状态栈加工过程及规约顺序97.4四元式分析结果10八.设计体会附源码:#includestdio.h#includestring.h#includestdlib.h#defineACC-2/**************************************/#definesy_if0#definesy_then1#definesy_else2#definesy_while3#definesy_begin4#definesy_do5#definesy_end6#definea7#definesemicolon8#definee9#definejinghao10#defineS11#defineL12#definetempsy15#defineEA18#defineE019#defineplus34#definesub35#definetimes36#definediv37#definebecomes38#defineop_and39#defineop_or40#defineop_not41#definerop42#definelparent48#definerparent49#defineident56#defineintconst57/********************************************/charch='\0';intcount=0;11staticcharspelling[10]={};staticcharline[81]={};char*pline;staticcharntab1[100][10];structntab{inttc;intfc;}ntab2[200];intlabel=0;structrwords{charsp[10];intsy;};structrwordsreswords[10]={{if,sy_if},{do,sy_do},{else,sy_else},{while,sy_while},{then,sy_then},{begin,sy_begin},{end,sy_end},{and,op_and},{or,op_or},{not,op_not}};structaa{intsy1;intpos;}buf[1000],n,n1,E,sstack[100],ibuf[100],stack[1000];structaaoth;structfourexp{charop[10];structaaarg1;structaaarg2;intresult;12}fexp[200];intssp=0;structaa*pbuf=buf;intnlength=0;intlnum=0;inttt1=0;FILE*cfile;/********************************************************/intnewt=0;intnxq=100;intlr;intlr1;intsp=0;intstack1[100];intsp1=0;intnum=0;structll{intnxq1;inttc1;intfc1;}labelmark[10];intlabeltemp[10];intpointmark=-1,pointtemp=-1;intsign=0;/********************程序语句的LR分析表********************/staticintaction[19][13]={{2,-1,-1,3,4,-1,-1,5,-1,-1,10,1,-1},{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,ACC,-1,-1},{-1,-1,-1,-1,-1,-1,-1,-1,-1,6,-1,-1,-1},{-1,-1,-1,-1,-1,-1,-1,-1,-1,7,-1,-1,-1},{2,-1,-1,3,4,-1,-1,5,-1,-1,-1,9,8},{-1,-1,104,-1,-1,-1,104,-1,104,-1,104,-1,-1},{-1,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},{-1,-1,-1,-1,-1,11,-1,-1,-1,-1,-1,-1,-1},{-1,-1,-1,-1,-1,-1,12,-1,-1,-1,-1,-1,-1},{-1,-1,-1,-1,-1,-1,105,-1,13,-1,-1,-1,-1},{2,