您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 编译原理-简单编译器课程设计报告
信息科学与工程学院课程设计任务书题目:一个简单编译器的设计与分析姓名:学号:专业班级:课程:编译原理指导教师:职称:讲师完成时间:2011年12月----2011年12月枣庄学院信息科学与工程学院制2011年12月20日1课程设计任务书及成绩评定课程设计的任务和具体要求在理解编译原理相关理论的基础上,要求用C或C++语言描述及上机调试,实现一个小编译器(包括符号表的构造,词法分析,语法分析,语义分析,目标代码生成等重要子程序,其中词法分析、语法分析及语义分析功能必须完成),使学生将理论与实际应用结合起来,受到软件设计等开发过程的全面训练,从而提高学生软件开发的能力。指导教师签字:_______日期:指导教师评语成绩:____________指导教师签字:日期:2课程设计所需软件、硬件等硬件环境:WindowsXP/Win7操作系统软件环境:MicrosoftvisualC++6.0课程设计进度计划起至日期工作内容备注2011-12-01—052011-12-06—102011-12-11—16查找资料理清思路,编写程序完善程序,编辑文档参考文献、资料索引序号文献、资料名称编著者出版单位【1】程序设计语言编译原理陈火旺李春林国防工业出版社【2】数据结构严蔚敏清华大学出版社【3】C++程序设计吴乃林况迎辉高等教育出版社【4】C语言程序设计谭浩强清华大学出版社【5】程序设计语言编译原理陈火旺、刘春林等国防工业出版社3目录一、摘要………………………………………………………………………错误!未定义书签。二、总体设计方案及主要设计原理…………………………………………错误!未定义书签。1、单词符号及种别表…………………………………………………错误!未定义书签。2、语法结构定义………………………………………………………错误!未定义书签。3、主要算法……………………………………………………………错误!未定义书签。(1)词法分析主要算法…………………………………………错误!未定义书签。(2)语法分析主要思想…………………………………………错误!未定义书签。(3)语义分析主要算法…………………………………………错误!未定义书签。三、源程序代码………………………………………………………………错误!未定义书签。四、测试及分析………………………………………………………………错误!未定义书签。五、心得体会…………………………………………………………………错误!未定义书签。4一、摘要编译程序的工作过程一般可以分为五个阶段:词法分析、语法分析、语义分析与中间代码产生、优化、目标代码生成。每一个阶段在功能上是相对独立的,它一方面从上一个阶段获取分析的结果来进行分析,另一方面由将结果传递给下一个阶段。由编译程序的五个阶段就对应了编译系统的结构。其中词法分析器利用超前搜索、状态转换等方法,将源程序转化成为一个一个的单词符号二元式。一般程序语言的单词符号包括关键字、运算符、常数、标识符和界符。语法分析器将这些单词符号作为输入,对它进行语法分析。语法分析分为两种方法:自上而下分析法和自下而上分析法。针对不同程序语言的语法规则可以采取不同的分析方法,当然两种方法也可以同时使用。语法分析器把语法单元作为输入供语义分析器使用。一般的语义分析器主要采用的是语法制导方法,即在语法分析的同时进行语法分析,并产生一定的语义动作,来生成中间代码。上面三个过程可以与硬件无关,而接下来的优化器和目标代码生成器是针对某一种处理器而言的。代码优化是将语义分析生成的中间代码进行优化,产生执行效率更高的代5码。目标代码生成器最终生成可以在某种机器上运行的机器语言或者汇编语言。在整个编译过程中还包括对表格的操作和对错误的处理,这些也都是非常重要的环节。6下图给出了编译系统的结构框图二、总体设计方案及主要设计原理2.1、单词符号及种别表示表格管理出错处理单词符号语法单元中间代码中间代码目标代码语法分析器语义分析与中间代码生成器优化器目标代码生成器词法分析器7单词符号种别编码单词值main1int2float3double4char5if6else7do8while9l(l|d)*10内部字符串(+|-|ε)d*(.dd*|ε)(e(+|-|ε)dd*|ε)20二进制数值表示=21+22-23*24/25(26)27{28}29,30;3132=3334=35==36!=372.2、语法结构定义程序::=main()语句块8语句块::=‘{‘语句串’}’//程序用括号括起来语句串::=语句{;语句};语句::=赋值语句|条件语句|循环语句赋值语句::=ID=表达式//赋值语句用”=”号条件语句::=if条件语句块//条件怎么没有括号,囧(自己加1个)循环语句::=do语句块while条件条件::=表达式关系运算符表达式表达式::=项{+项|-项}项::=因子{*因子|/因子}因子::=ID|num|(表达式)num::=(+|-|ε)数字*(.数字数字*|ε)(e(+|-|ε)数字数字*|ε)ID::=字母(字母|d数字)*字母::=a|b|c…|z|A|B|C…|Z数字::=0|1|2…|9关系运算符::=|=||=|==|!=2.3、主要算法2.3.1、词法分析主要算法这部分对源文件进行分析,允许/**/注释。从源文件依次读取字符,对字符进行分析,组成字符串、数字、关系符等固定含义的token符,并把它们添加到token链中,如果遇到非法字符报错并退出程序。2.3.2、语法分析主要思想这部分对Token链进行分析,利用自底向上的分析方法,构建SLR(1)分析表的过程是手工完成的。语法分析的同时构建语法树,移进时创建叶子,规约时创建节点。2.3.3、语义分析主要分析这部分对语法树从左到右进行遍历,节点记录了规约式的编号,遍历到节点时就进行相应处理。语义分析主要检查变量、函数是否被定义或重定义,同时产生四元式。三、源程序代码9#includestdio.h#includestring.h#includemath.h#includestdlib.hcharprog[80];//存放所有输入字符chartoken[8];//存放词组charch;//单个字符intsyn,p,m,n,i;//syn:种别编码doublesum;intcount;intisSignal;//是否带正负号(0不带,1负号,2正号)intisError;intisDecimal;//是否是小数doubledecimal;//小数intisExp;//是否是指数intindex;//指数幂intisNegative;//是否带负号doubletemp;inttemp2;intrepeat;//是否连续出现+,-intnextq;intkk;//临时变量的标号intntc,nfc,nnc,nnb,nna;char*rwtab[9]={main,int,float,double,char,if,else,do,while};struct{charresult[10];//字符串(字符数组)chararg1[10];charopera[10];chararg2[10];}fourCom[20];//结构体数组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因子10char*newTemp();//自动生成临时变量voidbackpatch(intp,intt);//回填intmerge(intp1,intp2);//合并p1和p2voidemit(char*res,char*num1,char*op,char*num2);//生成四元式voidmain(){p=0;count=0;isDecimal=0;index=0;repeat=0;kk=0;printf(\nPleaseinputyoursourcestring:\n);do{ch=getchar();prog[p++]=ch;}while(ch!='#');p=0;isError=0;scanner();lrparser();for(i=1;inextq;i++)//循环输出四元式{printf(\n%d\t,i);printf((%5s%5s%5s\t%5s)\n,fourCom[i].arg1,fourCom[i].opera,fourCom[i].arg2,fourCom[i].result);}}voidlrparser(){intnChain;nfc=ntc=1;nextq=1;if(syn==1)//main{scanner();if(syn==26)//({scanner();11if(syn==27)//){scanner();staBlock(&nChain);}elseprintf(缺少右括号\n);}elseprintf(缺少左括号\n);}elseprintf(缺少main\n);}//语句块::='{'语句串'}'voidstaBlock(int*nChain)//语句块{if(syn==28)//{{scanner();staString(nChain);//backpatch(*nChain,nextq);if(syn==29)//}scanner();//读下一个elseprintf(缺少}号\n);}elseprintf(缺少{号\n);}//语句串::=语句{;语句};voidstaString(int*nChain)//语句串{sta(nChain);backpatch(*nChain,nextq);while(syn==31)//;{scanner();sta(nChain);}//backpatch(*nChain,nextq-1);12}voidsta(int*nChain)//语句{if(syn==10){fuzhi();//*nChain=0;}elseif(syn==6)//if{tiaojian(nChain);}elseif(syn==8)//doxunhuan();}//条件语句-if(条件)语句块voidtiaojian(int*nChain){charres[10],num1[10],num2[10],op[10];intnChainTemp;//条件-表达式关系运算符表达式if(syn==6)//if{scanner();//strcpy(num1,E());if(syn==26)//({scanner();strcpy(num1,E());if((syn=37)&&(syn=32)){switch(syn){case32:strcpy(op,);break;case33:strcpy(op,=);break;13case34:strcpy(op,);break;case35:strcpy(op,=);break;case36:strcpy(op,==);break;case37:strcpy(op,!=);break;default:printf(error);}}scanner();strcpy(num2,E());strcat(num1,op);strcat(num1,num2);//nfc=nextq+1;ntc=nextq;//记
本文标题:编译原理-简单编译器课程设计报告
链接地址:https://www.777doc.com/doc-2307877 .html