编译原理课程报告太原理工大学.docx
《编译原理课程报告太原理工大学.docx》由会员分享,可在线阅读,更多相关《编译原理课程报告太原理工大学.docx(12页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、本科实验报告课程名称: 编译原理 实验项目: 无符号数的词法分析程序 实验地点: 迎西校区4506机房 专业班级: 学号: 学生姓名: 指导教师: 2012年 5月一 实验内容:掌握词法分析的基本思想,并用高级语言编写无符号数(包括整形和实数)的词法分析程序。二 实验要求:从键盘上输入一串字符(包括字母,数字等),最后以”;”结束,编写程序识别出其中的无符号数。三 实验源代码:#include#include#include#includeusing namespace std;int w=0; /尾数累加器 int p=0; /指数累加器 int j=0; /十进制小数位数计数器 int e
2、=1; /用来记录十进制数的符号,当指数为正时为1,为负时为-1 int i=0; /用来标志元素位置 int d=0; /用来表示每个数值型元素对应的数值 const int N=40;/用来确定输入识别符的最大长度char dataN;/存放输入的识别符 bool is_digit; /标志是否是数字 string CJ1;/确定是整形还是实型 double CJ2;/记数值 /函数声明 void check(char c);/检查首字母是否是数字的函数 void deal_integer(char c);/处理识别符的整数部分 void deal_point(char c);/用来处理小
3、数部分 void deal_index(char c);/用来处理指数部分void s_next();/ 确定实型 void z_next();/确定整型 void last();/ 计算 CJ2void error();/程序中错误处理程序 void deal();/处理函数主体 int main() /主函数 coutplease input your data,and its maximum length is N:data; deal();/处理函数主体 last();/ 计算 CJ2 system(pause); return 0; void check(char c) /判断输入的
4、首字母是否是数字 is_digit=isdigit(c); while(is_digit!=true)/输入的首字母不是数字时 coutnError! Try again.data; check(data0); void deal_integer(char c)/处理识别符的整数部分 d=(int)c-48; w=w*10+d; i+; if(isdigit(datai)!=0)/下一个仍是数值时,调用程序本身 deal_integer(datai); void deal_point(char c)/用来处理小数部分 int temp=i; if(isdigit(c)!=0)/是数值字符时 d
5、eal_integer(c); else error(); /错误处理程序 deal();/处理函数主体 j=i-temp;/记录十进制小数位数 void deal_index(char c)/用来处理指数部分 if(c=-) e=-1;i+;/是-号时 else if(c=+) i+;/是+ 号时 else if(isdigit(c)=false) /非数值字符时 error();/错误处理程序 deal();/处理函数主体 else d=(int)c-48;/把输入字符转换为整型 goto pro2; if(isdigit(datai)!=0)pro1: d=(int)(datai)-48
6、;pro2: p=p*10+d; i+; if(isdigit(datai)!=0)/是数值字符时 goto pro1; else if(datai!=0)/非结束标志 error();/错误处理程序 deal();/处理函数主体 else s_next(); / 确定实型 void s_next()/ 确定实型 i-;/退一个字符 CJ1=实型;void z_next()/确定整型 i-;/退一个字符 CJ1=整型;void last()/ 计算 CJ2 CJ2=w*pow(double)10,e*p-j); coutCJ1: CJ2endl;/输出 void error()/程序中错误处理
7、程序 coutnError! Try again.data; p=0;w=0;j=0; /所有全局变量重新初始化 e=1;i=0;d=0; /exit(0);void deal() check(data0);/判断输入的首字母是否是数字 deal_integer(datai);/处理识别符的整数部分 if(datai=.) deal_point(data+i);/用来处理小数部分 if(datai=e|datai=E)/如果是e或E时 deal_index(data+i);/用来处理指数部分 else if(datai!=0) error();/错误处理程序 deal();/处理函数主体 el
8、se s_next();/ 确定实型 else if(datai=e|datai=E)/如果是e或E时 deal_index(data+i);/用来处理指数部分 /CJ1=整型; else if(datai!=0) /非结束标志 error();/错误处理程序 deal();/处理函数主体 else z_next();/确定整型 四实验结果截图:本科实验报告课程名称: 编译原理 实验项目: 逆波兰式生成程序 实验地点: 迎西校区4506机房 专业班级: 学号: 学生姓名: 指导教师: 2012年 5月一. 实验内容 掌握语法分析的基本思想,并用高级语言编写逆波兰式生成程序。二. 实验要求将非后
9、缀式用来表示的算术表达式转换为用逆波兰式来表示的算术表达式。三. 实验过程1、逆波兰式生成的实验设计思想及算法否出错处理否否是是是是否是否输入一个中缀式表示的简单运算表达式#入栈sym=当前输入符号sym是数字吗?对数字进行处理,形成一个数字串栈顶运算符优先级低于sym吗?将向前看符号入栈栈顶运算符与sym优先级相等吗?将栈顶运算符弹出,且输出栈顶运算符优先级高于sym吗栈顶是(且sym为)吗栈顶运算符出栈程序结束(1)首先构造一个运算符栈,此运算符在栈内遵循越往栈顶优先级越高的原则。(2)读入一个用中缀表示的简单算术表达式,为方便起见,设该简单算术表达式的右端多加上了优先级最低的特殊符号“#
10、”。(3)从左至右扫描该算术表达式,从第一个字符开始判断,如果该字符是数字,则分析到该数字串的结束并将该数字串直接输出。(4)如果不是数字,该字符则是运算符,此时需比较优先关系。做法如下:将该字符与运算符栈顶的运算符的优先关系相比较。如果,该字符优先关系高于此运算符栈顶的运算符,则将该运算符入栈。倘若不是的话,则将此运算符栈顶的运算符从栈中弹出,将该字符入栈。(5)重复上述操作(1)-(2)直至扫描完整个简单算术表达式,确定所有字符都得到正确处理,我们便可以将中缀式表示的简单算术表达式转化为逆波兰表示的简单算术表达式。2.实验的源程序代码如下:#include#include#define m
11、ax 100char exmax; /*存储后缀表达式*/void trans() /*将算术表达式转化为后缀表达式*/char strmax; /*存储原算术表达式*/char stackmax; /*作为栈使用*/char ch;int sum,i,j,t,top=0;printf(*n);printf(*输入一个求值的表达式,以#结束。*n);printf(*n);printf(算数表达式:);i=0; /*获取用户输入的表达式*/doi+;scanf(%c,&stri);while(stri!=# & i!=max); sum=i;t=1;i=1;ch=stri;i+;while(ch
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 课程 报告 太原 理工大学
限制150内