当前位置:文档之家› 编译原理实验报告二

编译原理实验报告二

内蒙古工业大学信息工程学院实验报告
课程名称:编译原理
实验名称:语法制导把表达式翻译成逆波兰式
实验类型:验证性□ 综合性□ 设计性□
实验室名称:
班级:学号
姓名:组别:
同组人:成绩:
实验日期:
一、实验目的
通过上机实习加深对语法指导翻译原理的理解,掌握运算符优先权的算法,将语法分析所识别的表达式变换成中间代码的翻译方法。

二、实验题目
语法制导把表达式翻译成逆波兰式
三、要求及提示
1、从左到右扫描中缀表达式,经语法分析找出中缀表达式出现的错误并给出错误的具体位置和类型。

2、设一个运算符栈存放暂时不能出现的运算符,逆波兰区存放逆波兰表达式。

3、测试所编程序,给出正确和错误的结果。

4、工具:C语言或其它高级语言
5、实验时间:4学时
实验二语法制导把表达式翻译成逆波兰式
一、实验名称
语法制导把表达式翻译成逆波兰式
二、实验目的
通过上机实习加深对语法指导翻译原理的理解,进一步掌握语法制导翻译的概念,掌握运算符优先权的算法,将语法分析所识别的表达式变换成中间代码的翻译方法。

三、表达式生成逆波兰式的算法
1、初始化△送到运算符栈。

2、扫描左括号“(”,把△送到运算符栈。

3、扫描到变量,把它送到逆波兰区。

4、扫描到运算符
(1)栈内运算符比较
a.栈内运算符>=栈外运算符,把栈内运算符送到逆波兰区。

b.栈内运算符<栈外运算符,把栈外运算符入栈。

( 2 ) 栈内是△把运算符入栈。

5、扫描右括号“)”。

( 1 )栈内是运算符,把栈内运算符送到逆波兰区。

( 2 )栈内是△则△退栈,读入下一个字符。

6、扫描到#(结束符)
( 1 )栈内是运算符,把栈内运算符送到逆波兰区。

( 2 )栈内是△结束,否则继续分析。

四、程序清单
#include<stdio.h>
#include<string.h>
int main(){
char str[100];
char exp[100];
char stack[100];
char ch;
int flag=1;
unsigned int zs;
while(true){
int i=0,j=0,t=0,top=0;
printf("---语法制导把表达式翻译成逆波兰式---\n");
printf("请输入表达式:");
scanf("%s",str);
zs=strlen(str);
str[zs]='#';
ch=str[i];
while(ch!='#'){
if((ch>='a'&&ch<'z')||(ch>='0'&&ch<='9')){
exp[t]=ch;
t++;
}
else if(ch=='('||ch=='^'){
top++;
stack[top]=ch;
}
else if(ch==')'){
while(stack[top]!='('){
exp[t]=stack[top];
top--;
t++;
}
top--;
}
else if(ch=='+'||ch=='-'){
while(top!=0&&stack[top]!='('){
exp[t]=stack[top];
top--;
t++;
}
top++;
stack[top]=ch;
}
else if(ch=='*'||ch=='/'){
while(stack[top]=='*'||stack[top]=='/'){
exp[t]=stack[top];
top--;
t++;
}
top++;
stack[top]=ch;
}
else{
printf("第%d个字母开始出错!\n",i+1);
flag=0;
break;
}
i++;
ch=str[i];
}
if(flag!=0){
while(top!=0){
exp[t]=stack[top];
t++;
top--;
}
printf("逆波兰式输出:");
for(j=0;j<t;j++)
printf("%c",exp[j]);
printf("\n");
}
}
return 0;
}
五、表达式生成逆波兰式算法的流程图
六、测试程序出现的问题及解决方法
1. 完成这个实验,在老师给定实验报告的基础上,没有做太多的弯路,做起来还算顺利,但是由于自己的编程能力不好,还是遇到了很多的困难,有挑战才有动力进步,在同学的帮助下我都一一克服了。

2. 由于编写语言的能力十分有限,在程序的调试过程中会出现了一些语法错误,根据系统的提示和查阅有关的资料,以及和同学们的讨论改正后,程序可以顺利的执行。

3. 在运行程序时,刚开始输入的符号不正确,总是出现错误的提示,不知道怎么去调试,和同学讨论之后,对自己的输入符号进行修改,得到了正确的结果。

七、测试结果
1.正确的结果:
2.错误的结果:
八、心得体会
通过这次实践,我主要有几个方面的收获:
1. 对语法制导翻译原理有了进一步的理解。

2. 对逆波兰式的翻译过程在实践中的应用有了深刻地认识和理解,把所学的知识应用于实践
中。

更深刻的理解了编译原理的实际应用。

3. 本次试验激发了我的学习兴趣,培养了我独立发现问题、分析问题、解决问题的能力。


增强了我与同学交流沟通共同解决问题的能力。

4. 理解了编译原理和各个学科之间的融合渗透,锻炼了编程的能力,达到学以致用的目的。

相关主题