您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 编译原理实验 编译器 综合报告(附源代码)
编译原理编译器综合实验---------------工程精品神刀公子一.实验背景编译器就是将“一种语言(通常为高级语言)”翻译为“另一种语言(通常为低级语言)”的程序。一个现代编译器的主要工作流程:源代码(sourcecode)→预处理器(preprocessor)→编译器(compiler)→目标代码(objectcode)→链接器(Linker)→可执行程序(executables)高级计算机语言便于人编写,阅读交流,维护。机器语言是计算机能直接解读、运行的。编译器将汇编或高级计算机语言源程序(Sourceprogram)作为输入,翻译成目标语言(Targetlanguage)机器代码的等价程序。源代码一般为高级语言(High-levellanguage),如Pascal、C、C++、Java、汉语编程等或汇编语言,而目标则是机器语言的目标代码(Objectcode),有时也称作机器代码(Machinecode)。对于C#、VB等高级语言而言,此时编译器完成的功能是把源码(SourceCode)编译成通用中间语言(MSIL/CIL)的字节码(ByteCode)。最后运行的时候通过通用语言运行库的转换,编程最终可以被CPU直接计算的机器码(NativeCode)。二.算法设计典型的编译器输出是由包含入口点的名字和地址,以及外部调用(到不在这个目标文件中的函数调用)的机器代码所组成的目标文件。一组目标文件,不必是同一编译器产生,但使用的编译器必需采用同样的输出格式,可以链接在一起并生成可以由用户直接执行的EXE,词法分析程序语法分析程序语义分析程序编译器。不断完善,不断改进。渐变的过程。。。。函数。。。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);//生成四元式截图说明:综合输入:(赋值,循环,条件。。。结合,自己定义即可)源代码://************编译器********************////***Erin***//***软件工程0801班***//***HUST***////**************************************#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因子char*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();if(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);}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;case34: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;//记住if语句位置emit(0,if,num1,goto);nfc=nextq;//if中表达式为假emit(0,,,goto);//第一个0已回填backpatch(ntc,nextq);//ntc链接的所有四元式都回填nextq}if(syn==27)//)scanner();staBlock(&nChainTemp);//语句块*nChain=merge(nChainTemp,nfc);}}//循环语句::=do语句块while条件voidxunhuan(){charres[10],num1[10],num2[10],op[10];intnChainTemp;if(syn==8)//do{nnc=nextq;//记住if语句位置,emit之后nextq就变了//emit(0,if,num1,goto);scanner();staBlock(&nChainTemp);//语句块if(syn==9)//while{scanner();if(syn==26)//({scanner();strcpy(num1,E());if((syn=37)&&(syn=32)){switch(syn){case32:strcpy(op,);break;case33:strcpy(op,=);break;case34: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);nnb=nextq;emit(0,if,num1,goto);backpatch(nnb,nnc);nna=nextq;emit(0,,,goto);backpatch(nna,nextq);}if(syn==27)//)scanner();}}}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);}}}char*E()//Expression表达式{char*res,*num1,*op,*num2;res=(char*)malloc(10);num1=(char*)malloc(10);op=(char*)malloc(10);num2=(char*)malloc(10);strcpy(num1,T());while((syn==22)||(syn==23))//+-{if(syn==22)//+strcpy(op,+);elsestrcpy(op,-);scann
本文标题:编译原理实验 编译器 综合报告(附源代码)
链接地址:https://www.777doc.com/doc-4254589 .html