- 1、本文档共6页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
逆波兰中间代码生成程序设计
一、 课程设计目的
通过编译原理课程设计,加深对语义翻译的理解 ,了解程序编译具体过程, 同时熟练掌握用编程语言来实现编译器的功能。
二、课程设计要求
编制一个中间代码生成程序,能将算术表达式(如带有嵌套括号)等翻 译成四元组。
程序具有通用性,即能接受各种不同的算术表达式等语法成分。
有运行实例.对于语法正确的算术表达式,能生成四元组序列,并输出 结果;对不正确的表达式,能检测出错误。
提交实习报告。
三、算法描述
算法中利用到3个数组,A数组存放表达式,B为操作符数组,C数组存放 逆波兰式。将输入的表达式存储到数组 B 中,然后将运算对象与运算对象后的 运算符之间插入空格并存入数组 A 中。
在 A 中,若为运算对象,则将运算对象压入到 C 中;若为运算符,则将其 与 B 中的数据进行优先级比较,大于则插入到 B 中,小于则将 B 中运算符插入 到 C 中;
最后将数组 C 中的数据全部输出。
四、程序结构
三。「++8
alp匚AEO匚
*
oll=mzll++lo二=mll++lo
0++8
6=8」■■++
■=8+土
(8)SO6
五、主要变量说明
A[N] -存放表达式
B[N] -操作符数组
C[N] -存放逆波兰式
T[256] -存放运算符及运算对象的优先级
char ch,chb-用于对运算符和运算对象之间进行比较
六、程序清单
#define N 50
#define nul 0 main()
{
int i=0,j=0,k=0,len;
char A[N]={nul},B[N]={nul},C[N]={nul}; int T[256]={nul}; char ch,chb;
T[=]=1;
T[+]=2;
T[-]=2;
T[*]=3;
T[/]=3;
T[%]=3;
T[(]=4;
T[)]=5;
while(1){
puts(Input the expression!for example:s=(a+b)*c-d/(e+f)); gets(B);
len=strlen(B); for(j=0;jlen;j++)
{ A[i++]=B[j];
if((T[B[j+1]]T[B[j]])(T[B[j]]==0))
A[i++]= ; B[j]=0;
}
A[i]= ;
i=0;
j=0; len=strlen(A);
for(i=0;ilen;i++)
{
ch=A[i];
chb=B[j];
if(T[ch]==4)
{
B[++j]=0;
}
else
if(T[ch]==5)
{
for(;B[j]0;j--)
{
C[k++]=B[j];
C[k++]= ;
B[j]=0;
}
j--;
}
else
if(T[ch]T[chb])
{
B[++j]=ch;
}
else
if(T[ch]T[ch]T[chb])
{
C[k++]=B[j--];
C[k++]= ;
i--;
}
else
if(T[ch]T[ch]==T[chb])
{
C[k++]=B[j--];
C[k++]= ;
i--;
}
else
{
C[k++]=ch;
}
}
for(;j0;j--)
{
C[k++]=B[j];
C[k++]= ;
B[j]=0;
} puts(C); len=strlen(C);
for(k=0;klen;k++)
{
C[k]=0;
}
i=0;
j=0;
k=0;
len=strlen(A);
while(ilen){
A[i]=0;
i++;
}
i=0;
puts(Continue? Y or N); ch=getch(); if(ch==y||ch==Y)
else break;
}
七、调试情况
在调试过程中, 我发现如果使用多位数据进行测试的话, 两个多位数据放在 一起会很难被我们区分开。 因此在输出时, 我采用空格将所有对象、 运算符全部 分开,以便于区分。
由于课程设计要求的是对所输入的任何运算式都能够转化为逆波兰式, 所以 在设计的时候,我加入了括号“ ()”。使程序能够适应 +、-、* 、/、(、)运算, 同时数据可以是数字、字母、小数等。
八、实验结果
駅 C:\¥IWIK)IS\systcB32\cB(l* se
In put the express ionffoi* example :s=a+h*c-d/(e+f -Jze
ab + c*def + / -
CunLInue? ¥ ur H
九、心得体会
通过这次课程设计,不仅使我对编译中间代码的生成有了更加深的了解, 而
且使我对编译器的工作原理也有了更深层次的认识。
在设计程序时,我们应该让我们的程序能够应付尽可能多的输入环境, 加强 程序的生存能力。当程序的迭代
您可能关注的文档
最近下载
- 专题13.4 线段的垂直平分线的判定与性质【九大题型】(举一反三)(人教版)(原卷版).docx VIP
- 2016中职对口升学语文复习教案:文言文03.doc
- 全国职业院校技能大赛高职组(商务数据分析赛项)备赛试题及答案.doc VIP
- 自愈力饮食法读书札记.docx VIP
- 校准品溯源-课件.pptx
- 六年级语文上册教材解读省公开课获奖课件说课比赛一等奖课件.pptx
- 人音版五年级上册第五单元第2课时《故乡的小路》课件.pptx
- 【技能大赛】《商务数据分析》赛项赛题及答案(第5套) .pdf VIP
- 2023年人教版数学五年级上册全套练习册含答案.doc
- 《医学影像设备学》DR数字X线摄影系统.ppt
文档评论(0)