赋值语句实验报告_第1页
赋值语句实验报告_第2页
赋值语句实验报告_第3页
赋值语句实验报告_第4页
赋值语句实验报告_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

学生学号0120810680104实验课成绩武汉理工大学

学生实验报告书实验课程名称 编译原理 开课学院 计算机科学与技术学院指导老师姓名 饶文碧 学生姓名 李杰绪 学生专业班级 软件0801班 20102011学年第二学期实验课程名称:编译原理实验项目名称赋值语句的翻译实验成绩实验者李杰绪专业班级软件0801组别同组者实验日期2011年4月第一部分:实验分析与设计(可加页)一、实验内容描述(问题域描述)问题描述:对于常用高级语言(如Pascal、C语言)的赋值语句用所学过的语法分析方法和语义分析方法进行语法分析、语义分析,并把其翻译成为中间代码形式。实验内容:对于常用高级语言(如Pascal、C语言)的源程序从左到右进行扫描,把其中赋值语句用所学过的语法分析方法进行语法分析,采用最有代表性的语义分析方法将其转换为中间代码形式表示输出。实验要求(1) 选择最有代表性的语法分析方法,如算符优先法(或简单优先法)递归下降分析法、LL分析法和LR分析法之一进行语法分析。(2) 选择对各种常见程序语言都通用的语法结构,如赋值语句(尤指表达式)作为分析对象,并且与所选语法分析方法要比较贴切。(3) 选择最有代表性的语义分析方法,如语法制导翻译方法进行语义翻译工作。(4) 实习时间为4〜6小时。、实验基本原理与设计(包括实验方案设计,实验手段的确定,试验步骤等,用硬件逻辑者算法描述)算法思想:#include〈iostream>#include〈string〉#include〈cctype>usingnamespacestd;#defineINFEASIBLE-1#defineOVERFLOW-2#defineSTACK_INIT__SIZE 100#defineSTACKINCREMENT 10typedefchar SElemType;typedefchar ElemType;structSTACK{SElemType*base;SElemType*top;intstacksize;};intInitStack(STACK&S);charGetTop(STACK&S);intPush(STACK&S,SElemTypee);//插入e为新的栈顶元素intPop(STACK&S,STACK&H,intm);//若栈不空,则删除S的栈顶元素intEmptyStack(STACK&S);//判断栈S是否为空intcmp(chara,charb);//判断运算符a的优先级是否高于运bvoidcmp(chara,charb,STACK&f,STACK&h);//判断运算符a和b的优先级intmain(){STACKh1;InitStack(hl);//定义并初始化逆序的逆波兰式栈hlSTACKh2;InitStack(h2);//定义并初始化正序的逆波兰式栈h2STACKfh;InitStack(fh);//定义并初始化符号栈fhPush(fh,'#');//将#压入符合栈stringz;inta;kind1:cout〈〈"***************************************"〈〈endl;cout〈〈"请输入一个表达式,并以“#”结束:"〈〈endl;cout〈〈"***************************************"〈〈endl;cin〉〉z;for(inti=0;i〈z.size();i++)//对输入表达式的每个字符进行判断{if(isalnum(z[i]))//如果当前字符是字母或数字Push(h1,z[i]);//将当前字符压入逆序的逆波兰式栈hlelseif(z[i]=='(')//如果当前字符是〃(〃Push(fh,'(');//将当前字符压入符号栈fhelseif(z[i]==')')//如果当前字符是〃)〃{while(GetTop(fh)!='(')//—直删除符号栈fh的栈顶元素只至Pop(fh,hl,l); //并将其压入逆序的逆波兰式栈hlPop(fh,fh,3); //删除符号栈fh的栈顶元素,即〃(〃}elseif(z[i]=='#')//如果当前字符是〃#〃{while(GetTop(fh)!='#')//—直删除符号栈fh的栈顶元素只至"#""Pop(fh,h1,1); //并将其压入逆序的逆波兰式栈h1}else//否则就判断当前字符和符号栈的栈顶元素的优先级cmp(z[i],GetTop(fh),fh,h1);//并执行相应的操作}while(!EmptyStack(h1))//如果逆序的逆波兰式栈h1非空就删除其栈顶元素Pop(h1,h2,1);//并将其压入正序的逆波兰式栈h2cout〈〈"***************************************"〈〈endl;cout〈〈"这个表达式的逆波兰式为:""〈〈endl;cout〈〈"***************************************"〈〈endl;while(!EmptyStack(h2))//如果正序的逆波兰式栈h2非空Pop(h2,h2,2);//就输出其栈顶元素至显示器cout〈〈endl〈〈endl;cout〈〈""(重新输入请输入1,退出请输入2.)""〈〈endl;cin〉〉a;if(a==1)gotokindl;return1;}intInitStack(STACK&S)//构造空栈S{S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemType));if(!S.base)exit(OVERFLOW);S.top=S.base;S.stacksize=STACK_INIT_SIZE;return1;}charGetTop(STACK&S)//若栈不空,返回S的栈顶元素,否则返回ERROR;{if(S.top==S.base)return0;ElemTypee=*(S.top-1);returne;}intPush(STACK&S,SElemTypee)//插入e为新的栈顶元素{if(S.top—S.base〉二S.stacksize){S.base=(ElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(ElemType));if(!S.base)exit(OVERFLOW);S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*S.top++=e;return1;}intPop(STACK&S,STACK&H,intm)//若栈不空,则删除S的栈顶元素,//并返回OK,否则返回ERROR{if(S.top==S.base)return0;ElemTypee=*—S.top;//删除栈顶元素并用e返回其值switch(m){case1://m==1时把栈顶元素压入H栈Push(H,e);break;case2://m==2时输出栈顶元素cout〈〈e;break;case3:break;//m==3时只删除栈顶元素}return1;}intEmptyStack(STACK&S)//判断栈S是否为空,{ //为空则返回1否则返回0if(S.top==S.base)return1;elsereturn0;}intcmp(chara,charb)//判断运算符a的优先级是否高于运b{ //是则返回0K,否则返回FALSEwhile(a=,*,||a==,/,){switch(b)//运算符*和/的优先级高于运算符+,-,(,=,#{ //但等于运算符*,/case'+'casecase'('case—case'#'return1;break;case*:case/:return0;break;}}while(a=='+'||a=='-')//运算符+和-的优先级高于运算符(,=,#{ //但低于等于运算符*,/,+厂switch(b){case'(':casecase'#':returnbreak;case'*':case'/':case'+':casereturn0;break;}}while(a=='(')//运算符(的优先级高于运算符二,#{ //但低于等于运算符*,/,+,-,(switch(b){case'=':case'#':return1;break;case*:case/:case+:case'-':case(:return0;break;}}while(a=='=')//运算符=的优先级高于运算符#{ //但低于等于运算符*,/,+,-,(,=switch(b)case'#':return1;break;case*:case/:case+:case'-':case(:case'=':return0;break;}}while(a='#')//运算符#的优先级低于所有其他运算符{ //但等于运算符#switch(b){case*case/case+case-case(case=case'#'return0;break;}}return1;}voidcmp(chara,charb,STACK&f,STACK&h)//判断运算符a和b的优先级{if(cmp(a,b))//如果运算符a的优先级高于运算符bPush(f,a);//就把a压入栈felse//如果运算符a的优先级低于等于运算符b{Pop(f,h,1);//删除栈f的栈顶元素并将其压入栈hcmp(a,GetTop(f),f,h);//继续判断运算符a和栈f的栈顶元素的优先级}}三、主要仪器设备及装有VC++6.0的计算机

第二部分:实验调试与结果分析(可加页)I''■CAWindowaXsystem32\D€bug\dfg.exe""C:\Winidows\5y5tem3第二部分:实验调试与结果分析(可加页)I''■CAWindowaXsystem32\D€bug\dfg.exe"MKKMXK

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论