河南工业大学实验报告课程编译原理实验名称实验三 逆波兰式分析一. 实验目的1.掌握自底向上分析中算符优先分析法的基本原理;2.掌握优先关系表的构造方法。二. 实验内容及要求根据介绍的算术表达式文法编制调试算符优先分析程序,以便对任意输入的简单算术表达式进行分析。将用中缀式表示的算术表达式转换为用逆波兰式(后缀式 )表示的算术表达式,并计算用逆波兰式表示的算术表达式的值。程序输入一以 #结束的符号串,如:2*(3+4)# 。输出过程如下:(1)逆波兰式 (后缀式 )为: 2&3&4&+*;(2)计算结果: 14。三. 实验过程及结果(说明:实验结果可以是运行画面的抓屏,抓屏图片要尽可能的小。)代码如下:#include #include #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