编译原理-逆波兰式的产生及计算

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

学号07 成绩

编译原理上机报告

名称:逆波兰式的产生及计算

学院:信息与控制工程学院

专业:计算机科学与技术

班级:计算机1401班

姓名:叶达成

2016年11月4日

一、上机目的

通过设计、编制、调试一个典型的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,进一步掌握常用的语法分析方法。

1、选择最有代表性的语法分析方法,如LL(1) 语法分析程序、算符优先分析程序和LR分析分析程序,并至少完成两个题目。

2、选择对各种常见程序语言都用的语法结构,如赋值语句(尤指表达式)作为分析对象,并且与所选语法分析方法要比较贴切。

⑴实验前的准备

按实验的目的和要求,编写语法分析程序,同时考虑相应的数据结构。

⑵调试

调试例子应包括符合语法规则的算术表达式,以及分析程序能够判别的若干错例。

⑶输出

对于所输入的算术表达式,不论对错,都应有明确的信息告诉外界。

⑷扩充

有余力的同学,可适当扩大分析对象。譬如:

①算术表达式中变量名可以是一般标识符,还可含一般常数、数组元素、函数调用等等。

②除算术表达式外,还可扩充分析布尔、字符、位等不同类型的各种表达式。③加强语法检查,尽量多和确切地指出各种错误。

二、基本原理和上机步骤

基本原理:

将运算对象写在前面,而把运算符号写在后面。用这种表示法表示的表达式也称做后缀式。逆波兰式的特点在于运算对象顺序不变,运算符号位置反映运算顺序。采用逆波兰式可以很好的表示简单算术表达式,其优点在于易于计算机处理表达式。

上机步骤:

(1)构造一个栈,存放运算对象。

(2)读入一个用逆波兰式表示的简单算术表达式。

(3)自左至右扫描该简单算术表达式并判断该字符,如果该字符是运算对象,则将该字符入栈。若是运算符,如果此运算符是二目运算符,则将对栈顶部的两个运算对象进行该运算,将运算结果入栈,并且将执行该运算的两个运算对象从栈顶弹出。如果该字符是一目运算符,则对栈顶部的元素实施该运算,将该栈顶部的元素弹出,将运算结果入栈。

(4)重复上述操作直至扫描完整个简单算术表达式的逆波兰式,确定所有字符都得到正确处理,我们便可以求出该简单算术表达式的值。

三、上机结果

程序清单:

#include

#include<>

#include<>

#include

#include

#include

using namespace std;

char str[50]; ||ch=='+') {

ch=ex[++t];

double k=;

while(ch>='0'&&ch<='9')

{

d=d+double(ch-'0')/*k);

k=k+;

ch=ex[++t]; } }

top++;

_stack[top]=-d;} else {

_stack[top-1]=_stack[top-1]-_stack[top];

top--;

t++; }

break;

case '^': //判断是否为小数

{

ch=ex[++t];

double k=;

while(ch>='0'&&ch<='9')

{

d=d+double(ch-'0')/*k);

k=k+;

ch=ex[++t];}}

top++;

_stack[top]=d;}

ch=ex[t];}

cout<<"计算结果:"<<_stack[top]<

int main()

{

printf("请输入中缀表达式:");

scanf("%s",&str); //输入原表达式

printf("原表达式为:%s\n",str);

NiBolan(); //生成逆波兰式

Calculate(); //计算逆波兰式

return 0;

}

屏幕截图:

四、讨论与分析

通过这次的实验,知道了算符优先文法的概念以及这个文法的简单应用。通过对中缀表达式转化为后缀表达式的实验,我对算符优先级有了更深的理解。并解决了如何构造这些优先级以及如何运用他们来计算后缀表达式,同时计算出表达式的结果。算符优先文法是一种自下而上的分析法,其文法的特点是文法的产生式中不含两个相邻的非终结符。一般的表达式就属于这种文法。

相关文档
最新文档