0% found this document useful (0 votes)
12 views

CD Exp 4&5

The document describes a C program to implement the back end of a compiler. It takes intermediate code as input, displays options to perform operations on it, and uses a switch case to implement the selected operation. The program reads intermediate code into an array, splits each expression into operands and operator, performs the operation, and outputs target assembly code by moving operands and result registers.

Uploaded by

kumar
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
12 views

CD Exp 4&5

The document describes a C program to implement the back end of a compiler. It takes intermediate code as input, displays options to perform operations on it, and uses a switch case to implement the selected operation. The program reads intermediate code into an array, splits each expression into operands and operator, performs the operation, and outputs target assembly code by moving operands and result registers.

Uploaded by

kumar
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 12

Ex.

No: 1 b IMPLEMENTATION OF SYMBOL TABLE


Date:
AIM:
To write a C program to implement a symbol table.
ALGORITHM :
1. Start the Program.
2. Get the input from the user with the terminating symbol ‘$’.
3. Allocate memory for the variable by dynamic memory allocation function.
4. If the next character of the symbol is an operator then only the memory is
allocated.
5. While reading , the input symbol is inserted into symbol table along
with its memory address.
6. The steps are repeated till”$”is reached.
7. To reach a variable, enter the variable to the searched and symbol table has
been checked for corresponding variable, the variable along its address is
displayed as result.
8. Stop the program.

PROGRAM :
#include<stdio.h>
#include<conio.h>
#include<malloc.h>
#include<string.h>
#include<math.h>
#include<ctype.h>
void main()
{
int i=0,j=0,x=0,n,flag=0; void *p,*add[15]; char
ch,srch,b[15],d[15],c;
//clrscr();
printf("expression terminated by $:");
while((c=getchar())!='$')
{
b[i]=c; i++;
}
n=i-1;
printf("given expression:");
i=0;
while(i<=n)
{
printf("%c",b[i]);
i++;
}
printf("symbol table\n");
printf("symbol\taddr\ttype\n");
while(j<=n)
{
c=b[j]; if(isalpha(toascii(c)))
{
if(j==n)
{
p=malloc(c);
add[x]=p; d[x]=c;
printf("%c\t%d\tidentifier\n",c,p);
}
else
{
ch=b[j+1];
if(ch=='+'||ch=='-'||ch=='*'||ch=='=')
{
p=malloc(c);
add[x]=p;
d[x]=c;
printf("%c\t%d\tidentifier\n",c,p);
x++;
}
}
} j++;
}
printf("The symbol is to be searched");
srch=getch();
for(i=0;i<=x;i++)
{
if(srch==d[i])
{
printf("symbol found\n");
printf("%c%s%d\n",srch,"@address",add[i]);
flag=1;
}
}
if(flag==0)
printf("symbol not found\n");
}

OUTPUT :
expression terminated by $:a+b+c=d$
given expression:a+b+c=dsymbol table
symbol addr type
a 12981096 identifier
b 12981208 identifier
c 12981320 identifier
d 12981512 identifier
The symbol is to be searched

RESULT :
Thus the C program to implement the symbol table was executed and the Output
is verified

Ex.No: 4 IMPLEMENT SIMPLE CODE OPTIMIZATION TECHNIQUES


