目标代码 中间代码生成四元式设计文档Word格式.docx
《目标代码 中间代码生成四元式设计文档Word格式.docx》由会员分享,可在线阅读,更多相关《目标代码 中间代码生成四元式设计文档Word格式.docx(11页珍藏版)》请在冰豆网上搜索。
<
标识符>
EE+T|E-T|T
TT*F|T/F|FF(E)|<
说明:
标识符的定义参见实验一
程序的功能描述
从文件中读入表达式,输出其四元式的结果序列
本程序只能生成赋值语句及算数表达式中间代码的四元式
不能生成逻辑表达式及其他复杂语句中间代码的四元式,其功能还需要进一步完善。
程序结构描述
N
Y结束
Y
Y
结束
程序测试方案
测试用例一:
d=a+b*(3*n)/(b-a)
测试用例二:
x=x*(x+y-(x-y)/(z+x)-y)
实验总结
此程序基本达到了实验要求,能够生成简单的赋值及算数表达式中间代码的四元式,但其功能实在是过于简单。
第一次调试通过后程序还存在以下不足:
(1)此程序只能从文件中读入一个表达式,读入多个则会出错;
(2)所读入的表达式中若含有多于一个括号,程序会出错;
(3)括号内若多于一个表达式则会出错;
(4)在测试用例二中的分析过程明显是错误的,这足以看出程序的漏洞很多
但经过进一步优化算法,以上问题基本解决,但程序中仍然存在很多不足,例如时间效率和空间效率方面做的还不够好,要改善这些不足还需要进一步完善程序,在以后的学习生活中我会根据所学知识的不断深入而不断完善此程序,争取使其功能更加强大。
经过这次实验我更加深刻的理解了生成中间代码的算法思想,及时的将所学知识用于实践,更加深刻的掌握了所学知识。
附录
#include<
stdlib.h>
fstream>
iostream>
usingnamespacestd;
#defineMAX100
intm=0,sum=0;
//sum用于计算运算符的个数
//m用于标记输入表达式中字符的个数
charJG='
A'
;
charstr[MAX];
//用于存输入表达式
inttoken=0;
//左括号的标志
/***********用于更改计算后数组中的值**************/
voidchange(inte)
{
intf=e+2;
charch=str[f];
if(ch>
='
&
ch<
Z'
)
{
for(intl=0;
l<
m+10;
l++)
if(str[l]==ch)
str[l]=JG;
}
if(str[e]>
str[e]<
for(inti=0;
i<
m;
i++)
if(str[i]==str[e])
str[i]=JG;
}
voidchengchuchuli(inti,intm)
i++;
for(;
=m-1;
i++)//处理乘除运算
if(str[i]=='
*'
||str[i]=='
/'
)
cout<
"
("
str[i]<
"
str[i-1]<
str[i+1]<
JG<
)"
endl;
change(i-1);
str[i-1]=str[i]=str[i+1]=JG;
sum--;
JG=(char)(int)JG++;
voidjiajianchuli(intj,intm)
j++;
j<
j++)//处理加减运算
if(str[j]=='
+'
||str[j]=='
-'
str[j]<
str[j-1]<
str[j+1]<
change(j-1);
str[j-1]=str[j]=str[j+1]=JG;
/*扫描一遍从文件中读入表达式*/
voidscan(FILE*fin)
{
intp[MAX];
charch='
a'
intc=-1,q=0;
while(ch!
=EOF)
{
ch=getc(fin);
while(ch=='
'
||ch=='
\n'
\t'
)ch=getc(fin);
//消除空格和换行符
str[m++]=ch;
if(ch=='
)sum++;
elseif(ch=='
('
{
p[++c]=m-1;
}
)'
{
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++;
}
}
}
/*对表达是进行处理并输出部分四元式*/
voidsiyuanshi()
for(intj=0;
}
for(intk=0;
k<
k++)//处理赋值运算
if(str[k]=='
JG=(char)(int)--JG;
str[k]<
str[k+1]<
str[k-1]<
change(k+1);
str[k-1]=JG;
/***************主函数*******************/
voidmain(){
charin[MAX];
//用于接收输入输出文件名
FILE*fin;
//用于指向输入输出文件的指针
cout<
请输入源程序文件名(例如ceshi.txt):
cin>
>
in;
if((fin=fopen(in,"
r"
))==NULL)//判断输入文件名是否正确
endl<
打开词法分析输入文件出错!
四元式如下:
scan(fin);
//调用函数从文件中读入表达式
/********调用生成四元式的函数********/
siyuanshi();
/*********判断是否成功**********/
if(sum==0)cout<
成功!
elsecout<
有错误!
//关闭文件
fclose(fin);