您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 编译原理课程设计报告-编译器
目录一、课设要求...........................................................................................................................2二、总体设计思想...................................................................................................................3三、详细算法设计...................................................................................................................3四、流程框图...........................................................................................................................4五、函数相关说明...................................................................................................................81.所有函数一览...................................................................................................................82.voidemit(char*res,char*num1,char*op,char*num2)..................................................83.char*newTemp()..............................................................................................................94.intmerge(intp1,intp2).....................................................................................................95.voidbackpatch(intp,intt)...............................................................................................106.voidfuzhi()......................................................................................................................107.voidtiaojian(int*nChain)................................................................................................118.voidxunhuan()................................................................................................................12六、程序运行结果.................................................................................................................14七、编译器使用说明.............................................................................................................16八、心得与体会.....................................................................................................................16九、源程序清单.....................................................................................................................17课设要求用C语言对下述文法和单词表定义的语言设计编制一个编译器。(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)语法结构定义程序::=main()语句块语句块::=‘{‘语句串’}’//程序用括号括起来语句串::=语句{;语句};语句::=赋值语句|条件语句|循环语句赋值语句::=ID=表达式//赋值语句用”=”号条件语句::=if条件语句块//条件怎么没有括号,囧(自己加1个)循环语句::=do语句块while条件条件::=表达式关系运算符表达式//没有布尔运算,还算简单表达式::=项{+项|-项}项::=因子{*因子|/因子}因子::=ID|num|(表达式)num::=(+|-|ε)数字*(.数字数字*|ε)(e(+|-|ε)数字数字*|ε)ID::=字母(字母|d数字)*字母::=a|b|c…|z|A|B|C…|Z数字::=0|1|2…|9关系运算符::=|=||=|==|!=一、总体设计思想采用递归下降(自上而下)的语法制导翻译法。二、详细算法设计在前两次试验的基础上改进。词法分析程序语法分析程序语义分析程序编译器。不断完善,不断改进。渐变的过程。三、流程框图图I主函数示意图是否为main?调用scanner是否为(?调用scanner是否为)?调用scanner调用语句块分析函数staBlock出错处理否否否是否为{?调用scanner调用语句串分析函数staString调用scanner是否为}?出错处理否否图II递归下降分析程序示意图图III语句块分析示意图调用语句分析函数sta回溯,调用backpatch是否为;?调用scanner调用语句分析函数sta否出错处理图IV语句串分析示意图调用赋值语句分析函数fuzhi是否为字符串?是否为if?调用条件语句分析函数tiaojian是否为do?调用循环语句分析函数xunhuan图V语句分析示意图四、函数相关说明1.所有函数一览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);//生成四元式2.voidemit(char*res,char*num1,char*op,char*num2)该函数的功能是生成一个三地址语句送到四元式表中。voidemit(char*res,char*num1,char*op,char*num2){strcpy(fourCom[q].result,res);strcpy(fourCom[q].arg1,num1);strcpy(fourCom[q].opera,op);strcpy(fourCom[q].arg2,num2);q++;}四元式表中的结构如下:struct{charresult[10];//字符串(字符数组)chararg1[10];//操作数1charopera[10];//运算符chararg2[10];//操作数2}fourCom[20];//结构体数组3.char*newTemp()该函数的功能是会动一个新的临时变量,临时变量名产生的顺序是T1,T2,T3,….char*newTemp(){char*p;charvarTemp[10];p=(char*)malloc(10);kk++;itoa(kk,varTemp,10);//整数转换为字符串strcpy(p+1,varTemp);p[0]='T';//字符串前加T,便于识别returnp;}4.intmerge(intp1,intp2)该函数的功能是将以P1,P2为链首的两条链合并成一条链,返回时的函数值作为合并后的链首。intmerge(intp1,intp2)//合并p1和p2{charcircle,nResult;if(p2==0)nResult=p1;else{nResult=circle=p2;while(atoi(fourCom[circle].result))//四元式第四个分量不为0{circle=atoi(fourCom[circle].result);//strcpy(fourCom[circle].result,p1);sprintf(fourCom[circle].result,%s,p1);}//目的是用p1的值覆盖0}returnnResult;//p2是头,p1覆盖0,接在p2后边}5.voidbackpatch(intp,intt)该函数的功能是把P所链接的每个四元式的第四区段(result段)都回填t。voidbackpatch(intp,intt){intw,circle=p;while(circle)//circle不为0的时候{w=atoi(fourCom[circle].result);//四元式circle第四分量内容//strcpy(fourCom[circle].result,t);//把t填进四元式circle的第四分量sprintf(fourCom[circle].result,%d,t);circle=w;//w记录的是链条上下一个四元式,移动!}return;}6.voidfuzhi()该函数的功能是对赋值语句进行分析。voidfuzhi()//赋值语句只有1个操作数{charres[10],num[10];//num操作数if(syn==10)//字符串{strcpy(res,token);//结果scanner();if(syn==21)//={scanner();strcpy(num,E());emit(res,num,=,);}else{printf(缺少=号\n);}}}7.voidtiaojian
本文标题:编译原理课程设计报告-编译器
链接地址:https://www.777doc.com/doc-2248133 .html