Program for calculate Register Requirement for the given postfix notation
#include<stdio.h>
#include<conio.h>
#include<string.h>
struct rr
{
char nm;
int rr;
}r[200];
struct quard
{
char op1,op2,op,r;
}q[5];
int j,k;
int search(char tmp)
{ int l=0;
for(l=0;l<k;l++)
{
if(tmp==r[l].nm)
return(r[l].rr);
}
return(-1);
}
void main()
{
char a[30],c='1';
int i,len,LR,RR1;
clrscr();
printf("enter expression in postfix notation:\n ");
scanf("%s",a);
i=0;
j=0;
len=strlen(a);
while(len!=1)
{ i=0;
while(a[i]!='\0')
{
if((a[i]=='+')||(a[i]=='-')||(a[i]=='*')||(a[i]=='/'))
{ q[j].op1=a[i-2];
q[j].op2=a[i-1];
q[j].op=a[i];
q[j].r=c;
a[i-2]=c;
c++;
j++;
for(;a[i+1]!='\0';i++)
{
a[i-1]=a[i+1];
}
break;
} //if
else
i++;
} //inner while
len=len-2;
} //outer while
printf("quard table is:\n\n");
printf("op1\top2\top\tr\n");
for(i=0;i<j;i++)
{
printf("%c\t%c\t%c\t%c\n",q[i].op1,q[i].op2,q[i].op,q[i].r);
}
//register requirement
k=0;
for(i=0;i<j;i++)
{ if(i==0)
{
r[k].nm=q[i].op1;
r[k].rr=1;
k++;
r[k].nm=q[i].op2;
r[k].rr=0;
k++;
r[k].nm=q[i].op;
r[k].rr=1;
k++;
r[k].nm=q[i].r;
r[k].rr=r[k-1].rr;
k++;
}
else
{
LR=search(q[i].op1);
if(LR==-1)
{
r[k].nm=q[i].op1;
r[k].rr=1;
k++;
LR=1;
}
RR1=search(q[i].op2);
if(RR1==-1)
{
r[k].nm=q[i].op2;
r[k].rr=0;
k++;
RR1=0;
}
r[k].nm=q[i].op;
if(LR!=RR1)
r[k].rr=(LR>RR1)?LR:RR1;
else
r[k].rr=LR+1;
k++;
r[k].nm=q[i].r;
r[k].rr=r[k-1].rr;
k++;
}
}
printf("\nregister requirement table:\n");
for(i=0;i<k;i++)
{
printf("%c\t%d\n",r[i].nm,r[i].rr);
}
getch();
}
#include<conio.h>
#include<string.h>
struct rr
{
char nm;
int rr;
}r[200];
struct quard
{
char op1,op2,op,r;
}q[5];
int j,k;
int search(char tmp)
{ int l=0;
for(l=0;l<k;l++)
{
if(tmp==r[l].nm)
return(r[l].rr);
}
return(-1);
}
void main()
{
char a[30],c='1';
int i,len,LR,RR1;
clrscr();
printf("enter expression in postfix notation:\n ");
scanf("%s",a);
i=0;
j=0;
len=strlen(a);
while(len!=1)
{ i=0;
while(a[i]!='\0')
{
if((a[i]=='+')||(a[i]=='-')||(a[i]=='*')||(a[i]=='/'))
{ q[j].op1=a[i-2];
q[j].op2=a[i-1];
q[j].op=a[i];
q[j].r=c;
a[i-2]=c;
c++;
j++;
for(;a[i+1]!='\0';i++)
{
a[i-1]=a[i+1];
}
break;
} //if
else
i++;
} //inner while
len=len-2;
} //outer while
printf("quard table is:\n\n");
printf("op1\top2\top\tr\n");
for(i=0;i<j;i++)
{
printf("%c\t%c\t%c\t%c\n",q[i].op1,q[i].op2,q[i].op,q[i].r);
}
//register requirement
k=0;
for(i=0;i<j;i++)
{ if(i==0)
{
r[k].nm=q[i].op1;
r[k].rr=1;
k++;
r[k].nm=q[i].op2;
r[k].rr=0;
k++;
r[k].nm=q[i].op;
r[k].rr=1;
k++;
r[k].nm=q[i].r;
r[k].rr=r[k-1].rr;
k++;
}
else
{
LR=search(q[i].op1);
if(LR==-1)
{
r[k].nm=q[i].op1;
r[k].rr=1;
k++;
LR=1;
}
RR1=search(q[i].op2);
if(RR1==-1)
{
r[k].nm=q[i].op2;
r[k].rr=0;
k++;
RR1=0;
}
r[k].nm=q[i].op;
if(LR!=RR1)
r[k].rr=(LR>RR1)?LR:RR1;
else
r[k].rr=LR+1;
k++;
r[k].nm=q[i].r;
r[k].rr=r[k-1].rr;
k++;
}
}
printf("\nregister requirement table:\n");
for(i=0;i<k;i++)
{
printf("%c\t%d\n",r[i].nm,r[i].rr);
}
getch();
}
Output:
(It is necessary to enter the expression in POSTFIX notation)