Tuesday, November 6, 2007

Intermediate Code

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: