Program : Intermediate Code
#include<stdio.h>
#include<conio.h>
struct //structure for generating symbol table
{
char label[15];
char opcode[15];
char operand[15];
}pgm[20];
struct //structure for printing symbol table
{
char label[25];
int addr;
}symtab[20];
struct //structure for temporary usage
{
char label[15];
}samplesym[20];
static char is[40][40]={"stop","add","sub","mult","mover","movem","comp",
"bc","div","read","print"};
static char dl[40][40]={"dc","ds"};
static char ad[40][40]={"start","end","origin","equ","ltorg"};
static char re[40][40]={"areg","breg","creg","dreg"};
void main() //main function
{
FILE *p1;
int n=0,loc=0,j=0,k=0,i=0,s=0,q=0,z1=0,fl=0,i1,ll,z=0,u=0,u1=0,ee,m=0,
int a1=0,w,temp;
char c,f[5],t[5],ff[5],tt[5],mm,q1;
clrscr();
p1=fopen("codes.txt","r");
if(p1==NULL)
printf("\n FILE CANNOT BE OPENED");
else
{
while((c=fgetc(p1))!=EOF)
{
if(c=='\n')
{
n++;
c=fgetc(p1);
}
}
}
fclose(p1);
p1=fopen("codes.txt","r");
if(p1==NULL)
printf("\n FILE CANNOT BE OPENED");
else
{
for(i=0;i<n;i++)
{
j=0;
while((c=fgetc(p1))!='\t')
pgm[i].label[j++]=c;
j=0;
while((c=fgetc(p1))!='\t')
pgm[i].opcode[j++]=c;
j=0;
while((c=fgetc(p1))!='\n')
pgm[i].operand[j++]=c;
}
fclose(p1);
printf("\n INPUT FILE IS:\n\n");
for(i=0;i<n;i++)
{
printf(" %s\t",pgm[i].label);
printf("%s\t",pgm[i].opcode);
printf("%s\t",pgm[i].operand);
printf("\n\n");
}
for(i=0;i<n;i++) //comparing symtab variables
{
if(strcmp(pgm[i].opcode,"start")==0)
loc=atoi(pgm[i].operand);
else if(strcmp(pgm[i].opcode,"ds")==0)
{
ll=atoi(pgm[i].operand);
if(strcmp(pgm[i].label,"no")!=0)
{
strcpy(symtab[k].label,pgm[i].label);
symtab[k].addr=loc;
k++;
}
loc=loc+ll;
}
else if(strcmp(pgm[i].opcode,"equ")==0)
{
s=0;
while(!u1)
{
if(pgm[i].operand[z]=='-')
{
u1=1;
}
else if(pgm[i].operand[z]=='+')
{
u1=1;
}
else
{
u1=0;
f[u]=pgm[i].operand[z];
u++;
}
z++;
}
z--;
f[u]='\0';
q=pgm[i].operand[z];
z++;
u=0;
while(z<strlen(pgm[i].operand))
{
t[u]=pgm[i].operand[z];
z++;u++;
}
t[u]='\0';
ee=atoi(t);
for(j=0;j<k;j++)
{
if(strcmp(symtab[j].label,f)==0)
{
s=symtab[j].addr;
if(q=='+')
s=s+ee;
else
s=s-ee;
break;
}
}
if(strcmp(pgm[i].label,"no")!=0)
{
strcpy(symtab[k].label,pgm[i].label);
symtab[k].addr=s;
k++;
}
}
else if(strcmp(pgm[i].opcode,"origin")==0)
{
s=0,u1=0,z=0,u=0;
while(!u1)
{
if(pgm[i].operand[z]=='-')
{
u1=1;
}
else if(pgm[i].operand[z]=='+')
{
u1=1;
}
else
{
u1=0;
ff[u]=pgm[i].operand[z];
u++;
}
z++;
}
z--;
ff[u]='\0';
q=pgm[i].operand[z];
z++; u=0;
while(z<strlen(pgm[i].operand))
{
tt[u]=pgm[i].operand[z];
z++;u++;
}
tt[u]='\0';
ee=atoi(t);
for(j=0;j<k;j++)
{
if(strcmp(symtab[j].label,ff)==0)
{
s=symtab[j].addr;
if(q=='+')
s=s+ee;
else
s=s-ee;
break;
}
}
loc=s;
}
else
{
if(strcmp(pgm[i].label,"no")!=0)
{
strcpy(symtab[k].label,pgm[i].label);
symtab[k].addr=loc;
k++;
loc++;
}
}
}
}
printf("INTERMEDIATE CODE IS\n");
//generation of intermediate code
z=0;
for(j=0;j<=k;j++)
{
if(strcmp(symtab[j].label,"\0")!=0)
{
strcpy(samplesym[z].label,symtab[j].label);
z++; }
}
for(i=0;i<n;i++)
{
if(strcmp(pgm[i].opcode,"start")==0)
{
loc=atoi(pgm[i].operand);
z=0;
for(i1=0;i1<=10;i1++)
{
if(strcmp(ad[i1],"start")==0)
{
z=i1;
break;
}
}
z++;
printf("(ad,0%d) (c,%d)\n",z,loc);
m=m+1;
}
else if(strcmp(pgm[i].opcode,"ds")==0)
{
ll=atoi(pgm[i].operand);
z=0;
for(i1=0;i1<=1;i1++)
{
if(strcmp(dl[i1],"ds")==0)
{
z=i1;
break;
}
}
z=z++;
ll=atoi(pgm[i].operand);
printf("(dl,0%d) (c,%d)\n",z,ll);
m=m+1;
loc=loc+ll;
}
else if(strcmp(pgm[i].opcode,"dc")==0)
{
z=0;
for(i1=0;i1<=1;i1++)
{
if(strcmp(dl[i1],"dc")==0)
{
z=i1;
break;
}
}
z=z++;
printf("(dl,0%d) (%s)\n",z,pgm[i].operand);
}
else if(strcmp(pgm[i].opcode,"equ")==0)
{
s=0,z=0,u1=0;
while(!u1)
{
if(pgm[i].operand[z]=='-')
{
u1=1;
}
else if(pgm[i].operand[z]=='+')
{
u1=1;
}
else
{
u1=0;
f[u]=pgm[i].operand[z];
u++;
}
z++;
}
z--;
f[u]='\0';
q1=pgm[i].operand[z];
z++;
u=0;
while(z<strlen(pgm[i].operand))
{
t[u]=pgm[i].operand[z];
z++;u++;
}
t[u]='\0';
ee=atoi(t);
for(j=0;j<k;j++)
{
if(strcmp(symtab[j].label,f)==0)
{
s=symtab[j].addr;
if(q1=='+')
s=s+ee;
else
s=s-ee;
break;
}
}
z=0;
for(i1=0;i1<=4;i1++)
{
if(strcmp(ad[i1],"equ")==0)
{
z=i1;
break;
}
}
z=z+1;
w=0;
for(q=0;q<=k;q++)
{
if(strcmp(samplesym[q].label,f)==0)
{
w=q;
break;
}
}
w=w+1;
printf("(ad,0%d) (s,%d)%c%s\n",z,w,q1,t);
m=m+1;
}
else if(strcmp(pgm[i].opcode,"origin")==0)
{
s=0,u1=0,z=0,u=0;
while(!u1)
{
if(pgm[i].operand[z]=='-')
{
u1=1;
}
else if(pgm[i].operand[z]=='+')
{
u1=1;
}
else
{
u1=0;
ff[u]=pgm[i].operand[z];
u++;
}
z++;
}
z--;
ff[u]='\0';
q1=pgm[i].operand[z];
z++;
u=0;
while(z<strlen(pgm[i].operand))
{
tt[u]=pgm[i].operand[z];
z++;u++;
}
tt[u]='\0';
ee=atoi(t);
for(j=0;j<k;j++)
{
if(strcmp(symtab[j].label,ff)==0)
{
s=symtab[j].addr;
if(q=='+')
s=s+ee;
else
s=s-ee;
break;
}
}
loc=s;
z=0;
for(i1=0;i1<=4;i1++)
{
if(strcmp(ad[i1],"origin")==0)
{
z=i1;
break;
}
}
z=z+1;
w=0;
for(q=0;q<=k;q++)
{
if(strcmp(samplesym[q].label,ff)==0)
{
w=q;
break;
}
}
w=w+1;
printf("(ad,0%d) (s,%d)%c%s\n",z,w,q1,tt);
m=m+1;
}
else if(strcmp(pgm[i].opcode,"mover")==0)
{
z=0;
for(i1=0;i1<=10;i1++)
{
if(strcmp(is[i1],"mover")==0)
{
z=i1;
break;
}
}
temp=z;
w=0,z=0,u1=0,u=0;
while(!u1)
{
if(pgm[i].operand[z]==',')
{
u1=1;
}
else
{
u1=0;
f[u]=pgm[i].operand[z];
u++;
}
z++;
}
z--;
f[u]='\0';
q1=pgm[i].operand[z];
z++;
u=0;
while(z<strlen(pgm[i].operand))
{
t[u]=pgm[i].operand[z];
z++;u++;
}
t[u]='\0';
for(q=0;q<=k;q++)
{
if(strcmp(re[q],f)==0)
{
fl=q;
break;
}
}
fl++;
a1=0;
for(q=0;q<=k;q++)
{
if(strcmp(samplesym[q].label,t)==0)
{
a1=q;
break;
}
}
a1++;
printf("(is,0%d) (%d)(s,%d)\n",temp,fl,a1);
m=m+1;
loc=loc+1;
}
else if(strcmp(pgm[i].opcode,"add")==0)
{
z1=0;
for(i1=0;i1<=10;i1++)
{
if(strcmp(is[i1],"add")==0)
{
z1=i1;
break;
}
}
z1++;
w=0,z=0,u1=0;
while(!u1)
{
if(pgm[i].operand[z]==',')
{
u1=1;
}
else
{
u1=0;
f[u]=pgm[i].operand[z];
u++;
}
z++;
}
z--;
f[u]='\0';
//splitting opernds of mover
q1=pgm[i].operand[z];
z++;
u=0;
while(z<strlen(pgm[i].operand))
{
t[u]=pgm[i].operand[z];
z++;u++;
}
t[u]='\0';
z=0;
for(q=0;q<=k;q++)
{
if(strcmp(re[q],f)==0)
{
z=q;
break;
}
}
z=z+1;
for(q=0;q<=k;q++)
{
if(strcmp(samplesym[q].label,t)==0)
{
a1=q;
break;
}
}
a1++;
printf("(is,0%d) (%d)(s,%d)\n",z1,z,a1);
m=m+1;
loc=loc+1;
}
else if(strcmp(pgm[i].opcode,"movem")==0)
{
z=0;
for(i1=0;i1<=10;i1++)
{
if(strcmp(is[i1],"movem")==0)
{
z=i1;
break;
}
}
temp=z;
//splitting opernds of movem
w=0,z=0,u1=0,u=0;
while(!u1)
{
if(pgm[i].operand[z]==',')
{
u1=1;
}
else
{
u1=0;
f[u]=pgm[i].operand[z];
u++;
}
z++;
}
z--;
f[u]='\0';
q1=pgm[i].operand[z];
z++;
u=0;
while(z<strlen(pgm[i].operand))
{
t[u]=pgm[i].operand[z];
z++;u++;
}
t[u]='\0';
for(q=0;q<=k;q++)
{
if(strcmp(re[q],f)==0)
{
fl=q;
break;
}
}
fl++;
for(q=0;q<=k;q++)
{
if(strcmp(samplesym[q].label,t)==0)
{
a1=q;
break;
}
}
a1++;
printf("(is,0%d) (%d)(s,%d)\n",temp,fl,a1);
m=m+1;
loc=loc+1;
}
else if(strcmp(pgm[i].opcode,"print")==0)
{
z=0;
for(i1=0;i1<=10;i1++)
{
if(strcmp(is[i1],"print")==0)
{
z=i1;
break;
}
}
w=0;
for(q=0;q<=k;q++)
{
if(strcmp(samplesym[q].label,pgm[i].operand)==0)
{
w=q;
break;
}
}
w=w+1;
printf("(is,%d) (s,%d)\n",z,w);
m=m+1;
loc=loc+1;
}
else if(strcmp(pgm[i].opcode,"stop")==0)
{
z=0;
for(i1=0;i1<=10;i1++)
{
if(strcmp(ad[i1],"stop")==0)
{
z=i1;
break;
}
}
z++;
printf("(is,0%d)\n",z);
m=m+1;
loc=loc+1;
}
else if(strcmp(pgm[i].opcode,"end")==0)
{
z=0;
for(i1=0;i1<=4;i1++)
{
if(strcmp(ad[i1],"end")==0)
{
z=i1;
break;
}
}
z=z+1;
printf("(ad,0%d)\n",z);
m=m+1;
loc=loc+1;
}
}
getch();
}
0 comments:
Post a Comment