当前位置:文档之家› 编译原理课程设计----C语言编译器的实现

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

$编译原理课程设计报告设计题目编译代码生成器设计、学生姓名班级学号指导老师成绩`一、课程设计的目的编译原理课程兼有很强的理论性和实践性,是计算机专业的一门非常重要的专业基础课程,它在系统软件中占有十分重要的地位,是计算机专业学生的一门主修课。

为了让学生能够更好地掌握编译原理的基本理论和编译程序构造的基本方法和技巧,融会贯通本课程所学专业理论知识,提高他们的软件设计能力,特设定该课程的课程设计,通过设计一个简单的PASCAL语言(EL语言)的编译程序,提高学生设计程序的能力,加深对编译理论知识的理解与应用。

二、课程设计的要求1、明确课程设计任务,复习编译理论知识,查阅复印相关的编译资料。

2、按要求完成课程设计内容,课程设计报告要求文字和图表工整、思路清晰、算法正确。

3、@4、写出完整的算法框架。

5、编写完整的编译程序。

三、课程设计的内容课程设计是一项综合性实践环节,是对平时实验的一个补充,课程设计内容包括课程的主要理论知识,但由于编译的知识量较复杂而且综合性较强,因而对一个完整的编译程序不适合平时实验。

通过课程设计可以达到综合设计编译程序的目的。

本课程的课程设计要求学生编写一个完整的编译程序,包括词法分析器、语法分析器以及实现对简单程序设计语言中的逻辑运算表达式、算术运算表达式、赋值语句、IF语句、While语句以及do…while语句进行编译,并生成中间代码和直接生汇编指令的代码生成器。

四、总体设计方案及详细设计总体设计方案:1.总体模块【2.\详细设计:界面导入设计(1)一共三个选项:①choice 1--------cifafenxi②choice 2--------yufafenxi③choice 3--------zhongjiandaima(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;n<6;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) 词法分析的运行结果输入begin x:=1; y:=1+2;end #输出语法分析程序(1) 具体功能的具体设计!()---------------分析程序给出算术表达式文法,进行适当的文法变换输入——表达式;输出——表达式语法是否正确。

2.子程序的功能描述"(3) 语法分析的运行结果分析成功图分析失败图【中间代码生成程序(1)总体描述采用递归下降(自上而下)的语法制导翻译法。

在前两次试验的基础上改进。

词法分析程序语法分析程序语义分析程序编译器。

不断完善,不断改进。

渐变的过程。

.种别编码单词值单词符号main1int 2.float3double4char…5if 6else 7…8dowhile9l(l|d)*10;内部字符串( +|-|ε ) d*(.dd* | ε)( e ( +|-|ε )20二进制数值表示dd*|ε)=21+/22- 23* 24(25/(26)27'{28}29,#30;31>32|33>=<34<=35】==36!=37}(2)程序结构描述(3) 程序的功能描述从文件中读入表达式,输出其四元式的结果序列递归下降示意图[…】(4)详细功能描述void scanner(); int merge(int p1,int p2)该函数的功能是将以P1,P2为链首的两条链合并成一条链,返回时的函数值作为合并后的链首。

|void backpatch(int p,int t)该函数的功能是把P所链接的每个四元式的第四区段(result段)都回填t。

void fuzhi()该函数的功能是对赋值语句进行分析。

void tiaojian(int *nChain)该函数的功能是对条件语句进行分析。

void xunhuan()该函数的功能是对循环语句进行分析。

.(4) 结果演示图一简单语句生成四元式图二if语句的四元式生成?图三循环语句四元式生成(5)汇编生成if(strcmp(fourCom[i].opera,"=")==0){printf("Move AX,%1s\n",fourCom[i].arg1);printf("Move %5s,Ax\n",fourCom[i].result); <}if(strcmp(fourCom[i].opera,"+")==0){printf("Mov AX,%1s\n",fourCom[i].arg1);printf("ADD Ax,%1s\n",fourCom[i].arg2);printf("Mov %1s,Ax\n",fourCom[i].result);}、if(strcmp(fourCom[i].opera,"-")==0){printf("Mov AX,%1s\n",fourCom[i].arg1);printf("SUB Ax,%1s\n",fourCom[i].arg2);printf("Mov %1s,Ax\n",fourCom[i].result);}if(strcmp(fourCom[i].opera,"*")==0){。

printf("Mov AL,%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("Mov AX,%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("jmp L%1s\n",i);}结果演示<五、课程设计的体会与总结经过一个星期的编译原理课程设计,本人在陈宏建老师的指导下,顺利完成该课程设计。

通过该课程设计,收获颇多。

词法分析的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。

通过本试验的完成,更加加深了对词法分析原理的理解。

通过本次试验,了解了语法分析的运行过程,主程序大致流程为:“置初值”调用scaner函数读下一个单词符号调用IrParse结束。

递归下降分析的大致流程为:“先判断是否为begin”不是则“出错处理”,若是则“调用scaner函数”调用语句串分析函数“判断是否为end”不是则“出错处理”,若是则调用scaner函数“判断syn=0&&kk=0是否成立”成立则说明分析成功打印出来。

不成立则“出错处理”。

一、对实验原理有更深的理解通过该课程设计,掌握了什么是编译程序,编译程序工作的基本过程及其各阶段的基本任务,熟悉了编译程序总流程框图,了解了编译程序的生成过程、构造工具及其相关的技术对课本上的知识有了更深的理解,课本上的知识师机械的,表面的。

通过把该算法的内容,算法的执行顺序在计算机上实现,把原来以为很深奥的书本知识变的更为简单,对实验原理有更深的理解。

二、对该理论在实践中的应用有深刻的理解}通过把该算法的内容,算法的执行顺序在计算机上实现,知道和理解了该理论在计算机中是怎样执行的,对该理论在实践中的应用有深刻的理解。

三、激发了学习的积极性通过该课程设计,全面系统的理解了编译原理程序构造的一般原理和基本实现方法。

把死板的课本知识变得生动有趣,激发了学习的积极性。

把学过的计算机编译原理的知识强化,能够把课堂上学的知识通过自己设计的程序表示出来,加深了对理论知识的理解。

以前对与计算机操在这次课程设计中,我就是按照实验指导的思想来完成。

加深了理解文件系统的内部功能及内部实现,培养实践动手能力和程序开发能力的目的。

附录-----程序清单#include<>#include<>>#include<fstream>#include<iostream>using namespace std;#define MAX 100char inputstream[50]; esult); esult,t); esult,"%d",t);circle=w; esult)) esult);esult,p1);:sprintf(fourCom[circle].result,"%s",p1);}esult,res);strcpy(fourCom[nextq].arg1,num1);strcpy(fourCom[nextq].opera,op);strcpy(fourCom[nextq].arg2,num2);nextq++;}、void scanner(){sum=0;decimal=0;m=0;(for(n=0;n<8;n++)token[n]=NULL;ch=prog[p++];{isDecimal=1;ch=prog[p++];count=0; pera,fourCom[i].arg1,fourCom[i].arg2,fourCom[i].result); if(strcmp(fourCom[i].opera,"=")==0)>{printf("Move AX,%1s\n",fourCom[i].arg1);printf("Move %5s,Ax\n",fourCom[i].result);}if(strcmp(fourCom[i].opera,"+")==0){printf("Mov AX,%1s\n",fourCom[i].arg1);printf("ADD Ax,%1s\n",fourCom[i].arg2);~printf("Mov %1s,Ax\n",fourCom[i].result);}if(strcmp(fourCom[i].opera,"-")==0){printf("Mov AX,%1s\n",fourCom[i].arg1);printf("SUB Ax,%1s\n",fourCom[i].arg2);printf("Mov %1s,Ax\n",fourCom[i].result);~}if(strcmp(fourCom[i].opera,"*")==0){printf("Mov AL,%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("Mov AX,%1s\n",fourCom[i].arg1);printf("DIv %1s\n",fourCom[i].arg2);printf("Mov %1s,AL\n",fourCom[i].result);}if(strcmp(fourCom[i].arg2,"goto")==0&&strcmp(fourCom[i].arg1,"if")==0){)printf("cmp %1s\n",fourCom[i].opera);printf("jnc %1s\n",fourCom[i].result);}else{printf("jmp %1s\n",fourCom[i].result);}~}return;}void main(){ printf(" \n");printf(" \n");printf("##################################################################### \n");-printf(" choice 1--------cifafenxi\n");printf(" choice 2--------yufafenxi\n");printf(" choice 3--------zhongjiandaima\n\n");printf("##################################################################### \n");scanf("%d",&r1);do{switch(r1)《{case 1: cifafenxi();scanf("%d",&r1);break;case 2:yufafenxi() ;scanf("%d",&r1);break;case 3:zhongjiandaima();】scanf("%d",&r1);break;default: printf("error,please input again");break;}}while(r1!=0);;}cifafenxi(){p1=0;printf(" ------------------Welcome!!!(cifafenxi)-----------------");printf("\n please input a string(end with '#'):/n");do{scanf("%c",&ch1);【prog1[p1++]=ch1;}while(ch1!='#');p1=0;do{scaner1();switch(syn1){case 11:printf("( %-10d%5d )\n",sum1,syn1);break;\case -1:printf("you have input a wrong string\n");exit(0);default: printf("( %-10s%5d )\n",token1,syn1);break;}}while(syn1!=0);@}scaner1(){ sum1=0;for(m1=0;m1<8;m1++)token1[m1++]=NULL;ch1=prog1[p1++];m1=0;while((ch1==' ')||(ch1=='\n'))ch1=prog1[p1++];,if(((ch1<='z')&&(ch1>='a'))||((ch1<='Z')&&(ch1>='A'))){ while(((ch1<='z')&&(ch1>='a'))||((ch1<='Z')&&(ch1>='A'))||((ch1>='0')&&(ch1<= '9'))){token1[m1++]=ch1;ch1=prog1[p1++];}p1--;syn1=10;for(n1=0;n1<6;n1++)%if(strcmp(token1,rwtab1[n1])==0){ syn1=n1+1;break;}}else if((ch1>='0')&&(ch1<='9')){ while((ch1>='0')&&(ch1<='9')){ sum1=sum1*10+ch1-'0';|ch1=prog1[p1++];}p1--;syn1=11;}else switch(ch1){ case '<':token1[m1++]=ch1;ch1=prog1[p1++];》if(ch1=='='){ syn1=22;token1[m1++]=ch1; }else{ syn1=20;p1--;}¥break;case '>':token1[m1++]=ch1; ch1=prog1[p1++];if(ch1=='='){ syn1=24;token1[m1++]=ch1; }else?{ syn1=23;p1--;}break;case '+': token1[m1++]=ch1; ch1=prog1[p1++];if(ch1=='+'){ syn1=17;\token1[m1++]=ch1; }else{ syn1=13;p1--;}break;,case '-':token1[m1++]=ch1; ch1=prog1[p1++];if(ch1=='-'){ syn1=29;token1[m1++]=ch1; }else{ syn1=14;`p1--;}break;case '!':ch1=prog1[p1++]; if(ch1=='='){ syn1=21;token1[m1++]=ch1;—}else{ syn1=31;p1--;}break;case '=':token1[m1++]=ch1;:ch1=prog1[p1++];if(ch1=='='){ syn1=25;token1[m1++]=ch1; }else{ syn1=18;p1--;)}break;case '*': syn1=15;token1[m1++]=ch1;break;case '/': syn1=16;token1[m1++]=ch1;break;。

相关主题