当前位置:文档之家› 语法制导把表达式翻译成逆波兰式

语法制导把表达式翻译成逆波兰式

实验报告成绩:指导教师审核(签名):年月日
预习报告□实验报告□
语法制导把表达式翻译成逆波兰式
(一)实验目的
进一步掌握语法制导翻译的概念,理解中间语言,设计出错处理程序方法,掌握把表达式翻译成中间语言的算法。

(二)实验内容
1.从左到右扫描中缀表达式,经语法分析找出中缀表达式出现的错误并给出错误的具体位置和类型。

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

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

(三)实验要求
1.学生课前要认真阅读实验指导,理解实验内容与相关理论知识的关系,并完成预习报告
2.用C语言或其它高级语言编写程序
3.写出实验报告
实验报告成绩:指导教师审核(签名):年月日
预习报告□实验报告□
语法制导把表达式翻译成逆波兰式
(一)实验目的
通过上机实习加深对语法指导翻译原理的理解,掌握运算符优先权的算法,将语法分析所识别的表达式变换成中间代码的翻译方法。

(二)实验内容
同预习报告
(三)实验要求
1.学生课前要认真阅读实验指导,理解实验内容与相关理论知识的关系,并完成预习报告
2.用C语言或其它高级语言编写程序
3.写出实验报告
(四)实验设计思路
1)表达式生成逆波兰式的算法
1、初始化△送到运算符栈。

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

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

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

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

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

5、扫描右括号“)”。

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

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

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

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

(五)程序流程图
(五)程序代码
// zty2.cpp : 定义控制台应用程序的入口点。

//
#include<stdio.h>
#include<string.h>
#define LEN 50
int main()
{
char stack[LEN];
char exp[LEN];
char str[LEN];
char ch;
int i=-1,j=0,top=0,flag=0;
printf("请输入表达式以#号结束:\n");
scanf("%s",str);
lab:i++;
ch=str[i];
if(ch=='#')goto lab1;
else if((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')) {
exp[j]=ch;
j++;
goto lab;
}
else if(ch=='('||ch=='^')
{
top++;
stack[top]=ch;
goto lab;
}
else if(ch=='+'||ch=='-')
{
while(top!=0&&stack[top]!='(')
{
exp[j]=stack[top];
top--;
j++;
}
top++;
stack[top]=ch;
goto lab;
}
else if(ch=='*'||ch=='/')
{
while(stack[top]=='*'||stack[top]=='/')
{
exp[j]=stack[top];
top--;
j++;
}
top++;
stack[top]=ch;
goto lab;
}
else if(ch==')')
{
while(stack[top]!='(')
{
exp[j]=stack[top];
j++;
top--;
}
top--;
goto lab;
}
else
{
printf("出错字符是:%c\n",str[i]);
printf("出错位置是:%d\n",i+1);
flag=1;
}
lab1:while(!flag&&top!=0)
{
exp[j]=stack[top];
j++;
top--;
}
top=j;
if(!flag)
{
j=0;
printf("逆波兰式为:\n");
while(j<top+1)
{
printf("%c",exp[j]);
j++;
}
}
return 0;
}
(六)程序运行结果测试
测试结如下图,测试结果符合实验要求。

表达式转化为逆波兰式的算法和对语法制导翻
译原理结果如下图:
输入:a+(b*(c-d^e)+f)/m# 时,输出正确的逆波兰式。

输入:a+2@3*5#时,输出输出错误的位置和字符。

(七)调试程序出现的问题及解决的方法
实验中编程基本没什么问题,数据结构实验时曾做过逆波兰式的实验,所以比较能理解,但是对实验的理解没有吃透,对语法制导翻译的原理理解不太清楚,所以,碰到了一些难度。

(八)实验心得体会
通过本次试验,掌握了表达式转化为逆波兰式的算法,并对语法制导翻译原理有了进一步的理解。

让我知道了我们编写程序的编译器是怎么编译程序和怎么工作的,也对编译课的理论知识有了一些加深的了解。

这次试验通过实践把老师讲的理论知识得到了充分的展示,对我们的编程打下了坚实的理论知识,除此之外,它使我对编译原理这门课所涉及的理论与方法有了更清晰的、更系统的认识。

所以,这次试验让我受益匪浅。

相关主题