您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 数据库 > 山东理工大学编译原理作业
《编译原理》期末大作业班级:计科1101姓名:张旭学号:1111051119班内序号:22时间:2013/6/261、实验内容某程序设计语言子集编译器的设计与实现,包括词法分析、语法分析、语义分析和目标代码生成的设计与实现。2、实验目的(1)理解编译器的工作机制(2)掌握编译器的构造方法3、所实现语言的完整文法程序——main()主程序主程序——{主程序体}主程序体——变量声明语句表变量声明——类型符标示符标示符表;语句表——空|语句;语句表类型符——int标示符——字母标示符表——,标示符标示符表|空语句——cin(标示符);|out(标示符);|if(条件)语句;|while(条件)语句;|标示符=赋值语句;赋值语句——标示符算数运算符标示符2标示符2——字母条件——标示符关系运算符标示符2算数运算符——+|-|*|/字母——a|b|c|d.........y|z关系运算符——||==4、总体设计5、详细设计5.1词法分析单词分类表:1)关键字:mainintcincoutifwhile2)字母:a|b|c|d.........y|z3)算术运算符:+—*/=5)界符:{}(),;符号表:1关键字:main2界符:(2界符:)3界符:{4关键字:int……词法分析框图:词法分析运行界面:5.2语法分析文法:A——main()BB——{E}E——FGF——HRJ;G——空|KGH——intR——PJ——,RJ|空K——cin(R);|out(R);|if(N)K;|while(N)K;|R=L;L——ROMM——PN——RQMO——+|-|*|/P——a|b|c|d.........y|zQ——||==First集、Follow集:非终First集Follow集结符AMain()#B{#Eint}FintCin,out,if,while,a,b....GCin,out,if,while,a,b...^}Hinta,b,c....Ra,b,c,d......,^,)J,^;KCin(,out(,if(,while(;cin,out,if,whileLa,b,c.....;Ma,b,c....;Na,b,c......)O+,-,*,/a,b,c,d......Pa,b,c......;Q,,==;预测分析表:Main{inta……(A→main()B→main()BB{E}E→FGF→HRG;GH→intR→P→F;EJ→LK→cin(R);....LMNOPQ→DCD2→B语法分析框图:,Cin,out....+*......#ABEFGHRJ→RJ|^K→cin(R).....LMMO→+|-....PQ→...语法分析运行界面:(包含while语句:)5.3语义分析实现目标:对每一个赋值表达式,判断运算符的优先级,然后输出四元式。输出形式:例如,输入a=b+(c-d)*e+f/g*(h-i+j/(k+l*m-n))将会输出(1)(-,c,d,t1)(2)(*,t1,e,t2)(3)(+,b,t2,t3)(4)(/,f,g,t4)(5)(-,h,i,t5)(6)(*,l,m,t6)(7)(+,k,t6,t7)(8)(-,t7,n,t8)(9)(/,j,t8,t9)(10)(+,t5,t9,t10)(11)(*,t4,t10,t11)(12)(+,t3,t11,t12)(13)(=,t12,-,a)语义分析步骤:1)检查输入的元素;2)如果是一个操作数,则进栈;3)如果是操作符,则如果符号栈不为空或者此操作符的优先级大于符号栈栈顶的优先级,则将此运算符压栈;如果符号栈不为空或者此操作符的优先级小于符号栈栈顶的优先级,栈顶操作符出栈并进行相应的操作;4)假定输入完毕,栈中剩余的所有操作符出栈并进行相应操作。运行结果:5.4目标代码生成实现目标:根据语义分析程序的运行结果,将中间代码程序段翻译成汇编语言目标代码输出形式:例:在语义分析中输入:a=b+c*d-e/f在代码生成选项中就会输出:0:MOVR1,c1:MULR1,d2:STR1,t13:MOVR0,b4:ADDR0,t15:MOVt2,R0……运行结果:6、实现源代码#includestdio.h#includestdlib.h#includeconio.h#includectype.h#includestring.h/**词法分析定义的变量和函数**/charsave[20];/*定义暂存函数*/char*p;charcount[200];intCFtotal=1;char*keyword[6]={int,if,main,cin,while,cout};//定义内容关键字char*yunsuanfu[8]={+,-,*,/,==,,,=};//定义运算符char*jiefu[6]={(,),{,},,,;};//定义界符voidalpha();/**词法定义完**//**语法定义变量和函数**/charYFshuru[100],YFtuidao[600],b[100],e[100],ch,*st;intYFtotal=0,flag=0,n1,i1,n=9,t1=0;//t1记录推导式i1记录输入式intA();intB();intE();intF();intG();intH();intJ();intK();intL();intM();intN();intO();intP();intQ();intR();voidinput();voidinput1();voidoutput();/**语法定义完**//**四元式定义**/charw;intYYj=1;structTOKEN{chart;inti;};structTOKENword,sem[10];inti_sem;structQT{charw;structTOKENword1;structTOKENword2;structTOKENtemp;};charYYshuru[50];intYYi=0;structQTqt[30];intYYq=0;intYYD();intYYE();intYYT();intYYF();voidquat(char);/**四元式定义完**//**目标代码定义**/voidoutdaima();/**目标代码定义完**/intmain(){inti,j;intf,g;charx;CFtotal=1;/*计数器等于一*/printf(+++++++++++++++++++++++++\n);printf(++\n);printf(++\n);printf(+编译词法分析+\n);printf(++\n);printf(++\n);printf(+++++++++++++++++++++++++\n);strcpy(count,main()\n{\ninta,b;\ncin(a);while(ab)a=a+b;\n});printf(Thesourceprogramis:\n);puts(count);printf(\n);p=count;while(*p!='\0')/*检查源程序是否结束*/{memset(save,0,20);while(*p==''||*p=='\n'||*p=='\t')p++;/*检查是否是空白字符,如果是直接跳过*/if(isalpha(*p))alpha();/*识别关键字或标识符*/elseif(*p=='='){p++;if(*p=='=')printf(%d\t关系运算符\t%s\n,CFtotal,==);/*识别==*/else{printf(%d\t算数运算符\t%s\n,CFtotal,=);/*识别=*/p--;/*回退多读进字符*/}}elseif(*p=='+')printf(%d\t算数运算符\t%c\n,CFtotal,*p);elseif(*p=='-')printf(%d\t算数运算符\t%c\n,CFtotal,*p);elseif(*p=='*')printf(%d\t算数运算符\t%c\n,CFtotal,*p);elseif(*p=='/')printf(%d\t算数运算符\t%c\n,CFtotal,*p);elseif(*p==''){printf(%d\t关系运算符\t%s\n,CFtotal,);/*识别*/}elseif(*p==''){printf(%d\t关系运算符\t%s\n,CFtotal,);/*识别*/}elseif(*p==';')printf(%d\t界符\t%c\n,CFtotal,*p);elseif(*p==',')printf(%d\t界符\t%c\n,CFtotal,*p);elseif(*p=='(')printf(%d\t界符\t%c\n,CFtotal,*p);elseif(*p==')')printf(%d\t界符\t%c\n,CFtotal,*p);elseif(*p=='{')printf(%d\t界符\t%c\n,CFtotal,*p);elseif(*p=='}')printf(%d\t界符\t%c\n,CFtotal,*p);CFtotal=CFtotal+1;p++;/*准备识别下一个单词*/}printf(\n按任意键转入语法分析。。。。。\n);getch();printf(+++++++++++++++++++++++++\n);printf(++\n);printf(++\n);printf(+编译语法分析+\n);printf(++\n);printf(++\n);printf(+++++++++++++++++++++++++\n);printf(输入的字符串为\n);strcpy(YFshuru,main(){inta,b;cin(a);while(ab)a=c+b;}#);puts(YFshuru);printf(\n);n1=strlen(YFshuru);ch=b[0]=YFshuru[0];printf(步骤\t文法\t\t分析字符\t剩余串\n);f=A();if(f==0)return0;if(ch=='#'){printf(Accept\n);g=0;x=YFtuidao[g];while(x!='#'){printf(%c,x);g=g+1;x=YFtuidao[g];}}else{printf(Error\n);printf(回车返回\n);}printf(\n);getchar();printf(按任意键转入语义分析。。。。。。。\n);printf(+++++++++++++++++++++++++\n);printf(++\n);printf(++\n);printf(+编译语义分析+\n);printf(++\n);printf(++\n);printf(+++++++++++++++++++++++++\n);printf(输入的字符串为\n);strcpy(YYshuru,a=c+b*d+e*f);puts(YYshuru);printf(\n);w=YYshuru[YYi++];YYD();if(w=='\0')//对表达式输出{printf(\n);for(YYi=0;YYiYYq;YYi++){printf((%d),YYi+1);//输出序号if(qt[YYi].w!='=')//输出运算式(无序号的){printf((%c,qt[YYi].w);if(qt[YYi].word1.t!='t')printf(,%c,qt[YYi].word1.t);elseprintf(,%c%d,qt[YYi].word1.t,qt[
本文标题:山东理工大学编译原理作业
链接地址:https://www.777doc.com/doc-5707794 .html