编译原理课程设计----C语言编译器的实现

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

编译原理课程设计报告设计题目编译代码生成器设计学生姓名班级学号指导老师成绩一、课程设计的目的编译原理课程兼有很强的理论性和实践性,是计算机专业的一门非常重要的专业基础课程,它在系统软件中占有十分重要的地位,是计算机专业学生的一门主修课。为了让学生能够更好地掌握编译原理的基本理论和编译程序构造的基本方法和技巧,融会贯通本课程所学专业理论知识,提高他们的软件设计能力,特设定该课程的课程设计,通过设计一个简单的PASCAL语言(EL语言)的编译程序,提高学生设计程序的能力,加深对编译理论知识的理解与应用。二、课程设计的要求1、明确课程设计任务,复习编译理论知识,查阅复印相关的编译资料。2、按要求完成课程设计内容,课程设计报告要求文字和图表工整、思路清晰、算法正确。3、写出完整的算法框架。4、编写完整的编译程序。三、课程设计的内容课程设计是一项综合性实践环节,是对平时实验的一个补充,课程设计内容包括课程的主要理论知识,但由于编译的知识量较复杂而且综合性较强,因而对一个完整的编译程序不适合平时实验。通过课程设计可以达到综合设计编译程序的目的。本课程的课程设计要求学生编写一个完整的编译程序,包括词法分析器、语法分析器以及实现对简单程序设计语言中的逻辑运算表达式、算术运算表达式、赋值语句、IF语句、While语句以及do…while语句进行编译,并生成中间代码和直接生汇编指令的代码生成器。四、总体设计方案及详细设计总体设计方案:1.总体模块主程序词法分析程序语法分析程序中间代码生成程序2.表2.1各种单词符号对应的种别码单词符号种别码单词符号种别码bgin1:17If2:=18Then320wile421do5=22end623lettet(letter|digit)*10=24dightdight*11=25+13;26—14(27*15)28/16#0详细设计:4.1界面导入设计(1)一共三个选项:①choice1--------cifafenxi②choice2--------yufafenxi③choice3--------zhongjiandaima(2)界面演示图一图二图三4.2词法分析程序(1)流程图设计(2)具体功能的具体设计1、cifafenxi()首先设置prog[n]来接收输入的语句,以‘#’来结束;调用扫描子程序scaner1(),每一次得到一个类型码;用switch判别相应输出;直到syn1=0为止。2、扫描子程序scaner1()-----------------扫描输入的语句首先设置3个变量:①token1用来存放构成单词符号的字符串;②sum1用来存放整型单词;③syn1用来存放单词符号的类型码。有关scaner1()中关键点解析:①while((ch=='')||(ch=='\n'))ch=prog[p++];;忽略空格②if(((ch='z')&&(ch='a'))||((ch='Z')&&(ch='A'))){while(((ch='z')&&(ch='a'))||((ch='Z')&&(ch='A'))||((ch='0')&&(ch='9'))){token[m++]=ch;置初值调用扫描子程序输出单词二元组输入串结束结束否是ch=prog[p++];};判别标识符③for(n=0;n6;n++)if(strcmp(token,rwtab[n])==0){syn=n+1;break;};标识符是否是关键字④if((ch='0')&&(ch='9')){while((ch='0')&&(ch='9')){sum=sum*10+ch-'0';ch=prog[p++];}};判别整数(3)词法分析的运行结果输入beginx:=1;y:=1+2;end#输出4.3语法分析程序(1)具体功能的具体设计1.yufafenxi()---------------分析程序给出算术表达式文法,进行适当的文法变换输入——表达式;输出——表达式语法是否正确。2.子程序的功能描述(3)语法分析的运行结果分析成功图分析失败图4.4中间代码生成程序(1)总体描述采用递归下降(自上而下)的语法制导翻译法。在前两次试验的基础上改进。词法分析程序语法分析程序语义分析程序编译器。不断完善,不断改进。渐变的过程。单词符号及种别表单词符号种别编码单词值main1int2float3double4char5if6else7do8while9l(l|d)*10内部字符串(+|-|ε)d*(.dd*|ε)(e(+|-|ε)dd*|ε)20二进制数值表示=21+22-23*24/25(26)27{28}29,30;3132=3334=35==36!=37(2)程序结构描述(3)程序的功能描述从文件中读入表达式,输出其四元式的结果序列递归下降示意图是否为main?调用scanner是否为(?调用scanner是否为)?调用scanner调用语句块分析函数staBlock出错处理(4)详细功能描述voidscanner();//扫描voidlrparser();voidstaBlock(int*nChain);//语句块voidstaString(int*nChain);//语句串voidsta(int*nChain);//语句voidfuzhi();//赋值语句voidtiaojian(int*nChain);//条件语句voidxunhuan();//循环语句char*E();//Expresiion表达式char*T();//Term项char*F();//Factor因子char*newTemp();//自动生成临时变量voidbackpatch(intp,intt);//回填intmerge(intp1,intp2);//合并p1和p2voidemit(char*res,char*num1,char*op,char*num2);//生成四元式voidemit(char*res,char*num1,char*op,char*num2)该函数的功能是生成一个三地址语句送到四式表中char*newTemp()该函数的功能是会动一个新的临时变量,临时变量名产生的顺序是T1,T2,T3,….intmerge(intp1,intp2)该函数的功能是将以P1,P2为链首的两条链合并成一条链,返回时的函数值作为合并后的链首。voidbackpatch(intp,intt)该函数的功能是把P所链接的每个四元式的第四区段(result段)都回填t。voidfuzhi()该函数的功能是对赋值语句进行分析。voidtiaojian(int*nChain)该函数的功能是对条件语句进行分析。voidxunhuan()该函数的功能是对循环语句进行分析。(4)结果演示图一简单语句生成四元式图二if语句的四元式生成图三循环语句四元式生成(5)汇编生成if(strcmp(fourCom[i].opera,=)==0){printf(MoveAX,%1s\n,fourCom[i].arg1);printf(Move%5s,Ax\n,fourCom[i].result);}if(strcmp(fourCom[i].opera,+)==0){printf(MovAX,%1s\n,fourCom[i].arg1);printf(ADDAx,%1s\n,fourCom[i].arg2);printf(Mov%1s,Ax\n,fourCom[i].result);}if(strcmp(fourCom[i].opera,-)==0){printf(MovAX,%1s\n,fourCom[i].arg1);printf(SUBAx,%1s\n,fourCom[i].arg2);printf(Mov%1s,Ax\n,fourCom[i].result);}if(strcmp(fourCom[i].opera,*)==0){printf(MovAL,%1s\n,fourCom[i].arg1);printf(MUL%1s\n,fourCom[i].arg2);printf(Mov%1s,Ax\n,fourCom[i].result);}if(strcmp(fourCom[i].opera,/)==0){printf(MovAX,%1s\n,fourCom[i].arg1);printf(DIv%1s\n,fourCom[i].arg2);printf(Mov%1s,AL\n,fourCom[i].result);}if(strcmp(fourCom[i].opera,goto)==0){printf(jmpL%1s\n,i);}结果演示五、课程设计的体会与总结经过一个星期的编译原理课程设计,本人在陈宏建老师的指导下,顺利完成该课程设计。通过该课程设计,收获颇多。词法分析的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。通过本试验的完成,更加加深了对词法分析原理的理解。通过本次试验,了解了语法分析的运行过程,主程序大致流程为:“置初值”调用scaner函数读下一个单词符号调用IrParse结束。递归下降分析的大致流程为:“先判断是否为begin”不是则“出错处理”,若是则“调用scaner函数”调用语句串分析函数“判断是否为end”不是则“出错处理”,若是则调用scaner函数“判断syn=0&&kk=0是否成立”成立则说明分析成功打印出来。不成立则“出错处理”。一、对实验原理有更深的理解通过该课程设计,掌握了什么是编译程序,编译程序工作的基本过程及其各阶段的基本任务,熟悉了编译程序总流程框图,了解了编译程序的生成过程、构造工具及其相关的技术对课本上的知识有了更深的理解,课本上的知识师机械的,表面的。通过把该算法的内容,算法的执行顺序在计算机上实现,把原来以为很深奥的书本知识变的更为简单,对实验原理有更深的理解。二、对该理论在实践中的应用有深刻的理解通过把该算法的内容,算法的执行顺序在计算机上实现,知道和理解了该理论在计算机中是怎样执行的,对该理论在实践中的应用有深刻的理解。三、激发了学习的积极性通过该课程设计,全面系统的理解了编译原理程序构造的一般原理和基本实现方法。把死板的课本知识变得生动有趣,激发了学习的积极性。把学过的计算机编译原理的知识强化,能够把课堂上学的知识通过自己设计的程序表示出来,加深了对理论知识的理解。以前对与计算机操在这次课程设计中,我就是按照实验指导的思想来完成。加深了理解文件系统的内部功能及内部实现,培养实践动手能力和程序开发能力的目的。附录-----程序清单#includemath.h#includestdlib.h#includefstream#includeiostreamusingnamespacestd;#defineMAX100charinputstream[50];//存储输入句子inttemp1=0;//数组下标intright1;//判断输出信息intm2=0,sum2=0;//sum用于计算运算符的个数//m用于标记输入表达式中字符的个数charJG='A';charstr[MAX];//用于存输入表达式inttokene=0;//左括号的标志charprog1[80],token1[8],ch1;intsyn1,p1,m1,n1,sum1;char*rwtab1[6]={begin,if,then,while,do,end};intr1;charprog[80];//存放所有输入字符chartoken[8];//存放词组charch;//单个字符intsyn,p,m,n,i;//syn:种别编码doublesum;intcount;intisSignal;//是否带正负号(0不带,1负号,2正号)intisError;intisDecimal;//是否是小数doub

1 / 33
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功