admin 管理员组

文章数量: 1086019


2024年3月10日发(作者:反射机制的优缺点)

-

实验6 逆波兰式的翻译和计算

一、实验目的

通过实验加深对语法指导翻译原理的理解,掌握算符优先分析的方法,将语法分析所识

别的表达式变换成中间代码的翻译方法。

二、实验容

设计一个表示能把普通表达式〔中缀式〕翻译成后缀式,并计算出结果的程序。

三、实验要求

1、给出文法如下:

G[E]

E->T|E+T;

T->F|T*F;

F->i(E);

对应的转化为逆波兰式的语义动作如下:

(1)(2)(1)(2)

E-> Eop E {:= ||||op}

(1)(1)

E->(E) { := }

E->id { := id}

2、利用实验5中的算符优先分析算法,结合上面给出的语义动作实现逆波兰式的构造;

3、利用栈,计算生成的逆波兰式,步骤如下:

1) 中缀表达式,从文本文件读入,每一行存放一个表达式,为了降低难度,表达

式采用常数表达式;

2) 利用结合语法制导翻译的算符优先分析,构造逆波兰式;

3) 利用栈计算出后缀式的结果,并输出;

四、实验环境

PC微机

DOS操作系统或 Windows 操作系统

Turbo C 程序集成环境或 Visual C++ 程序集成环境

五、实验步骤

1、了解语法制导翻译的方法,学习后缀式构造的语义动作;

2、结合实验5的算符优先程序,设计程序构造后缀式;

3、利用栈,编程实现后缀式的计算;

4、测试程序运行效果:从文本文件中读表达式,在屏幕上输出,检查输出结果。

六、测试数据

-

输入数据:

编辑一个文本文文件e*pression.t*t,在文件中输入如下容:

正确

1+2;

(1+2)*3;

(10+20)*30+(50+60*70);

结果:

〔1〕1+2;

输出:1,2,+ 3

〔2〕(1+2)*3;

输出:1,2,+,3,* 9

〔3〕(10+20)*30+(50+60*70)

输出:10,20,+30,*50,60,70,*,+,+ 5150

七、实验报告要求

实验报告应包括以下几个局部:

1、 构造逆波兰式的语义动作;

2、 结合算符优先分析构造逆波兰式的算法和过程;

3、 语法制导翻译的运行方法;

4、 程序的测试结果和问题;

5、 实验总结。

八、实验容

源代码:

#include

#include

#include

using namespace std;

#define ma* 100

char e*[ma*];

int n;

char GetBC(FILE* fp) {

空白

char ch;

do {

ch = fgetc(fp);

} while (ch == ' ' || ch == 't' || ch == 'n');

return ch;

}

void acquire(FILE* fp){

char str[ma*];

char stack[ma*];

char ch;

int sum, i, j, t, top = 0;

i = 0;

/*读取一行表达式*/

//读取文件的字符直至ch不是


本文标签: 表达式 翻译 算符 优先 波兰