目标代码 中间代码生成-四元式设计文档
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
工程第一神刀公子
编译原理实验
实验名称:中间代码生成程序设计
指导老师:轻语
专业:计算机科学与技术
班级:LOL
学号:*******
姓名:神刀公子
2008.6.22
实验任务:
在实验4的基础上,完成以下描述赋值语句和算数表达式文法G[A]的语法制导生成中间代码四元式的过程。
A-->V:=E V--><标识符> E→E+T|E-T|T
T→T*F|T/F|F F→(E)|<标识符>
说明:
标识符的定义参见实验一
程序的功能描述
从文件中读入表达式,输出其四元式的结果序列
本程序只能生成赋值语句及算数表达式中间代码的四元式不能生成逻辑表达式及其他复杂语句中间代码的四元式,其功能还需要进一步完善。
程序结构描述
程序测试方案
测试用例一:
d=a+b*(3*n)/(b-a)
测试用例二:
x=x*(x+y-(x-y)/(z+x)-y)
实验总结
此程序基本达到了实验要求,能够生成简单的赋值及算数表达式中间代码的四元式,但其功能实在是过于简单。
第一次调试通过后程序还存在以下不足:
(1)此程序只能从文件中读入一个表达式,读入多个则会出错;
(2)所读入的表达式中若含有多于一个括号,程序会出错;
(3)括号内若多于一个表达式则会出错;
(4)在测试用例二中的分析过程明显是错误的,这足以看出程序的漏洞很多
但经过进一步优化算法,以上问题基本解决,但程序中仍然存在很多不足,例如时间效率和空间效率方面做的还不够好,要改善这些不足还需要进一步完善程序,在以后的学习生活中我会根据所学知识的不断深入而不断完善此程序,争取使其功能更加强大。
经过这次实验我更加深刻的理解了生成中间代码的算法思想,及时的将所学知识用于实践,更加深刻的掌握了所学知识。
附录
#include
#include
#include
using namespace std;
#define MAX 100
int m=0,sum=0;//sum用于计算运算符的个数
//m用于标记输入表达式中字符的个数
char JG='A';
char str[MAX];//用于存输入表达式
int token=0;//左括号的标志
/***********用于更改计算后数组中的值**************/ void change(int e)
{
int f=e+2;
char ch=str[f];
if(ch>='A'&&ch<='Z')
{
for(int l=0;l { if(str[l]==ch) str[l]=JG; } } if(str[e]>='A'&&str[e]<='Z') { for(int i=0;i { if(str[i]==str[e]) str[i]=JG; } } } void chengchuchuli(int i,int m) { i++; for( ;i<=m-1;i++)//处理乘除运算 { if(str[i]=='*'||str[i]=='/') { cout<<"("< change(i-1); str[i-1]=str[i]=str[i+1]=JG; sum--; JG=(char)(int)JG++; } } } void jiajianchuli(int j,int m) { j++; for( ;j<=m-1;j++)//处理加减运算 { if(str[j]=='+'||str[j]=='-') { cout<<"("< change(j-1); str[j-1]=str[j]=str[j+1]=JG; sum--; JG=(char)(int)JG++; } } } /*扫描一遍从文件中读入表达式*/ void scan(FILE *fin) { int p[MAX]; char ch='a'; int c=-1,q=0; while(ch!=EOF) { ch=getc(fin); while(ch==' '||ch=='\n'||ch=='\t') ch=getc(fin);//消除空格和换行符 str[m++]=ch; if(ch=='='||ch=='+'||ch=='-'||ch=='*'||ch=='/') sum++; else if(ch=='(') { p[++c]=m-1; } else if(ch==')') { q=m-1; chengchuchuli(p[c],q);//从左括号处理到又括号 jiajianchuli(p[c],q); JG=(char)(int)JG--; str[p[c]]=str[m-1]=JG; c--; JG=(char)(int)JG++; } } } /*对表达是进行处理并输出部分四元式*/ void siyuanshi() { for(int i=0;i<=m-1;i++)//处理乘除运算 { if(str[i]=='*'||str[i]=='/') { cout<<"("< change(i-1); str[i-1]=str[i]=str[i+1]=JG; sum--; JG=(char)(int)JG++; } }