收藏 分销(赏)

编译原理实验报告逆波兰式分析.doc

上传人:快乐****生活 文档编号:2229090 上传时间:2024-05-23 格式:DOC 页数:6 大小:28.04KB 下载积分:6 金币
下载 相关 举报
编译原理实验报告逆波兰式分析.doc_第1页
第1页 / 共6页
编译原理实验报告逆波兰式分析.doc_第2页
第2页 / 共6页


点击查看更多>>
资源描述
(完整word版)编译原理实验报告逆波兰式分析 河南工业大学实验报告 课 程 编译原理 实验名称 实验三 逆波兰式分析 一. 实验目的 1.掌握自底向上分析中算符优先分析法的基本原理; 2.掌握优先关系表的构造方法。 二. 实验内容及要求 根据介绍的算术表达式文法编制调试算符优先分析程序,以便对任意输入的简单算术表达式进行分析。将用中缀式表示的算术表达式转换为用逆波兰式(后缀式)表示的算术表达式,并计算用逆波兰式表示的算术表达式的值。 程序输入一以#结束的符号串,如:2*(3+4)#。输出过程如下: (1)逆波兰式(后缀式)为:2&3&4&+*; (2)计算结果:14。 三. 实验过程及结果 (说明:实验结果可以是运行画面的抓屏,抓屏图片要尽可能的小。) 代码如下: #include<stdio.h> #include<math.h> #define max 100 char ex[max]; /*存储后缀表达式*/ void trans(){ /*将算术表达式转化为后缀表达式*/ char str[max]; /*存储原算术表达式*/ char stack[max]; /*作为栈使用*/ char ch; int sum,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;j<sum;j++) printf("%c",str[j]); printf("\n\t后缀表达式:",ex); for(j=1;j<t;j++) printf("%c",ex[j]); } void compvalue(){ /*计算后缀表达式的值*/ float stack[max],d; /*作为栈使用*/ char ch; int t=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]); } void main() { trans(); compvalue(); } 截屏如下: 四. 实验中的问题及心得 这次试验让我更一步了解到自底向上分析中算符优先分析法的基本原理。
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 考试专区 > 中考

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服