欢迎来到天天文库
浏览记录
ID:11190575
大小:59.60 KB
页数:6页
时间:2018-07-10
《逆波兰中间代码生成程序设计》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、逆波兰中间代码生成程序设计一、课程设计目的通过编译原理课程设计,加深对语义翻译的理解,了解程序编译具体过程,同时熟练掌握用编程语言来实现编译器的功能。二、课程设计要求(1)编制一个中间代码生成程序,能将算术表达式(如带有嵌套括号)等翻译成四元组。(2)程序具有通用性,即能接受各种不同的算术表达式等语法成分。(3)有运行实例.对于语法正确的算术表达式,能生成四元组序列,并输出结果;对不正确的表达式,能检测出错误。(4)提交实习报告。三、算法描述算法中利用到3个数组,A数组存放表达式,B为操作符数组,C数组存放逆波兰式。将输入的表达式存储到数组B中,然后将运算对象与运算对象
2、后的运算符之间插入空格并存入数组A中。在A中,若为运算对象,则将运算对象压入到C中;若为运算符,则将其与B中的数据进行优先级比较,大于则插入到B中,小于则将B中运算符插入到C中;最后将数组C中的数据全部输出。四、程序结构gets(B)A[i++]=B[j](T[B[j+1]]>T[B[j]])&&(T[B[j]]==0)A[i++]='';B[j]=0;B[j]=0;是否T[ch]==4B[++j]=0是否B[j]>0T[ch]==5是否是C[k++]=B[j];C[k++]='';B[j]=0;否T[ch]>T[chb]B[++j]=ch;是T[ch]&&T[ch]<
3、T[chb]否C[k++]=B[j--];C[k++]='';i--;是T[ch]&&T[ch]==T[chb]否C[k++]=B[j--];C[k++]='';i--;是否C[k++]=ch;j>0C[k++]=B[j];C[k++]='';B[j]=0;是否puts(C);一、主要变量说明A[N]-存放表达式B[N]-操作符数组C[N]-存放逆波兰式T[256]-存放运算符及运算对象的优先级charch,chb-用于对运算符和运算对象之间进行比较二、程序清单#defineN50#definenul0main(){inti=0,j=0,k=0,len;charA[N]
4、={nul},B[N]={nul},C[N]={nul};intT[256]={nul};charch,chb;T['=']=1;T['+']=2;T['-']=2;T['*']=3;T['/']=3;T['%']=3;T['(']=4;T[')']=5;while(1){puts("Inputtheexpression!forexample:s=(a+b)*c-d/(e+f)");gets(B);len=strlen(B);for(j=0;jT[B[j]])&&(T[B[j]]==0))A[i++
5、]='';B[j]=0;}A[i]='';i=0;j=0;len=strlen(A);for(i=0;i0;j--){C[k++]=B[j];C[k++]='';B[j]=0;}j--;}elseif(T[ch]>T[chb]){B[++j]=ch;}elseif(T[ch]&&T[ch]6、{C[k++]=B[j--];C[k++]='';i--;}else{C[k++]=ch;}}for(;j>0;j--){C[k++]=B[j];C[k++]='';B[j]=0;}puts(C);len=strlen(C);for(k=0;k7、8、ch=='Y');elsebreak;}}一、调试情况在调试过程中,我发现如果使用多位数据进行测9、试的话,两个多位数据放在一起会很难被我们区分开。因此在输出时,我采用空格将所有对象、运算符全部分开,以便于区分。由于课程设计要求的是对所输入的任何运算式都能够转化为逆波兰式,所以在设计的时候,我加入了括号“()”。使程序能够适应+、-、*、/、(、)运算,同时数据可以是数字、字母、小数等。一、实验结果二、心得体会通过这次课程设计,不仅使我对编译中间代码的生成有了更加深的了解,而且使我对编译器的工作原理也有了更深层次的认识。在设计程序时,我们应该让我们的程序能够应付尽可能多的输入环境,加强程序的生存能力。当程序的迭代多、层次比较烦乱的时候,
6、{C[k++]=B[j--];C[k++]='';i--;}else{C[k++]=ch;}}for(;j>0;j--){C[k++]=B[j];C[k++]='';B[j]=0;}puts(C);len=strlen(C);for(k=0;k7、8、ch=='Y');elsebreak;}}一、调试情况在调试过程中,我发现如果使用多位数据进行测9、试的话,两个多位数据放在一起会很难被我们区分开。因此在输出时,我采用空格将所有对象、运算符全部分开,以便于区分。由于课程设计要求的是对所输入的任何运算式都能够转化为逆波兰式,所以在设计的时候,我加入了括号“()”。使程序能够适应+、-、*、/、(、)运算,同时数据可以是数字、字母、小数等。一、实验结果二、心得体会通过这次课程设计,不仅使我对编译中间代码的生成有了更加深的了解,而且使我对编译器的工作原理也有了更深层次的认识。在设计程序时,我们应该让我们的程序能够应付尽可能多的输入环境,加强程序的生存能力。当程序的迭代多、层次比较烦乱的时候,
7、
8、ch=='Y');elsebreak;}}一、调试情况在调试过程中,我发现如果使用多位数据进行测
9、试的话,两个多位数据放在一起会很难被我们区分开。因此在输出时,我采用空格将所有对象、运算符全部分开,以便于区分。由于课程设计要求的是对所输入的任何运算式都能够转化为逆波兰式,所以在设计的时候,我加入了括号“()”。使程序能够适应+、-、*、/、(、)运算,同时数据可以是数字、字母、小数等。一、实验结果二、心得体会通过这次课程设计,不仅使我对编译中间代码的生成有了更加深的了解,而且使我对编译器的工作原理也有了更深层次的认识。在设计程序时,我们应该让我们的程序能够应付尽可能多的输入环境,加强程序的生存能力。当程序的迭代多、层次比较烦乱的时候,
此文档下载收益归作者所有