资源描述:
《算术表达式到四元式翻译的编译程序设计》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、《编译原理》实验报告算术表达式到四元式翻译的编译程序设计班级学号姓名成绩指导教师沈阳理工大学应用技术学院2«12年巾月实验一I实验时间82«i2-rj-r32实验地点tJ实验题目$算术表达式到四元式翻译的编译程序设计4实验目的8掌握将算术表达式翻译成四元式的方法及过程■实验内容8设计一个语法制导翻译器,将算术表达式翻译成四元式。要求:先确定一个定义算术表达式的文法,为其设计一个语法分析程序,为每条产生式配备一个语义子程序,按照一遍扫描的语法制导翻译方法,实现翻译程序。对用户输入的任意一个正确的算术表达式,程序将其转换成三•四元式输出4可按一定格式输岀到指定文
2、件中》。&实验预习i四元式是一种更接近冃标代码的中间代码形式。由于这种形式的中间代码便于优化处理,因此,在冃前许多编译程序中得到了广泛的应用。具体的形式为:(割,bm.^1)。一例如,语句yl+feT》糟―严©匕呼》的四元式表示如下:F(1)(-,c,d,tl)(3)(+,b,t2,⑶(3)(/,f,g,⑷(4)(+,t3,t4,t5)(5)(-,h,i,t6)(7)(6)(+,k,t4,t7)(7)(-,t7,n,t8)(8)(/j,t8,t9)(9)(+,t6,t9,tl0)(10)(=tlO,-,a)D•检查输入的元素;2》.如果是一个操作数,则进栈;
3、工>•如果是操作符,则»•如果符号栈不为空或者此操作符的优先级大于符号栈栈顶的优先级,则将此运算符压栈;•如果符号栈不为空或者此操作符的优先级小于符号栈栈顶的优先级,栈顶操作符出栈并进行相应的操作;4X假定输入完毕,栈中剩余的所有操作符出栈并进行相应操作。7总体设计描述按照顺序将任意一个止确的算术表达式拆分成操作符和操作数部分并入栈,而后比较优先级按照优先级高低出栈,执行操作:将算术表达式转换成四元式输出。本程序共有两个函数,一个将算术表达式翻译成四元式的函数riHs>,是本程序的主要函数;另一个是主函数,负责调用翻译函数和输入输出处理。8运行步骤与结果输入
4、为一个标准的算术表达式,输出为四元式,按行区分,如输入:输岀为:31-lqlx
5、pleaseinputyourexpression:a*b«,d,e,tl><2><-.c.tl・t2》<3><>.mFh.t3><4><八i.j•"><5><->13,t4Ft5><6><•.tSrktfc>><••f•16•貞、<•#t2>t7#tB><9>《・•b•》<10>tH>a>9程序清单#include"string.h"#include"stdio.h"charw;intj=l;structTOKENchart;inti;};s
6、tructTOKENword,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(npleaseinputyourexpression:H);scanf("%s”,exp);next(
7、);D();讦(w==' ‘){printf(””);for(i=0;ivq;i++){printf(H(%d)”,i+l);if(qt[i].w!='=){printf("(%c",qt[i].w);if(qt[i].wordl.t!=T)printf(u,%c",qt[i].wordl.t);elseprintf(H,%c%dH,qt[i].word1.t,qt[i].word1.i);if(qt[i].word2.t!=T)printf(",%c'qt[i].word2.t);elseprintf(u,%c%dH,qt[i].word2.t,q
8、t[i].word2.i);printf(H,%c%d)H,qt[i].temp.t,qt[i].temp.i);}elseprintf(n(%cn,qt[i].w);printf(",%c%dn,qt[i-1].temp.t,qt[i-1J.temp.i);printf(",J);printf(u,%c)M,qt[i].wordl.t);}}getch();}elseprintf(Herrn);printf(nHelloWorld!H);return0;}intD(){charwO;E();while(w==-'){w0=w;next();E(
9、);quat(wO);}intE(){charwl;