目标代码 中间代码生成四元式设计文档.docx
- 文档编号:27397940
- 上传时间:2023-06-30
- 格式:DOCX
- 页数:11
- 大小:85.47KB
目标代码 中间代码生成四元式设计文档.docx
《目标代码 中间代码生成四元式设计文档.docx》由会员分享,可在线阅读,更多相关《目标代码 中间代码生成四元式设计文档.docx(11页珍藏版)》请在冰豆网上搜索。
目标代码中间代码生成四元式设计文档
工程第一神刀公子
编译原理实验
实验名称:
中间代码生成程序设计
指导老师:
轻语
专业:
计算机科学与技术
班级:
LOL
学号:
0000001
姓名:
神刀公子
2008.6.22
实验任务:
在实验4的基础上,完成以下描述赋值语句和算数表达式文法G[A]的语法制导生成中间代码四元式的过程。
A-->V:
=EV--><标识符>E→E+T|E-T|T
T→T*F|T/F|FF→(E)|<标识符>
说明:
标识符的定义参见实验一
程序的功能描述
从文件中读入表达式,输出其四元式的结果序列
本程序只能生成赋值语句及算数表达式中间代码的四元式
不能生成逻辑表达式及其他复杂语句中间代码的四元式,其功能还需要进一步完善。
程序结构描述
N
Y结束
N
Y
N
Y
结束
程序测试方案
测试用例一:
d=a+b*(3*n)/(b-a)
测试用例二:
x=x*(x+y-(x-y)/(z+x)-y)
实验总结
此程序基本达到了实验要求,能够生成简单的赋值及算数表达式中间代码的四元式,但其功能实在是过于简单。
第一次调试通过后程序还存在以下不足:
(1)此程序只能从文件中读入一个表达式,读入多个则会出错;
(2)所读入的表达式中若含有多于一个括号,程序会出错;
(3)括号内若多于一个表达式则会出错;
(4)在测试用例二中的分析过程明显是错误的,这足以看出程序的漏洞很多
但经过进一步优化算法,以上问题基本解决,但程序中仍然存在很多不足,例如时间效率和空间效率方面做的还不够好,要改善这些不足还需要进一步完善程序,在以后的学习生活中我会根据所学知识的不断深入而不断完善此程序,争取使其功能更加强大。
经过这次实验我更加深刻的理解了生成中间代码的算法思想,及时的将所学知识用于实践,更加深刻的掌握了所学知识。
附录
#include
#include
#include
usingnamespacestd;
#defineMAX100
intm=0,sum=0;//sum用于计算运算符的个数
//m用于标记输入表达式中字符的个数
charJG='A';
charstr[MAX];//用于存输入表达式
inttoken=0;//左括号的标志
/***********用于更改计算后数组中的值**************/
voidchange(inte)
{
intf=e+2;
charch=str[f];
if(ch>='A'&&ch<='Z')
{
for(intl=0;l { if(str[l]==ch) str[l]=JG; } } if(str[e]>='A'&&str[e]<='Z') { for(inti=0;i { if(str[i]==str[e]) str[i]=JG; } } } voidchengchuchuli(inti,intm) { 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++; } } } voidjiajianchuli(intj,intm) { 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++; } } } /*扫描一遍从文件中读入表达式*/ voidscan(FILE*fin) { intp[MAX]; charch='a'; intc=-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++; elseif(ch=='(') { p[++c]=m-1; } elseif(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++; } } } /*对表达是进行处理并输出部分四元式*/ voidsiyuanshi() { for(inti=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++; } } for(intj=0;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++; } } for(intk=0;k<=m-1;k++)//处理赋值运算 { if(str[k]=='=') { JG=(char)(int)--JG; cout<<"("< sum--; change(k+1); str[k-1]=JG; } } } /***************主函数*******************/ voidmain(){ charin[MAX];//用于接收输入输出文件名 FILE*fin;//用于指向输入输出文件的指针 cout<<"请输入源程序文件名(例如ceshi.txt): "; cin>>in; cout< if((fin=fopen(in,"r"))==NULL)//判断输入文件名是否正确 { cout< "< } cout<<"四元式如下: "< scan(fin);//调用函数从文件中读入表达式 /********调用生成四元式的函数********/ siyuanshi(); /*********判断是否成功**********/ if(sum==0)cout<<"成功! "< elsecout<<"有错误! "< //关闭文件 fclose(fin); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 目标代码 中间代码生成四元式设计文档 目标 代码 中间 生成 四元式 设计 文档