中间代码生成具体实验过程含代码.docx
- 文档编号:3071751
- 上传时间:2022-11-17
- 格式:DOCX
- 页数:7
- 大小:16.88KB
中间代码生成具体实验过程含代码.docx
《中间代码生成具体实验过程含代码.docx》由会员分享,可在线阅读,更多相关《中间代码生成具体实验过程含代码.docx(7页珍藏版)》请在冰豆网上搜索。
中间代码生成具体实验过程含代码
实验三中间代码生成
学号:
1152185;姓名:
马小军实验目的
1.了解并掌握中间代码的生成过程和作用
2.了解并掌握四元式
3.体会属性文法在中间代码生成过程中的作用
。
实验环境
Windows7操作系统vs2010编程环境
实验内容
从文件中读入表达式,输出其四元式的结果序列
本程序只能生成赋值语句及算数表达式中间代码的四元式不能生成逻辑表达式及其他复杂语句中间代码的四元式
实验原理
三、以逆波兰式为例的实验设计思想及算法
(1)首先构造一个运算符栈,此运算符在栈内遵循越往栈顶优先级越高的原则。
(2)从左至右扫描该算术表达式,从第一个字符开始判断,如果该字符数字,则分析到该数字串的结束并将该数字存入数组。
(3)如果不是数字,该字符则是运算符,此时需比较优先关系。
做法如下:
将该字符与运算符栈顶的运算符的优先关系相比较。
如果,该字符优先关系高于此运算符栈顶的运算符,则将该运算符入栈。
倘若不是的话,则将此运算符栈顶的运算符从栈中弹出,将该字符入栈。
(4)重复上述操作
(2)-(3)直至扫描完整个简单算术表达式,确定所有字符都得到正确处理,我们便可以将中缀式表示的简单算术表达式转化为四元式。
下面给出算法流程图
打开文
成功N
end
Y
调用scan()函数从
文件读入表达式
输出所读入的表达
sum=0
表达式中是否有括号
调用生成四元式函数
N
Y
处理括号内
处理乘除加减和赋值运
N
Y
end
输出成功输出错误提示
实验步骤
打开并运行软件
根据提示输入要分析的源程序(文件目录下有写好的文件源文件1.txt输入即可)运行输出结果
例如将以下源文件放入test.txt
运行结果
a:
=b*c+b*d
思考
同样的思路对算法进行适当改动就可以生成其它形式的中间代码
【其他部分】
设计原理和算法思想参考
《程序设计语言编译原理》第三版国防工业出版社作者陈火旺等
附录代码
#include
#include
#include
#include
usingnamespacestd;
#defineMAX100
intm=0,sum=0;//sum用®?
于®¨²计?
算?
运?
算?
符¤?
的Ì?
个?
数ºy
//m用®?
于®¨²标À¨º记?
输º?
入¨?
表À¨ª达ä?
式º?
中D字Á?
符¤?
的Ì?
个?
数ºycharJG='A';
charstr[MAX];//用®?
于®¨²存ä?
输º?
入¨?
表À¨ª达ä?
式º?
inttoken=0;//左Á¨®括¤¡§号?
的Ì?
标À¨º志?
/***********用®?
于®¨²更¨¹改?
计?
算?
后¨®数ºy组Á¨¦中D的Ì?
值¦Ì**************/voidchange(inte)
{
}
voidchengchuchuli(inti,intm)
intf=e+2;
charch=str[f];
if(ch>='A'&&ch<='Z')
{
for(intl=0;l { } } if(str[e]>='A'&&str[e]<='Z') { for(inti=0;i { } }if(str[i]==str[e]) str[i]=JG; if(str[l]==ch) str[l]=JG; { i++; } voidjiajianchuli(intj,intm) { } /*扫¦¡§描¨¨一©? 遍À¨¦从䨮文? 件t中D读¨¢入¨? 表À¨ª达ä? 式º? */ voidscan(FILE*fin) { intp[MAX]; charch='a'; intc=-1,q=0; while(ch! =EOF) { ch=getc(fin); j++; for(;j<=m-1;j++)//处ä|理¤¨ª加¨®减? 运? 算? { if(str[j]=='+'||str[j]=='-') { cout<<"("< change(j-1); sum--; JG=(char)(int)JG++; } } for(;i<=m-1;i++)//处ä|理¤¨ª乘? 除y运? 算? { if(str[i]=='*'||str[i]=='/') { cout<<"("< change(i-1); sum--; JG=(char)(int)JG++; } } }}while(ch==''||ch=='\n'||ch=='\t')ch=getc(fin);//消? 除y空? 格? 和¨ª换? 行Dstr[m++]=ch; if(ch=='='||ch=='+'||ch=='-'||ch=='*'||ch=='/')sum++; elseif(ch=='(') { } elseif(ch==')') { q=m-1; chengchuchuli(p[c],q);//从䨮左Á¨®括¤¡§号? 处ä|理¤¨ª到Ì? 又®? 括jiajianchuli(p[c],q); str[p[c]]=str[m-1]=JG; c--; JG=(char)(int)JG++; } p[++c]=m-1; 符¤? ¤¡§号? JG=(char)(int)JG--; voidsanyuanshi() { for(inti=0;i<=m-1;i++)//处ä|理¤¨ª乘? 除y运? 算? { if(str[i]=='*'||str[i]=='/') { cout<<"("< change(i-1); sum--; JG=(char)(int)JG++; } } }for(intj=0;j<=m-1;j++)//处ä|理¤¨ª加¨®减? 运? 算? { if(str[j]=='+'||str[j]=='-') { cout<<"("< change(j-1); sum--; JG=(char)(int)JG++; } } for(intk=0;k<=m-1;k++)//处ä|理¤¨ª赋3值¦Ì运? 算? { if(str[k]=='=') { JG=(char)(int)--JG; cout<<"("< change(k+1); }str[k-1]=JG; } voidmain(){ charin[MAX];//用®? 于®¨²接¨®收º? 输º? 入¨? 输º? 出? 文? 件t名? FILE*fin;//用®? 于®¨²指? 向¨©输º? 入¨? 输º? 出? 文? 件t的Ì? 指? 针? cout<<"请? 输º? 入¨? 源¡ä文? 件t名? (ꡧ包㨹括¤¡§后¨®缀Áo名? )ê? "< cin>>in;; if((fin=fopen(in,"r"))==NULL)//判D断? 输º? 入¨? 文? 件t名? 是º? 否¤? 正y确¨¡¤{ cout<<"打䨩开a词䨺法¤¡§分¤? 析? 输º? 入¨? 文? 件t出? 错䨪! "< cout<<"*********三¨y元a式º? 如¨? 下? : êo*********"< scan(fin);//调Ì¡Â用®? 函¡¥数ºy从䨮文? 件t中D读¨¢入¨? 表À¨ª达ä? 式º? //关? 闭À? 文? 件t }system("pause"); fclose(fin); sanyuanshi(); if(sum==0)printf("成¨¦功|! ê? "); elseprintf("有®D错䨪误¨®! ê? ");
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中间 代码 生成 具体 实验 过程
![提示](https://static.bdocx.com/images/bang_tan.gif)