Date :
AIM:
To write a C program to implement Code Optimization Techniques.
ALGORITHM:
Step 1: Start the program.
Step 2: Include the necessary header files.
Step 3: Declare necessary character arrays for input and output and also a structure to include it.
Step 4: Get the Input: Set of ‘L’ values with corresponding ‘R’ values and
Step 4: Implement the principle source of optimization techniques.
Step 5: The Output should be of Intermediate code and Optimized code after eliminating
common
expressions.
Step 6: Terminate the program.
PROGRAM
#include<stdio.h>
#include<conio.h>
#include<string.h>
struct op
{
char l;
char r[20];
}
op[10],pr[10];
void main()
{
int a,i,k,j,n,z=0,m,q;
char *p,*l;
char temp,t;
char *tem;

printf("Enter the Number of Values:");


scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("left: ");
op[i].l=getche();
printf("\tright: ");
scanf("%s",op[i].r);
}
printf("Intermediate Code\n") ;
for(i=0;i<n;i++)
{
printf("%c=",op[i].l);
printf("%s\n",op[i].r);
}
for(i=0;i<n-1;i++)
{

temp=op[i].l;
for(j=0;j<n;j++)
{
p=strchr(op[j].r,temp);
if(p)
{
pr[z].l=op[i].l;
strcpy(pr[z].r,op[i].r);
z++;
}
}
}
pr[z].l=op[n-1].l;
strcpy(pr[z].r,op[n-1].r);
z++;
printf("\nAfter Dead Code Elimination\n");
for(k=0;k<z;k++)
{
printf("%c\t=",pr[k].l);
printf("%s\n",pr[k].r);
}
for(m=0;m<z;m++)
{
tem=pr[m].r;
for(j=m+1;j<z;j++)
{
p=strstr(tem,pr[j].r);
if(p)
{
t=pr[j].l;
pr[j].l=pr[m].l;
for(i=0;i<z;i++)
{
l=strchr(pr[i].r,t) ;
if(l)
{
a=l-pr[i].r;
printf("pos: %d",a);
pr[i].r[a]=pr[m].l;
}
}
}
}
}
printf("Eliminate Common Expression\n");
for(i=0;i<z;i++)
{
printf("%c\t=",pr[i].l);
printf("%s\n",pr[i].r);
}
for(i=0;i<z;i++)
{
for(j=i+1;j<z;j++)
{
q=strcmp(pr[i].r,pr[j].r);
if((pr[i].l==pr[j].l)&&!q)
{

pr[i].l='\0';
strcpy(pr[i].r,'\0');
}
}
}
printf("Optimized Code\n");
for(i=0;i<z;i++)
{
if(pr[i].l!='\0')
{
printf("%c=",pr[i].l);
printf("%s\n",pr[i].r);
}
}
getch();
}

OUTPUT :
Enter the Number of Values:5
left: a right: a right :9
left: b right: left: e right: left: f right: r
left: e right:
Intermediate code
Intermediate Code
a=a
b=right
e=:9
f=r
e=Intermediate

After Dead Code Elimination


a =a
a =a
e =:9
e =Intermediate
pos: 0pos: 0pos: 9Eliminate Common Expression
a =a
a =a
e =:9
e =Intermediate

RESULT :
Thus the required C program for implementation of code optimization techniques
is done and the required output is obtained and verified.
Ex.No.5 IMPLEMENTING THE BACK END OF THE COMPILER
Date :
AIM:
implement the back end of a compiler which takes
ALGORITHM :
Step 1: Start the program.
Step 2: Include the necessary header files.
Step 3: Declare necessary character arrays for input and output and also a structure to include it.
Step 4: Get the Intermediate Code as the input.
Step 5: Display the options to do the various operations and use a switch case to implement that
operation.
Step 6: Terminate the program.

PROGRAM :
#include<stdio.h>
#include<stdio.h>
#include<conio.h>
#include<string.h>
void main()
{
char icode[10][30],str[20],opr[10];
int i=0;
printf("\n Enter the set of intermediate code (terminated by exit):\n");
do
{
scanf("%s",icode[i]);
} while(strcmp(icode[i++],"exit")!=0);
printf("\n target code generation");
printf("\n************************");
i=0;
do
{
strcpy(str,icode[i]);
switch(str[3])
{
case '+':
strcpy(opr,"ADD");
break;
case '-':
strcpy(opr,"SUB");
break;
case '*':
strcpy(opr,"MUL");
break;
case '/':
strcpy(opr,"DIV");
break;
}
printf("\n\tMov %c,R%d",str[2],i);
printf("\n\t%s%c,R%d",opr,str[4],i);
printf("\n\tMov R%d,%c",i,str[0]);
}while(strcmp(icode[++i],"exit")!=0);
getch();
}

OUTPUT :
Enter the set of intermediate code (terminated by exit):
d=8/4
c=6/5
a=4/6
exit

target code generation


************************
Mov 8,R0
DIV4,R0
Mov R0,d
Mov 6,R1
DIV5,R1
Mov R1,c
Mov 4,R2
DIV6,R2
Mov R2,a

RESULT:
Thus the required C program to implement the back end of the compiler is done and the required
output is obtained and verified

You might also like