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不是
版权声明:本文标题:编译原理实验报告6逆波兰式的翻译和计算 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://roclinux.cn/b/1710005531a553280.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论