1、完整word版)编译原理实验报告逆波兰式分析 河南工业大学实验报告 课 程 编译原理 实验名称 实验三 逆波兰式分析 一. 实验目的 1.掌握自底向上分析中算符优先分析法的基本原理; 2.掌握优先关系表的构造方法。 二. 实验内容及要求 根据介绍的算术表达式文法编制调试算符优先分析程序,以便对任意输入的简单算术表达式进行分析。将用中缀式表示的算术表达式转换为用逆波兰式(后缀式)表示的算术表达式,并计算用逆波兰式表示的算术表达式的值。 程序输入一以#结束的符号串,如:2*(3+4)#。输出过程如下: (1)逆波兰式(后缀式)为:2
2、3&4&+*;
(2)计算结果:14。
三. 实验过程及结果
(说明:实验结果可以是运行画面的抓屏,抓屏图片要尽可能的小。)
代码如下:
#include
3、top=0; printf("*****************************************\n"); printf("*输入一个求值的表达式,以#结束。*\n"); printf("******************************************\n"); printf("算数表达式:"); i=0; /*获取用户输入的表达式*/ do{ i++; scanf("%c",&str[i]); }while(str[i]!='#' && i!=max); sum=i
4、 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;
5、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--
6、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]='#'; print
7、f("\n\t原来表达式:");
for(j=1;j 8、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 9、]*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; 10、
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();
}
截屏如下:
四. 实验中的问题及心得
这次试验让我更一步了解到自底向上分析中算符优先分析法的基本原理。






