文档介绍:逆波兰中间代码生成程序设计
一、 课程设计目的
通过编译原理课程设计,加深对语义翻译的理解 ,了解程序编译具体过程, 同时熟练掌握用编程语言来实现编译器的功能。
二、课程设计要求
编制一个中间代码生成程序,能将算术表达式(如带有嵌套括号)等翻 译成四元组。
程序具有通用性,即能接受各种不同的算术表达式等语法成分。
有运行实例.对于语法正确的算术表达式,能生成四元组序列,并输出 结果;对不正确的表达式,能检测出错误。
提交实习报告。
三、算法描述
算法中利用到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;j<len;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;i<len;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