编译原理逆波兰式的产生及计算演示教学Word文档下载推荐.docx
- 文档编号:18414607
- 上传时间:2022-12-16
- 格式:DOCX
- 页数:11
- 大小:208.32KB
编译原理逆波兰式的产生及计算演示教学Word文档下载推荐.docx
《编译原理逆波兰式的产生及计算演示教学Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《编译原理逆波兰式的产生及计算演示教学Word文档下载推荐.docx(11页珍藏版)》请在冰豆网上搜索。
⑴实验前的准备
按实验的目的和要求,编写语法分析程序,同时考虑相应的数据结构。
⑵调试
调试例子应包括符合语法规则的算术表达式,以及分析程序能够判别的若干错例。
⑶输出
对于所输入的算术表达式,不论对错,都应有明确的信息告诉外界。
⑷扩充
有余力的同学,可适当扩大分析对象。
譬如:
①算术表达式中变量名可以是一般标识符,还可含一般常数、数组元素、函数调用等等。
②除算术表达式外,还可扩充分析布尔、字符、位等不同类型的各种表达式。
③加强语法检查,尽量多和确切地指出各种错误。
二、基本原理和上机步骤
基本原理:
将运算对象写在前面,而把运算符号写在后面。
用这种表示法表示的表达式也称做后缀式。
逆波兰式的特点在于运算对象顺序不变,运算符号位置反映运算顺序。
采用逆波兰式可以很好的表示简单算术表达式,其优点在于易于计算机处理表达式。
上机步骤:
(1)构造一个栈,存放运算对象。
(2)读入一个用逆波兰式表示的简单算术表达式。
(3)自左至右扫描该简单算术表达式并判断该字符,如果该字符是运算对象,则将该字符入栈。
若是运算符,如果此运算符是二目运算符,则将对栈顶部的两个运算对象进行该运算,将运算结果入栈,并且将执行该运算的两个运算对象从栈顶弹出。
如果该字符是一目运算符,则对栈顶部的元素实施该运算,将该栈顶部的元素弹出,将运算结果入栈。
(4)重复上述操作直至扫描完整个简单算术表达式的逆波兰式,确定所有字符都得到正确处理,我们便可以求出该简单算术表达式的值。
三、上机结果
程序清单:
#include<
iostream>
stdio.h>
stdlib.h>
algorithm>
cctype>
cstring>
usingnamespacestd;
charstr[50];
//用于存放原来的表达式
inttop;
//栈顶指针
charstack[50];
//定义栈,用于计算逆波兰式
charex[50];
//存放后缀表达式
double_stack[50];
//定义栈,用于计算逆波兰式子
intflag[50];
//用于区分+、-号的含义,0表示运算符,1表示正负号
//生成逆波兰式
voidNiBolan()
{
memset(flag,0,sizeof(flag));
//flag初始值设为0
charch=str[0];
inti=1,t=0;
top=0;
while(ch!
='
#'
)
{
switch(ch)
case'
('
:
top++;
stack[top]=ch;
break;
)'
while(stack[top]!
ex[t]=stack[top];
top--;
t++;
}
^'
while(stack[top]=='
)//设置^运算符优先级为最高
+'
-'
//当ch为+、-号是,若前面相邻字符不是'
或数字且后面相邻字符是数字时表示正负号
if(isdigit(str[i])&
&
!
isdigit(str[i-2])&
str[i-2]!
flag[t]=1;
//标记符号为正负号
ex[t++]=ch;
ch=str[i++];
while((ch>
0'
ch<
9'
)||(ch>
a'
z'
)||ch=='
.'
||ch=='
)//判别小数点
ex[t]=ch;
ch=str[i];
i++;
i--;
ex[t]='
'
;
}
else
{while(top!
=0&
stack[top]!
){
*'
/'
||stack[top]=='
)//运算符^优先级高于*和/
'
default:
)//判别小数点
}i--;
}ch=str[i];
while(top!
=0)
if(stack[top]!
printf("
error"
);
exit(0);
ex[t+1]='
\0'
逆波兰式为:
%s\n"
ex);
voidCalculate()
charch=ex[0];
intt=0;
top=-1;
if(ch=='
ch=ex[++t];
continue;
switch(ch){
if(flag[t])//'
表示正号
doubled=0;
while(ch>
d=10.0*d+double(ch-'
)//判断是否为小数
doublek=1.0;
d=d+double(ch-'
)/(10.0*k);
k=k+1.0;
}}
_stack[top]=d;
}else
_stack[top-1]=_stack[top-1]+_stack[top];
表示负号
}if(ch=='
){
_stack[top]=-d;
}else{
_stack[top-1]=_stack[top-1]-_stack[top];
//运算符为'
if(_stack[top]==0)
_stack[top-1]=1;
inttemp;
temp=_stack[top-1];
while(--_stack[top])
_stack[top-1]*=temp;
_stack[top-1]=_stack[top-1]*_stack[top];
if(_stack[top]!
_stack[top-1]=_stack[top-1]/_stack[top];
\n\tchu0error!
\n"
)//判断是否为小数
}}
ch=ex[t];
cout<
<
"
计算结果:
_stack[top]<
endl;
//printf("
%lf\n"
_stack[top]);
intmain()
请输入中缀表达式:
scanf("
%s"
&
str);
//输入原表达式
原表达式为:
str);
NiBolan();
//生成逆波兰式
Calculate();
//计算逆波兰式
return0;
屏幕截图:
四、讨论与分析
通过这次的实验,知道了算符优先文法的概念以及这个文法的简单应用。
通过对中缀表达式转化为后缀表达式的实验,我对算符优先级有了更深的理解。
并解决了如何构造这些优先级以及如何运用他们来计算后缀表达式,同时计算出表达式的结果。
算符优先文法是一种自下而上的分析法,其文法的特点是文法的产生式中不含两个相邻的非终结符。
一般的表达式就属于这种文法。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 波兰 产生 计算 演示 教学
![提示](https://static.bdocx.com/images/bang_tan.gif)