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

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

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

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

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

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

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

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

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

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

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

四、总体设计方案及详细设计总体设计方案:1.总体模块2.表2.1 各种单词符号对应的种别码单词符号种别码单词符号种别码bgin 1 :17If 2 := 18Then 3 < 20wile 4 <> 21do 5 <= 22end 6 > 23 lettet(letter|digit)* 10 >= 24 dight dight* 11 = 25 + 13 ;26—14 ( 27* 15 ) 28/ 16 # 0 详细设计:4.1界面导入设计(1)一共三个选项:①choice 1--------cifafenxi②choice 2--------yufafenxi③choice 3--------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;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 #输出4.3语法分析程序(1) 具体功能的具体设计1.yufafenxi()---------------分析程序给出算术表达式文法,进行适当的文法变换输入——表达式;输出——表达式语法是否正确。

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

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

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

不断完善,不断改进。

渐变的过程。

单词符号及种别表(2)程序结构描述(3) 程序的功能描述从文件中读入表达式,输出其四元式的结果序列递归下降示意图是否为调用scanner是否为(?调用scanner是否为)?调用scanner调用语句块分析函数出错处理(4)详细功能描述void scanner(); //扫描void lrparser();void staBlock(int *nChain); //语句块void staString(int *nChain); //语句串void sta(int *nChain); //语句void fuzhi(); //赋值语句void tiaojian(int *nChain); //条件语句void xunhuan(); //循环语句char* E(); //Expresiion表达式char* T(); //Term项char* F(); //Factor因子char *newTemp(); //自动生成临时变量void backpatch(int p,int t); //回填int merge(int p1,int p2); //合并p1和p2void emit(char *res,char *num1,char *op,char *num2); //生成四元式void emit(char *res,char *num1,char *op,char *num2)该函数的功能是生成一个三地址语句送到四式表中char *newTemp()该函数的功能是会动一个新的临时变量,临时变量名产生的顺序是T1,T2,T3,….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是否成立”成立则说明分析成功打印出来。

相关主题