您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 销售管理 > 算术表达式到四元式翻译的编译程序设计
《编译原理》实验报告算术表达式到四元式翻译的编译程序设计班级学号姓名成绩指导教师沈阳理工大学应用技术学院2012年7月实验一1实验时间:2012-07-072实验地点:6#5063实验题目:算术表达式到四元式翻译的编译程序设计4实验目的:掌握将算术表达式翻译成四元式的方法及过程5实验内容:设计一个语法制导翻译器,将算术表达式翻译成四元式。要求:先确定一个定义算术表达式的文法,为其设计一个语法分析程序,为每条产生式配备一个语义子程序,按照一遍扫描的语法制导翻译方法,实现翻译程序。对用户输入的任意一个正确的算术表达式,程序将其转换成三.四元式输出(可按一定格式输出到指定文件中)。6实验预习:四元式是一种更接近目标代码的中间代码形式。由于这种形式的中间代码便于优化处理,因此,在目前许多编译程序中得到了广泛的应用。具体的形式为:(op,arg1,arg2,result)。例如,语句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)(+,t3,t4,t5)(6)(-,h,i,t6)(7)(*,l,m,t7)(8)(+,k,t4,t7)(9)(-,t7,n,t8)(10)(/,j,t8,t9)(11)(+,t6,t9,t10)(12)(=,t10,-,a)1).检查输入的元素;2).如果是一个操作数,则进栈;3).如果是操作符,则i).如果符号栈不为空或者此操作符的优先级大于符号栈栈顶的优先级,则将此运算符压栈;ii).如果符号栈不为空或者此操作符的优先级小于符号栈栈顶的优先级,栈顶操作符出栈并进行相应的操作;4).假定输入完毕,栈中剩余的所有操作符出栈并进行相应操作。7总体设计描述按照顺序将任意一个正确的算术表达式拆分成操作符和操作数部分并入栈,而后比较优先级按照优先级高低出栈,执行操作:将算术表达式转换成四元式输出。本程序共有两个函数,一个将算术表达式翻译成四元式的函数inttranslate(strings),是本程序的主要函数;另一个是主函数,负责调用翻译函数和输入输出处理。8运行步骤与结果输入为一个标准的算术表达式,输出为四元式,按行区分,如输入:a=b*(c-d+f*(g+h-i/j+k))输出为:9程序清单#includestring.h#includestdio.hcharw;intj=1;structTOKEN{chart;inti;};structTOKENword,sem[10];inti_sem;structQT{charw;structTOKENword1;structTOKENword2;structTOKENtemp;};charexp[50];inti=0;structQTqt[30];intq=0;intD();intE();intT();intF();voidnext();voidnewt();voidquat(char);intmain(){clrscr();printf(pleaseinputyourexpression:);scanf(%s,exp);next();D();if(w=='\0'){printf(\n);for(i=0;iq;i++){printf((%d),i+1);if(qt[i].w!='='){printf((%c,qt[i].w);if(qt[i].word1.t!='t')printf(,%c,qt[i].word1.t);elseprintf(,%c%d,qt[i].word1.t,qt[i].word1.i);if(qt[i].word2.t!='t')printf(,%c,qt[i].word2.t);elseprintf(,%c%d,qt[i].word2.t,qt[i].word2.i);printf(,%c%d)\n,qt[i].temp.t,qt[i].temp.i);}else{printf((%c,qt[i].w);printf(,%c%d,qt[i-1].temp.t,qt[i-1].temp.i);printf(,_);printf(,%c),qt[i].word1.t);}}getch();}elseprintf(err);printf(\nHelloWorld!\n);return0;}intD(){charw0;E();while(w=='='){w0=w;next();E();quat(w0);}return1;}intE(){charw1;T();while(w=='+'||w=='-'){w1=w;next();T();quat(w1);}return1;}intT(){charw2;F();while(w=='*'||w=='/'){w2=w;next();F();quat(w2);}return1;}intF(){if(w=='('){next();E();if(w!=')'){printf(err);return0;}}elseif((w='a'&&w='z')||(w='0'&&w='9')){word.t=w;word.i=0;sem[++i_sem]=word;}else{printf(err);return0;}next();return1;}voidnext(){w=exp[i];i++;}voidnewt(){word.t='t';word.i=j++;}voidquat(charww){newt();qt[q].w=ww;qt[q].word1=sem[i_sem-1];qt[q].word2=sem[i_sem];qt[q].temp=word;i_sem--;i_sem--;sem[++i_sem]=word;q++;}10实验总结:编译原理中有许多知识点是需要熟练掌握的。倘若只看书,不做大量的练习,对知识点的掌握也会显得十分肤浅。在学习文法时,对文法的组成,用法都较为明了,而在真正做题时却感到十分吃力。而在之后的词法分析和语法分析中,我感到在看基本原理时十分困难,通常要长时间钻研才能够有所了解,而一旦掌握了基本原理,做题时就感到十分顺畅了。例如,在刚接触到LR(0)文法时,我用了大量的时间去学习它的原理,掌握之后,在列LR(0)分析表和写分析过程时,只要思路清晰,就会比较顺畅,而且不会犯错。算术表达式转化成四元式主要是考虑优先级问题,还有就是四元式中如何将‘T’和数字一起输出问题。
本文标题:算术表达式到四元式翻译的编译程序设计
链接地址:https://www.777doc.com/doc-5327544 .html