您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 数据库 > 编译原理课程报告太原理工大学
本科实验报告课程名称:编译原理实验项目:无符号数的词法分析程序实验地点:迎西校区4506机房专业班级:学号:学生姓名:指导教师:2012年5月一.实验内容:掌握词法分析的基本思想,并用高级语言编写无符号数(包括整形和实数)的词法分析程序。二.实验要求:从键盘上输入一串字符(包括字母,数字等),最后以”;”结束,编写程序识别出其中的无符号数。三.实验源代码:#includeiostream#includecctype#includecstring#includecmathusingnamespacestd;intw=0;//尾数累加器intp=0;//指数累加器intj=0;//十进制小数位数计数器inte=1;//用来记录十进制数的符号,当指数为正时为1,为负时为-1inti=0;//用来标志元素位置intd=0;//用来表示每个数值型元素对应的数值constintN=40;//用来确定输入识别符的最大长度chardata[N];//存放输入的识别符boolis_digit;//标志是否是数字stringCJ1;//确定是整形还是实型doubleCJ2;//记数值//函数声明voidcheck(charc);//检查首字母是否是数字的函数voiddeal_integer(charc);//处理识别符的整数部分voiddeal_point(charc);//用来处理小数部分voiddeal_index(charc);//用来处理指数部分voids_next();//确定实型voidz_next();//确定整型voidlast();//计算CJ2voiderror();//程序中错误处理程序voiddeal();//处理函数主体intmain(){//主函数coutpleaseinputyourdata,anditsmaximumlengthisN:endl;//等待用户输入识别符cindata;deal();//处理函数主体last();//计算CJ2system(pause);return0;}voidcheck(charc)//判断输入的首字母是否是数字{is_digit=isdigit(c);while(is_digit!=true){//输入的首字母不是数字时cout\nError!Tryagain..endl;//要求重新输入cindata;check(data[0]);}}voiddeal_integer(charc){//处理识别符的整数部分d=(int)c-48;w=w*10+d;i++;if(isdigit(data[i])!=0)//下一个仍是数值时,调用程序本身deal_integer(data[i]);}voiddeal_point(charc){//用来处理小数部分inttemp=i;if(isdigit(c)!=0)//是数值字符时deal_integer(c);else{error();//错误处理程序deal();//处理函数主体}j=i-temp;//记录十进制小数位数}voiddeal_index(charc){//用来处理指数部分if(c=='-'){e=-1;i++;}//是'-'号时else{if(c=='+')i++;//是'+'号时else{if(isdigit(c)==false)//非数值字符时{error();//错误处理程序deal();//处理函数主体}else{d=(int)c-48;//把输入字符转换为整型gotopro2;}}}if(isdigit(data[i])!=0)pro1:d=(int)(data[i])-48;pro2:p=p*10+d;i++;if(isdigit(data[i])!=0)//是数值字符时gotopro1;elseif(data[i]!='\0'){//非结束标志error();//错误处理程序deal();//处理函数主体}elses_next();//确定实型}voids_next(){//确定实型i--;//退一个字符CJ1=实型;}voidz_next(){//确定整型i--;//退一个字符CJ1=整型;}voidlast(){//计算CJ2CJ2=w*pow((double)10,e*p-j);coutCJ1:CJ2endl;//输出}voiderror(){//程序中错误处理程序cout\nError!Tryagain..endl;//重新输入数据cindata;p=0;w=0;j=0;//所有全局变量重新初始化e=1;i=0;d=0;//exit(0);}voiddeal(){check(data[0]);//判断输入的首字母是否是数字deal_integer(data[i]);//处理识别符的整数部分if(data[i]=='.'){deal_point(data[++i]);//用来处理小数部分if(data[i]=='e'||data[i]=='E')//如果是e或E时deal_index(data[++i]);//用来处理指数部分elseif(data[i]!='\0'){error();//错误处理程序deal();//处理函数主体}elses_next();//确定实型}else{if(data[i]=='e'||data[i]=='E')//如果是e或E时{deal_index(data[++i]);//用来处理指数部分//CJ1=整型;}elseif(data[i]!='\0'){//非结束标志error();//错误处理程序deal();//处理函数主体}elsez_next();//确定整型}}四.实验结果截图:本科实验报告课程名称:编译原理实验项目:逆波兰式生成程序实验地点:迎西校区4506机房专业班级:学号:学生姓名:指导教师:2012年5月一.实验内容掌握语法分析的基本思想,并用高级语言编写逆波兰式生成程序。二.实验要求将非后缀式用来表示的算术表达式转换为用逆波兰式来表示的算术表达式。三.实验过程1、逆波兰式生成的实验设计思想及算法(1)首先构造一个运算符栈,此运算符在栈内遵循越往栈顶优先级越高的原则。(2)读入一个用中缀表示的简单算术表达式,为方便起见,设该简单算术表达式的右端多加上了优先级最低的特殊符号“#”。否出错处理否否是是是是否是否输入一个中缀式表示的简单运算表达式‘#’入栈sym=当前输入符号sym是数字吗?对数字进行处理,形成一个数字串栈顶运算符优先级低于sym吗?将向前看符号入栈栈顶运算符与sym优先级相等吗?将栈顶运算符弹出,且输出栈顶运算符优先级高于sym吗栈顶是’(‘且sym为’)吗栈顶运算符出栈程序结束(3)从左至右扫描该算术表达式,从第一个字符开始判断,如果该字符是数字,则分析到该数字串的结束并将该数字串直接输出。(4)如果不是数字,该字符则是运算符,此时需比较优先关系。做法如下:将该字符与运算符栈顶的运算符的优先关系相比较。如果,该字符优先关系高于此运算符栈顶的运算符,则将该运算符入栈。倘若不是的话,则将此运算符栈顶的运算符从栈中弹出,将该字符入栈。(5)重复上述操作(1)-(2)直至扫描完整个简单算术表达式,确定所有字符都得到正确处理,我们便可以将中缀式表示的简单算术表达式转化为逆波兰表示的简单算术表达式。2.实验的源程序代码如下:#includestdio.h#includemath.h#definemax100charex[max];/*存储后缀表达式*/voidtrans(){/*将算术表达式转化为后缀表达式*/charstr[max];/*存储原算术表达式*/charstack[max];/*作为栈使用*/charch;intsum,i,j,t,top=0;printf(*****************************************\n);printf(*输入一个求值的表达式,以#结束。*\n);printf(******************************************\n);printf(算数表达式:);i=0;/*获取用户输入的表达式*/do{i++;scanf(%c,&str[i]);}while(str[i]!='#'&&i!=max);sum=i;t=1;i=1;ch=str[i];i++;while(ch!='#'){switch(ch){case'(':/*判定为左括号*/top++;stack[top]=ch;break;case')':/*判定为右括号*/while(stack[top]!='('){ex[t]=stack[top];top--;t++;}top--;break;case'+':/*判定为加减号*/case'-':while(top!=0&&stack[top]!='('){ex[t]=stack[top];top--;t++;}top++;stack[top]=ch;break;case'*':/*判定为乘除号*/case'/':while(stack[top]=='*'||stack[top]=='/'){ex[t]=stack[top];top--;t++;}top++;stack[top]=ch;break;case'':break;default:while(ch='0'&&ch='9'){/*判定为数字*/ex[t]=ch;t++;ch=str[i];i++;}i--;ex[t]='#';t++;}ch=str[i];i++;}while(top!=0){ex[t]=stack[top];t++;top--;}ex[t]='#';printf(\n\t原来表达式:);for(j=1;jsum;j++)printf(%c,str[j]);printf(\n\t后缀表达式:,ex);for(j=1;jt;j++)printf(%c,ex[j]);}voidcompvalue(){/*计算后缀表达式的值*/floatstack[max],d;/*作为栈使用*/charch;intt=1,top=0;/*t为ex下标,top为stack下标*/ch=ex[t];t++;while(ch!='#'){switch(ch){case'+':stack[top-1]=stack[top-1]+stack[top];top--;break;case'-':stack[top-1]=stack[top-1]-stack[top];top--;break;case'*':stack[top-1]=stack[top-1]*stack[top];top--;break;case'/':if(stack[top]!=0)stack[top-1]=stack[top-1]/stack[top];else{printf(\n\t除零错误!\n);exit(0);/*异常退出*/}top--;break;default:d=0;while(ch='0'&&ch='9'){d=10*d+ch-'0';/*将数字字符转化为对应的数值*/ch=ex[t];t++;}top++;stack[top]=d;}ch=ex[t];t++;}printf(\n\t计算结果:%g\n,stack[top]);}main(){trans();compvalue();}3.程序的运行结果如下:四.实验总结(心得)通过本实验的学习,主要掌握了逆波兰式算法的含义,结合书本知识,让我更加清楚此算法实现的主要过程,以及使用该算法的好处,通过对程序实现的分析,对于逆波兰式算法的细节了解的更加清楚,从中学到了很多的东西。本科实验报告课程名称:编译原理实验项目:语法分析程序的设计实验地点:迎西校区4506机房专业班级:学号:学生姓名:指导教师:2012年5月一、实验目的与要求通过设计、编制、调试一个典型的语法分析程序(任选有
本文标题:编译原理课程报告太原理工大学
链接地址:https://www.777doc.com/doc-5708417 .html