算术表达式到四元式翻译的编译程序设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《编译原理》实验报告
班级学号
姓名
成绩
指导教师
2012 年 7 月
实验一
1实验时间: 2012-07-07
2实验地点: 6#503
3实验题目:算术表达式到四元式翻译的编译程序设计
4实验目的:
该实验的目的是让学生掌握程序设计语言编译程序构造的一般原理、基本设计方法、主要实现技术和一些自动构造的工具。通过该实验的学习,使我们较好的掌握编译原理的基本原理和基础技术、编译原理中涉及的基本算法、基本构造和主要实现技术,从而让我们了解将高级程序设计语言源程序编译成计算机能处理的目标代码语言的整个过程,基本掌握计算机系统软件之一编译程序的构造原理及相关技术,同时,还可以提高我们计算机专业素质,培养我们的抽象思维能力。
5实验内容:
设计内容及要求:设计一个语法制导翻译器,将算术表达式翻译成四元式。要求:先确定一个定义算术表达式的文法,为其设计一个语法分析程序,为每条产生式配备一个语义子程序,按照一遍扫描的语法制导翻译方法,实现翻译程序。对用户输入的任意一个正确的算术表达式,程序将其转换成三.四元式输出(可按一定格式输出到指定文件中)。
6实验预习:
四元式是一种更接近目标代码的中间代码形式。由于这种形式的中间代码便于优化处理,因此,在目前许多编译程序中得到了广泛的应用。
具体的形式犹如:(1)(op,arg1,arg2,result)
例如,语句a=b+(c-d)*e+f/g*(h-i+j/(k+l*m-n))的四元式表示如
1).检查输入的元素;
2).如果是一个操作数,则进栈;
3).如果是操作符,则
i). 如果符号栈不为空或者此操作符的优先级大于符号栈栈顶的优先级,则将此运算符压栈;
ii).如果符号栈不为空或者此操作符的优先级小于符号栈栈顶的优先级,栈顶操作符出栈并进行相应的操作;
4).假定输入完毕,栈中剩余的所有操作符出栈并进行相应操作。7总体设计描述:
按照顺序将任意一个正确的算术表达式拆分成操作符和操作数部分并入栈,如后比较优先级按照优先级高低出栈,执行操作
将算术表达式转换成四元式输出。
本程序共有两个函数,一个将算术表达式翻译成四元式的函数int translate(string s),是本程序的主要函数;另一个是主函数,负责调用翻译函数和输入输出处理
运行步骤与结果:
程序清单:
#include "string.h"
#include "stdio.h"
char w;
int j=1;
struct TOKEN
{
char t;
int i;
} ;
struct TOKEN word, sem[10];
int i_sem;
struct QT
{
char w;
struct TOKEN word1; struct TOKEN word2; struct TOKEN temp; } ;
char exp[50];
int i=0;
struct QT qt[30];
int q=0;
int D();
int E();
int T();
int F();
void next();
void newt();
void quat(char);
int main()
{
clrscr();
printf("please input your expression: "); scanf(" %s",exp);
next();
D();
if (w=='\0')
{
printf("\n");
for (i=0;i { printf(" (%d) ",i+1); if(qt[i].w!='='){ printf(" ( %c",qt[i].w); if (qt[i].word1.t!='t') printf(" , %c",qt[i].word1.t); else printf(" , %c%d",qt[i].word1.t,qt[i].word1.i); if (qt[i].word2.t!='t') printf(" , %c",qt[i].word2.t); else printf(" , %c%d",qt[i].word2.t,qt[i].word2.i); printf(" , %c%d )\n",qt[i].temp.t,qt[i].temp.i); } else { printf(" ( %c",qt[i].w); printf(" , %c%d ",qt[i-1].temp.t,qt[i-1].temp.i); printf(" , _"); printf(" , %c)",qt[i].word1.t); } } getch(); } else printf("err"); printf("\nHello World!\n"); return 0; } int D() { char w0; E(); while ( w=='=') { w0=w; next(); E(); quat(w0); } return 1; } int E() { char w1;