山东理工大学编译原理作业

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

《编译原理》期末大作业班级:计科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[

1 / 35
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功