编译原理课程设计报告1课程设计报告设计题目:一个简单文法的编译器的设计与实现班级:计算机1206班组长学号:2012XXX组长姓名:XXX指导教师:XXX设计时间:2014年12月编译原理课程设计报告2设计分工组长学号及姓名:2012XXXXXX分工:1)读取源文件进行词法分析2)进行LL(1)分析生成分析表3)设计顶层自动机将源程序分段4)生成可执行的汇编程序组员1学号及姓名:2012XXXXXX分工:1)设计第二层自动机处理程序片段2)生成中间语言四元式3)源程序错误处理组员2学号及姓名:2012XXXXXX分工:1)设计第三层自动机处理复合表达式2)设计带动作的LL(1)文法3)源程序错误处理编译原理课程设计报告3摘要编译原理课程具有很强的理论性和实践性,是计算机专业的一门非常重要的专业基础课程,在系统软件中也是占有十分重要的地位。本次课程设计我们是在VisualC++的平台上应用了词法分析、语法分析、语义分析、中间语言生成以及目标语言生成的知识设计了一个简单的编译器前端。其中设计了一个简单的有限自动机来扫描源程序即进行语法分析,并生成了关键字表、标志符表、界符表、常数表和Token串;设计了一个LL(1)文法和一个带动作的文法来实现语法分析,并生成了Select集和LL(1)分析表;采用了四元式序列的设计来生成中间语言;通过汇编语言设计来生成目标语言。最后为了使该编译器更加完善,我们设计了简单的的错误检查机制,能够对源程序进行比较全面的错误检查同时也能够指出错误出现的大致位置,增强了该编译器的健壮性。关键字:编译器,前端,有限自动机,LL(1)文法,汇编语言,错误处理编译原理课程设计报告4目录摘要..............................................................31、概述..............................................................52、课程设计任务及要求................................................52.1设计任务........................................................52.2设计要求........................................................63、算法与数据结构....................................................63.1词法分析器的算法................................................63.2语法分析器的算法..............................................123.2.1LL(1)文法设计算法........................................123.2.2递归下降子程序设计算法....................................193.3中间语言生成器算法.............................................203.4处理复合表达式算法.............................................243.5目标语言生成器算法............................................303.6数据结构......................................................394、程序设计与实现...................................................394.1编译程序设计与实现.............................................394.2程序实验结果..................................................394.2.1待测源程序................................................394.2.2词法分析结果..............................................404.2.3语法分析结果..............................................414.2.4中间语言生成结果..........................................424.2.5目标语言生成结果..........................................434.2.6程序错误处理结果..........................................445、参考文献.........................................................44编译原理课程设计报告51、概述本次课程设计的编译程序主要包括了词法分析器、语法分析器、中间代码生成器和目标代码生成器四部分,编译程序的输出结果包括了词法分析后的关键字表、界符表、标识符表和Token串,语法分析后的Select集和LL(1)分析表;中间代码生成器产生的四元式序列。最后除了完成设计所要求的内容之外,我们还做了一些扩展例如:设计了目标代码生成器来生成可执行的汇编程序;还设计了错误检查机制来查找源程序的错误并指出错误产生的大致位置。词法分析是编译程序的第一步操作,它的任务是:从左至右扫描源程序的字符串,按照一定的词法规则识别出一个个正确的字符,并转换成该字符相对应的Token码,最终生成一个完整的Token串以供语法分析使用。由此可知,词法分析是整个编译程序的基础,而执行词法分析的一系列操作的就是词法分析器。语法分析是编译程序的第二步操作也是编译程序的核心部分,其主要任务是:分析语法内容,确定语法结构同时生成Select集和LL(1)分析表。中间代码和目标代码的生成是对源程序的进一步操作,其任务是:根据词法分析产生的Token串和语法分析确定的语法结构来生成中间语言——四元式和目标语言——汇编语言程序。2、课程设计任务及要求2.1设计任务一个简单文法的编译器前端的设计与实现定义一个简单程序设计语言文法(包括变量说明语句、算术运算表达式、赋值语句;扩展包括逻辑运算表达式、If语句、While语句等);扫描器设计实现;语法分析器设计实现;中间代码设计;编译原理课程设计报告6中间代码生成器设计实现。目标代码生成器设计实现2.2设计要求给出一个源程序文件,作为编译器前端的输入输出相关编译阶段的运行结果词法分析阶段:生成Token序列;生成关键字表、界符表、符号表系统。中间代码生成阶段:生成四元式序列;生成符号表系统。3、算法与数据结构3.1词法分析器的算法1)一个简单有限自动机(扫描器)的设计:d其中:⑴ℓ(字母),d(数字),#(源程序结束符)(2)?(空格,回车,换行)需要滤掉(3)≮(泛指单词的后继附)(4)……(表示省略了其他界符的处理)2)一个简单词法分析器设计:①②③④⑤n?ℓℓd≮-dd.dd≮---≮≮⑥⑦==≮-…#-编译原理课程设计报告7算法实现如下:Voidmain(){//词法分析部分代码charp[10];stringTOKEN;stringSource;stringtemp;FILE*fp;fp=fopen(D:\\MySourceFile.txt,r);if(!fp)Source=Cannotopenfile;else{inti;charc;while(!feof(fp)){c=fgetc(fp);Source+=c;}fclose(fp);for(i=0;iSource.size();i++){if(Source[i]==13||Source[i]==9||Source[i]==10||Source[i]==-1){Source.replace(i,1,);}开始结束调用识别器关键字/标识符算术常数结束符#查KT表查到查填IT表查填CT表常数处理C.TOKEN查PT表P.TOKENI.TOKENK.TOKENyn查到ere:非法界符ynyynnny编译原理课程设计报告8}}Source+='#';cout处理后源程序\nSourceendlendl;initKTPT();inti,j;for(i=0;iSource.size();i++){switch(kindofchar(Source[i])){case'e':{cout\n非法字符!,位置:i错误代码Source[i]endlendl;for(intk=0;k=i;k++)coutSource[k];exit(0);}case's':break;case'd':{temp+=Source[i];for(j=1;Source[i+j]=='.'||kindofchar(Source[i+j])=='d';j++)temp+=Source[i+j];i=i+j-1;if(inCT(temp)==-1){temp=N+temp;CT.push_back(temp);}TOKEN+=CT,;itoa(inCT(temp),p,10);TOKEN+=p;TOKEN+=;temp=;break;}case'w':{temp+=Source[i];for(j=1;kindofchar(Source[i+j])=='w'||kindofchar(Source[i+j])=='d'||Source[i+j]=='_';j++)temp+=Source[i+j];编译原理课程设计报告9i=i+j-1;if(inKT(temp)!=-1){TOKEN+=KT,;itoa(inKT(temp),p,10);TOKEN+=p;TOKEN+=;temp=;break;}if(inIT(temp)==-1)IT.push_back(temp);TOKEN+=IT,;itoa(inIT(temp),p,10);TOKEN+=p;TOKEN+=;temp=;break;}case'f':{temp+=Source[i];if(kindofchar(Source[i+1])=='f'&&inPT(temp+Source[i+1])=0){temp+=Source[i+1];i++;}TOKEN+=PT,;itoa(inPT(temp),p,10);TOKEN+=p;TOKEN+=;temp=;break;}case'\':{i++;for(j=0;Source[i+j]!='\'&&(i+j)(Source.size()-1);j++){if(Source[i+j]=='\\'&&Source[i+j+1]=='\'){temp+='\';编译原理课程设计报告10j++;}if(Source[i+j]=='\\'&&Source[i+j+1]=='\''){temp+='\'';j++;}if(Source[i+j]=='\\'&&Source[i+j+1]=='\\'){temp+='\\';j++;}if(Source[i+j]=='\\'&&Source[i+j+1]=='\0'){temp+='\0';j++;}elsetemp+=Source[i+j];}if((i+j)=(Source.size()-1)){cout未找到可匹配的双引号,位置:iendl;for(intk=0;k=i;k++)coutSource[k];exit(0);}i=i+j;if(inCT(temp)==-1){tem