版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、精选优质文档-倾情为你奉上本科实验报告课程名称: 编译原理 实验项目: 无符号数的词法分析程序 实验地点: 迎西校区4506机房 专业班级: 学号: 学生姓名: 指导教师: 2012年 5月一 实验内容:掌握词法分析的基本思想,并用高级语言编写无符号数(包括整形和实数)的词法分析程序。二 实验要求:从键盘上输入一串字符(包括字母,数字等),最后以”;”结束,编写程序识别出其中的无符号数。三 实验源代码:#include<iostream>#include<cctype>#include<cstring>#include<cmath>using n
2、amespace std;int w=0; /尾数累加器 int p=0; /指数累加器 int j=0; /十进制小数位数计数器 int e=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);/检查首字母是否是数字的
3、函数 void deal_integer(char c);/处理识别符的整数部分 void deal_point(char c);/用来处理小数部分 void deal_index(char c);/用来处理指数部分void s_next();/ 确定实型 void z_next();/确定整型 void last();/ 计算 CJ2void error();/程序中错误处理程序 void deal();/处理函数主体 int main() /主函数 cout<<"please input your data,and its maximum length is &quo
4、t;<<N<<":"<<endl;/等待用户输入识别符 cin>>data; deal();/处理函数主体 last();/ 计算 CJ2 system("pause"); return 0; void check(char c) /判断输入的首字母是否是数字 is_digit=isdigit(c); while(is_digit!=true)/输入的首字母不是数字时 cout<<"nError! Try again."<<endl;/要求重新输入 cin>
5、>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)/是数值字符时 deal_integer(c); else error(); /错误处理程序 deal();/处理函数主体 j=i-temp;/记录十进制小数位数 void deal
6、_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;pro2: p=p*10+d; i+; if(isdigit(datai)!=0)
7、/是数值字符时 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); cout<<CJ1<<": "<<CJ2&
8、lt;<endl;/输出 void error()/程序中错误处理程序 cout<<"nError! Try again."<<endl;/重新输入数据 cin>>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=
9、'e'|datai='E')/如果是e或E时 deal_index(data+i);/用来处理指数部分 else if(datai!='0') error();/错误处理程序 deal();/处理函数主体 else s_next();/ 确定实型 else if(datai='e'|datai='E')/如果是e或E时 deal_index(data+i);/用来处理指数部分 /CJ1="整型" else if(datai!='0') /非结束标志 error();/错误处理程序
10、 deal();/处理函数主体 else z_next();/确定整型 四实验结果截图:本科实验报告课程名称: 编译原理 实验项目: 逆波兰式生成程序 实验地点: 迎西校区4506机房 专业班级: 学号: 学生姓名: 指导教师: 2012年 5月一. 实验内容 掌握语法分析的基本思想,并用高级语言编写逆波兰式生成程序。二. 实验要求将非后缀式用来表示的算术表达式转换为用逆波兰式来表示的算术表达式。三. 实验过程1、逆波兰式生成的实验设计思想及算法否出错处理否否是是是是否是否输入一个中缀式表示的简单运算表达式#入栈sym=当前输入符号sym是数字吗?对数字进行处理,形成一个数字串栈顶运算符优先级
11、低于sym吗?将向前看符号入栈栈顶运算符与sym优先级相等吗?将栈顶运算符弹出,且输出栈顶运算符优先级高于sym吗栈顶是(且sym为)吗栈顶运算符出栈程序结束(1)首先构造一个运算符栈,此运算符在栈内遵循越往栈顶优先级越高的原则。(2)读入一个用中缀表示的简单算术表达式,为方便起见,设该简单算术表达式的右端多加上了优先级最低的特殊符号“#”。(3)从左至右扫描该算术表达式,从第一个字符开始判断,如果该字符是数字,则分析到该数字串的结束并将该数字串直接输出。(4)如果不是数字,该字符则是运算符,此时需比较优先关系。做法如下:将该字符与运算符栈顶的运算符的优先关系相比较。如果,该字符优先关系高于此
12、运算符栈顶的运算符,则将该运算符入栈。倘若不是的话,则将此运算符栈顶的运算符从栈中弹出,将该字符入栈。(5)重复上述操作(1)-(2)直至扫描完整个简单算术表达式,确定所有字符都得到正确处理,我们便可以将中缀式表示的简单算术表达式转化为逆波兰表示的简单算术表达式。2.实验的源程序代码如下:#include<stdio.h>#include<math.h>#define max 100char exmax; /*存储后缀表达式*/void trans() /*将算术表达式转化为后缀表达式*/char strmax; /*存储原算术表达式*/char stackmax; /
13、*作为栈使用*/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!='#')swit
14、ch(ch)case '(': /*判定为左括号*/top+;stacktop=ch; break; case ')': /*判定为右括号*/while(stacktop!='(') ext=stacktop;top-;t+;top-;break; case '+': /*判定为加减号*/case '-': while(top!=0&&stacktop!='(')ext=stacktop;top-;t+;top+;stacktop=ch;break;case '*':
15、 /*判定为乘除号*/ case '/':while(stacktop='*'|stacktop='/')ext=stacktop;top-;t+;top+;stacktop=ch;break;case ' ':break;default:while(ch>='0'&&ch<='9') /*判定为数字*/ext=ch;t+;ch=stri;i+;i-;ext='#'t+;ch=stri;i+;while(top!=0)ext=stacktop;t+;top
16、-;ext='#'printf("nt原来表达式:");for(j=1;j<sum;j+)printf("%c",strj); printf("nt后缀表达式:",ex);for(j=1;j<t;j+)printf("%c",exj);void compvalue() /*计算后缀表达式的值*/float stackmax,d; /*作为栈使用*/char ch;int t=1,top=0; /*t为ex下标,top为stack下标*/ch=ext;t+; while(ch!='
17、#')switch(ch) case '+': stacktop-1=stacktop-1+stacktop; top-; break; case '-': stacktop-1=stacktop-1-stacktop; top-; break; case '*': stacktop-1=stacktop-1*stacktop; top-; break; case '/': if(stacktop!=0) stacktop-1=stacktop-1/stacktop; else printf("nt除零错误!n&
18、quot;); exit(0); /*异常退出*/ top-; break; default: d=0; while(ch>='0'&&ch<='9') d=10*d+ch-'0' /*将数字字符转化为对应的数值*/ ch=ext;t+; top+; stacktop=d;ch=ext;t+;printf("nt计算结果:%gn",stacktop);main()trans();compvalue();3.程序的运行结果如下:四. 实验总结(心得) 通过本实验的学习,主要掌握了逆波兰式算法的含义,结
19、合书本知识,让我更加清楚此算法实现的主要过程,以及使用该算法的好处,通过对程序实现的分析,对于逆波兰式算法的细节了解的更加清楚,从中学到了很多的东西。本科实验报告课程名称: 编译原理 实验项目: 语法分析程序的设计 实验地点: 迎西校区4506机房 专业班级: 学号: 学生姓名: 指导教师: 2012年 5月一、实验目的与要求通过设计、编制、调试一个典型的语法分析程序(任选有代表性的语法分析方法,如算符优先法、递归下降法、LL(1)、SLR(1)、LR(1)等,作为编制语法分析程序的依据),对扫描器所提供的单词序列进行语法检查和结构分析,实现并进一步掌握常用的语法分析方法。二、实验内容选择对各
20、种常见高级程序设计语言都较为通用的语法结构作为分析对象,给出其文法描述(注意应与所采用的语法分析方法比较贴近),设计并实现一个完整的语法分析程序。输入:源程序以文件的形式输入。输出:对于所输入的源程序,如果输入符号串是给定文法定义的合法句子,则输出“RIGHT”,并且给出每一步归约的过程;如果不是句子,即输入串有错误,则输出“ERROR”,并且显示已经归约出的各个文法符号。三、基本实验题目以如下文法G1所定义的算术表达式的赋值语句作为分析对象,编写并调试一个语法分析程序。G1<赋值语句>:<赋值语句> <变量>:=<算术表达式><算术表达式
21、> <项> | <算术表达式>+<项> | <算术表达式>-<项><项> <因式> | <项>*<因式> | <项>/<因式><因式> <变量> | <常数> | (<算术表达式>)<变量> <标识符><标识符> <标识符> <字母> | <标识符> <数字> | <字母><常数> <整数>
22、| <浮点数><整数> <数字> | <数字> <整数><浮点数> <整数> | <整数> <整数><字母> A|B|C|X|Y|Z|a|b|c|x|y|z<数字> 0|1|2|9四、源程序#include<iostream>using namespace std;#include<stdio.h>#include<string.h>#define MAX 150 /词法分析表的最大容量#define MAXBUF 255 /缓
23、冲区的最大缓冲量void term();void lrparser();void statement();void yucu();void expression();void factor();char progMAXBUF,tokenMAX; char ch;int syn,p,m,n,sum,kk; char * rwtab6="begin","if","then","while","do","end"/*词法扫描程序:*/void scaner() for(m=0;m&
24、lt;MAX;m+) tokenm=NULL; m=0;sum=0; ch=progp+; while(ch=' ')ch=progp+; if(ch<='z'&&ch>='a')|(ch<='Z'&&ch>='A') while(ch<='z'&&ch>='a')|(ch<='Z'&&ch>='A')|(ch<='9'
25、&&ch>='0') tokenm+=ch; ch=progp+; /读取下一个字符 tokenm+='0' ch=prog-p; syn=10; for(n=0;n<6;n+) if(strcmp(token,rwtabn)=0) syn=n+1; /给出syn值 break; else if(ch<='9'&&ch>='0') sum=0; while(ch<='9'&&ch>='0') sum=sum*10+c
26、h-'0' ch=progp+; ch=prog-p; syn=11; else switch(ch) case '<':m=0;tokenm+=ch; ch=progp+; if(ch='>') syn=21; tokenm+=ch; else if(ch='=') syn=22; tokenm+=ch; else syn=20; ch=prog-p; break; case '>':tokenm+=ch; ch=progp+; if(ch='=') syn=24; tokenm
27、+=ch; else syn=23; ch=prog-p; break; case ':':tokenm+=ch; ch=progp+; if(ch='=') syn=18; tokenm+=ch; else syn=17; ch=prog-p; break; case '+':syn=13;token0=ch;break; case '-':syn=14;token0=ch;break; case '*':syn=15;token0=ch;break; case '/':syn=16;token0
28、=ch;break; case ':=':syn=18;token0=ch;break; case '<>':syn=21;token0=ch;break; case '<=':syn=22;token0=ch;break; case '>=':syn=24;token0=ch;break; case '=':syn=25;token0=ch;break; case '':syn=26;token0=ch;break; case '(':syn=27;toke
29、n0=ch;break; case ')':syn=28;token0=ch;break; case '#':syn=0;token0=ch;break; default:syn=-1; break; /void statement()if (syn=10) scaner(); /读下一个单词符号 if (syn=18) scaner(); /读下一个单词符号expression(); /调用expression函数 else printf("error!"); kk=1; else printf("error!"); kk=1;return;/void expression()term();while(syn=13 | syn=14) scaner(); te
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年创业风格测试题及答案
- 2026年综治宣传测试题及答案
- 2026年女人味的测试题及答案
- 2026年上册小学音乐测试题及答案
- 2026年乙肝dna检测试题及答案
- 小学水资源宣传说课稿2025
- 2026年行车工理论测试题及答案
- 2026年干部档案知识测试题及答案
- 第2课 出门远行家在手中-智能家居说课稿-2025-2026学年小学信息技术(信息科技)六年级下册青岛版(六三制)
- 初中生自我认知优化说课稿2025
- 汉坦病毒交叉感染预防讲解课件
- 2026年群众文化面试题库及解析
- (2026年版)医疗器械系列指南及指导原则培训课件
- 2026河北邢台市生态环境局下属事业单位公开选调工作人员10名笔试参考题库及答案详解
- 2026年演出经纪人综合提升试卷(考试直接用)附答案详解
- 全国中小学生学籍信息管理系统问题学籍处理流程帮助
- 商务星球版七年级下册地理知识点归纳
- 公司治理课件讲义
- 工程合同管理师职业考试培训讲义
- 九年级《体育及健康》下学期教学案优质教学案全册可直接打印
- 化工工程施工组织方案
评论
0/150
提交评论