Lab Manual Compiler Lab: Viii Sem Btech (Cse/It)
Lab Manual Compiler Lab: Viii Sem Btech (Cse/It)
Lab Manual Compiler Lab: Viii Sem Btech (Cse/It)
COMPILER LAB
VIII SEM BTECH (CSE/IT)
CP 452 COMPILER LAB C(L,T,P) = 2 (0,0,2+2)
1,2 Write a Program to identify data storage statements in an 8086 assembly language program and
estimate the size of data segment.
4,5. Extend the above program to implement simple and recursive macro expansion.
7, 8 Write a program to parse source code string of C-language and identify token in terms of keywords
and identifiers.
10. Write a program to optimize the source program for ’operator strength reduction’, ‘dead code
elimination’ and frequency reduction’ transformation.
11, 12 Design a simple high level language containing arithmetic and logic operations pointers, branch
and loop instructions. Write its lexical analyzer using lex.
PROGRAM1
AIM: Write a program to identify data storage statements in an 8086 assembly language
program.
// Source.C
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
struct source
{
char label[10],instr[10],operand[10];
}src;
struct pseudo
{
char code[10];
}ps;
struct result
{
intaddr;
char label[10],instr[10],operand[10];
}rst;
while(!feof(s))
{
fscanf(s,"%s%s%s",src.label,src.instr,src.operand);
d=detect(src.instr);
if(d==1)
{
if(strcmp(src.instr,"START")==0)
addr=atoi(src.operand);
else if(strcmp(src.instr,"WORD")==0)
addr=rst.addr+3;
else if(strcmp(src.instr,"RESW")==0)
addr=rst.addr+(atoi(src.operand)*3);
else if(strcmp(src.instr,"RESB")==0)
addr=rst.addr+atoi(src.operand);
else if(strcmp(src.instr,"BYTE")==0)
addr=rst.addr+(strlen(src.operand)-3);
else
addr=rst.addr+3;
strcpy(rst.label,src.label);
strcpy(rst.instr,src.instr);
strcpy(rst.operand,src.operand);
fprintf(r,"%d\t%s\t%s\t%s\n",rst.addr,rst.label,rst.instr,rst.operand);
rst.addr=addr;
}
else
{
printf("Error Encounted");
fclose(s);
fclose(r);
getch();
}
}
fclose(s);
fclose(r);
getch();
}
Output
START
READ
WORD
BYTE
RESW
RESB
END
A RESB 100
LOOP READ A
B BYTE C"LOOP"
C WORD 100
G RESW 5
1110 G RESW 5
AIM: Write a program to identify data storage statements in an 8086 assembly language
program and estimate the size of data segment.
// Source.C
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
struct source
{
char label[10],instr[10],operand[10];
}src;
struct pseudo
{
char code[10];
}ps;
struct result
{
intaddr;
char label[10],instr[10],operand[10];
}rst;
void main()
{
FILE *s,*r;
int d=0,addr;
clrscr();
s=fopen("source.txt","r");
r=fopen("result.txt","w");
while(!feof(s))
{
fscanf(s,"%s%s%s",src.label,src.instr,src.operand);
d=detect(src.instr);
if(d==1)
{
if(strcmp(src.instr,"START")==0){
addr=atoi(s.operand);
size=0;
}
else if(strcmp(src.instr,"WORD")==0){
addr=rst.addr+3;
size=addr-res.address;
}
else if(strcmp(src.instr,"RESW")==0){
addr=rst.addr+(atoi(src.operand)*3);
size=addr-res.address;
}
else if(strcmp(src.instr,"RESB")==0){
addr=rst.addr+atoi(src.operand);
size=addr-res.address;
}
else if(strcmp(src.instr,"BYTE")==0){
addr=rst.addr+(strlen(src.operand)-3);
size=addr-res.address;
}
else{
addr=rst.addr+3;
size=addr-res.address;
}
strcpy(rst.label,src.label);
strcpy(rst.instr,src.instr);
strcpy(rst.operand,src.operand);
fprintf(r,"%d\t%s\t%s\t%s\n",rst.addr,rst.label,rst.instr,rst.operand);
rst.addr=addr;
}
else
{
printf("Error Encounted");
fclose(s);
fclose(r);
getch();
}
}
fclose(s);
fclose(r);
getch();
}
START
READ
WORD
BYTE
RESW
RESB
END
A RESB 100
LOOP READ A
B BYTE C"LOOP"
C WORD 100
G RESW 5
1110 G RESW 5 15 15
//Macro.C
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
struct source
{
char label[10], instr[10], operand[20];
}src;
struct result
{
char label[10],instr[10], operand[20];
}rst;
void main()
{
FILE *s,*r;
clrscr();
s=fopen("source1.txt","r");
r=fopen("resultmacro.txt","w");
while(!feof(s))
{
fscanf(s,"%s%s%s",src.label,src.instr,src.operand);
if(strcmp(src.instr,"MACRO")==0)
{
while(strcmp(src.instr,"MEND")!=0)
{
fprintf(r,"%s\t%s\t%s\n",rst.label,rst.instr,rst.operand);
strcpy(rst.label,src.label);
strcpy(rst.instr,src.instr);
strcpy(rst.operand,src.operand);
fscanf(s,"%s%s%s",src.label,src.instr,src.operand);
}
}
}
printf("MACRO Completed");
fclose(s);
fclose(r);
getch();
}
NULL READ N1
NULL READ N2
NULL END
AIM: Write a program to extend the third program to implement simple macro expansion.
//Source.C
#include<stdio.h>
#include<conio.h>
#include<ctype.h>
#include<dos.h>
structmnt
char name[20];
intmdtindex;
intSkipFlag;
}mnt[10];
structmdt
intsrno;
charinst[20];
}mdt[10];
structala
int index;
chararg[20];
}ala[10];
intmntc,mdtc,alac;
char *p;
returnstr;
strncpy(buffer, str, p-str); // Copy characters from 'str' start to 'orig' st$
buffer[p-str] = '\0';
sprintf(buffer+(p-str),"%s%s",rep,p+strlen(orig));
return buffer;
else
replace_str(buffer,orig,rep);
voiddispALA()
int i;
printf("\nIndex\tArgument");
printf("\n------------------");
for(i=0;i<alac;i++)
printf("\n %d %s",ala[i].index,ala[i].arg);
voiddispMDT()
int i;
printf("\nIndex\tArgument");
printf("\n------------------");
for(i=0;i<mdtc;i++)
printf("\n %d %s",mdt[i].srno,mdt[i].inst);
void pass1()
char ch,ch1;
int flag=1;
int i=0,j=0,k=0,l=0;
char token[10],token1[10];
char temp[5],temp1[5];
chartline[80],line[80];
FILE *src;
FILE *dest;
clrscr();
strcpy(temp,"#");
src = fopen("MACRO.txt","r");
dest = fopen("op.c","w");
do{
do{
ch = fgetc(src);
token[i] = ch;
i++;
token[i-1] = '\0';
if(!strcmp(token,"macro"))
do{
ch1 = fgetc(src);
token1[j] = ch1;
j++;
token1[j-1] = '\0';
strcpy(mnt[mntc].name,token1);
mnt[mntc].mdtindex = mdtc;
mntc++;
if(ch1=='\n')
mnt[mntc-1].SkipFlag = 1;
goto Mid;
}
//-------------------------------------
//Create ALA
//-------------------------------------
ch1 = fgetc(src);
if(ch1=='&')
flag=1;
if(ch1==','||ch1=='\n')
token1[k]='\0';
flag=0;
ala[alac].index = alac;
strcpy(ala[alac].arg,token1);
alac++;
k=0;
if(flag==1)
token1[k++] = ch1;
//-----------------------------------------
Mid:
flag=1;
j=0;
do
line[0]='\0';
do{ //MDT
ch1 = fgetc(src);
line[j++]=ch1;
line[j-1]='\0';
for(l = 0 ;l<alac;l++)
sprintf(temp1,"%d",l); //0
strcat(temp,temp1); //#0
sprintf(tline,"%s",replace_str(line,ala[l].arg,temp));
// if(strcmp(tline,""))
strcpy(line,tline);
strcpy(temp,"#");
strcpy(mdt[mdtc].inst,line);
mdt[mdtc].srno = mdtc;
mdtc++;
j=0;
}while(strcmp(line,"mend"));
ch = ' ';
}//end if
else
fprintf(dest,"%s",token);
//---------------------------------------------------------------
if(ch=='\n')
fprintf(dest,"\n");
if(ch==' ')
fprintf(dest," ");
//----------------------------------------------------------------
if(isspace(ch))
token[0]='\0';
i=0;
else
token[0]= ch;
token[1]= '\0';
i=1;
}while(ch!=EOF); //Outer od
fclose(src);
fclose(dest);
//----------------------------------------------------------------
voiddisp()
int i;
charch;
FILE *src;
src = fopen("op.c","r");
do{
ch = fgetc(src);
printf("%c",ch);
}while(ch!=EOF);
}
//----------------------------------------------------------------
void pass2()
charch;
int counter=0;
intstart_index;
intlen,flag=0,sflag=0;
int i = 0,j=0,k=0,l=0;
char token[10];
char token1[10];
char temp[5],temp1[5];
chartline[80];
char line[80];
charrepl[10];
FILE *src;
alac = 0;
strcpy(temp,"#");
src = fopen("op.c","r");
do
ch = fgetc(src);
token[i] = ch;
i++;
}while(ch!=EOF && !isspace(ch));
token[i-1] = '\0';
//--------------------------------------------
for(j=0;j<mntc;j++)
sflag = 1;
start_index = mnt[j].mdtindex;
if(mnt[j].SkipFlag==1)
goto Next;
ch1 = fgetc(src);
flag=1;
if(ch1==','||ch1=='\n')
token1[k]='\0';
flag=0;
ala[alac].index = alac;
strcpy(ala[alac].arg,token1);
alac++;
k=0;
counter++;
if(flag==1)
token1[k++] = ch1;
//-----------------------------------------
Next:
k = counter;
do
strcpy(line,mdt[start_index].inst);
if(!strcmp(line,"mend"))
break;
for(l=0;l<k;l++)
strcpy(temp,"#");
strcpy(repl,ala[l].arg); //repl = 10
sprintf(tline,"%s",replace_str(line,temp,repl));
if(strcmp(tline,""))
strcpy(line,tline);
printf("\n%s",line);
start_index++;
}while(strcmp(line,"mend"));
printf("\n");
sflag = 1;
}//end if
if(sflag==0)
printf("%s",token);
if(ch=='\n')
printf("\n");
if(ch==' ')
printf(" ");
if(isspace(ch))
token[0]='\0';
i=0;
else
token[0]= ch;
token[1]= '\0';
i=1;
sflag = 0;
counter = 0;
alac = 0;
token1[0] = '\0';
k = 0;
}while(ch!=EOF);
fclose(src);
//-----------------------------------
void main()
clrscr();
pass1();
printf("\n---------------------------");
printf("\nInput Program : ");
printf("\n---------------------------\n");
disp();
printf("\n---------------------------");
printf("\n---------------------------\n");
dispALA();
printf("\n---------------------------");
printf("\n---------------------------\n");
dispMDT();
printf("\n----------------------------\n");
pass2();
getch();
Input File:OP.C
MACRO
MOVER AREG,&Y
AGO .LAST
.LASTMEND
Output File:Macro.txt
MACRO
TEST &X, &Y, &Z
MOVER AREG,&Y
AGO .LAST
.LAST MEND
PROGRAM 7and 8
AIM: Write a program to parse source code string of C-language and identify token in
terms ofkeywords and identifiers.
//Source.C
#include<stdio.h>
#include<conio.h>
#include
#include
FILE *fp;
char delim[14]={' ','\t','\n',',',';','(',')','{','}','[',']','#','<','>'};
char oper[7]={'+','-','*','/','%','=','!'};
char key[21]
[12]={"int","float","char","double","bool","void","extern","unsigned","goto","static","class",
"struct","for","if","else","return","register","long","while","do"};
char predirect[2][12]={"include","define"};
char header[6][15]={"stdio.h","conio.h","malloc.h","process.h","string.h","ctype.h"};
void skipcomment();
void analyze();
void check(char []);
int isdelim(char);
int isop(char);
int fop=0,numflag=0,f=0;
char c,ch,sop;
void main()
{
char fname[12];
clrscr();
printf("\n enter filename:");
scanf("%s",fname);
fp=fopen(fname,"r");
if(fp==NULL)
printf("\n the file does not exist");
else
analyze();
printf("\n end of file \n");
getch();
}
void analyze()
{
char token[50];
int j=0;
while(!feof(fp))
{
c=getc(fp);
if(c=='/')
{
//skip comment();
}
else if(c==’ ‘)
while((c=getc(fp))!="");
else if(isalpha(c))
{
if(numflag==1)
{
token[j]='\0';
check(token);
numflag=0;
j=0;
f=0;
}
else
{
token[j]=c;
j++;
}
if(f==0)
f=1;
}
else if(isalnum(c))
{
if(numflag==0)
numflag=1;
token[j]=c;
j++;
}
else
{
if(isdelim(c))
{
if(numflag==1)
{
token[j]='\0';
check(token);
numflag=0;
}
if(f==1)
{
token[j]='\0';
numflag=0;
check(token);
}
j=0;
f=0;
printf("\n delimiters \t%c",c);
}
else if(isop(c))
{
if(numflag==1)
{
token[j]='\0';
check(token);
numflag=0;
j=0;
f=0;
}
if(f==1)
{
token[j]='\0';
j=0;
f=0;
numflag=0;
check(token);
}
if(fop==1)
{
fop=0;
printf("\n operator \t %c%c",c,sop);
}
else
printf("\n operator \t%c",c);
}
else if(c=='.')
{
token[j]=c;
j++;
}
}
}
}
int isdelim(char c)
{
int i;
for(i=0;i<14;i++)
{
if(c==delim[i])
return 1;
}
return 0;
}
int isop(char c)
{
int i,j;
char ch;
for(i=0;i<7;i++)
{
if(c==oper[i])
{
ch=getc(fp);
for(j=0;j<6;j++)
{
if(ch==oper[j])
{
fop=1;
sop=ch;
return 1;
}
}
ungetc(ch,fp);
return 1;
}
}
return 0;
}
void check(char t[])
{
int i;
if(numflag==1)
{
printf("\n number \t\t%s",t);
return;
}
for(i=0;i<2;i++)
{
if(strcmp(t,predirect[i])==0)
{
printf("\n preprocessor directive %s",t);
return;
}
}
for(i=0;i<6;i++)
{
if(strcmp(t,header[i])==0)
{
printf("\n header file \t%s",t);
return;
}
}
for(i=0;i<21;i++)
{
if(strcmp(key[i],t)==0)
{
printf("\n keyword \t\t%s",key[i]);
return;
}
}
printf("\n identifier \t%s",t);
}
void skipcomment()
{
ch=getc(fp);
if(ch=='/')
{
while((ch=getc(fp))!='\0');
}
else if(ch=='*')
{
while(f==0)
{
ch=getc(fp);
if(c=='/')
f=1;
}
}
f=0;
}
Inpt File:Source.C
#include<stdio.h>
#include<conio.h>
#include<string.h>
void main()
int i;
char *p,*r;
charstr[30];
clrscr();
p=p-1;
printf("Reverse is:");
while (p>=r)
{
printf("%c",*p);
p--;
getch();
Output File:Result.txt
delimiters #
delimiters <
delimiters
delimiters #
delimiters <
delimiters >
delimiters #
delimiters <
delimiters >
delimiters
delimiters #
delimiters <
delimiters >
delimiters
keyword void
delimiters
identifier main
delimiters (
delimiters )
delimiters
delimiters
delimiters {
delimiters
delimiters
delimiters
keyword int
delimiters
identifier i
delimiters ;
delimiters
delimiters
keyword char
delimiters
operator *
identifier p
delimiters ,
operator *
identifier r
delimiters ;
delimiters
delimiters
keyword char
delimiters
identifier str
delimiters [
number 30
delimiters ]
delimiters ;
delimiters
delimiters
identifier clrscr
delimiters (
delimiters )
delimiters ;
delimiters
delimiters
delimiters
identifier printf
delimiters (
identifier Enter
delimiters
identifier the
delimiters
identifier string
delimiters )
delimiters ;
delimiters
delimiters
identifier gets
delimiters (
identifier str
delimiters )
delimiters ;
delimiters
delimiters
delimiters
delimiters
delimiters
identifier p
operator =
identifier str
delimiters ;
delimiters
delimiters
delimiters
delimiters
delimiters
identifier r
operator =
identifier p
delimiters ;
delimiters
delimiters
delimiters
delimiters
delimiters
keyword while
delimiters (
operator *
identifier p
operator !=
operator !
number 0
delimiters )
delimiters
delimiters
delimiters
identifier p
operator ++
operator +
delimiters ;
delimiters
delimiters
delimiters
delimiters
delimiters
delimiters
identifier p
operator =
identifier p
operator -
number 1
delimiters ;
delimiters
delimiters
delimiters
delimiters
delimiters
identifier printf
delimiters (
identifier Reverse
delimiters
identifier is
delimiters )
delimiters ;
delimiters
delimiters
delimiters
delimiters
delimiters
keyword while
delimiters
delimiters (
identifier p
delimiters >
operator =
identifier r
delimiters )
delimiters
delimiters
delimiters
delimiters
delimiters
delimiters {
delimiters
delimiters
delimiters
delimiters
delimiters
delimiters
identifier printf
delimiters (
operator %
identifier c
delimiters ,
operator *
identifier p
delimiters )
delimiters ;
delimiters
delimiters
delimiters
delimiters
delimiters
delimiters
identifier p
operator --
operator -
delimiters ;
delimiters
delimiters
delimiters
delimiters
delimiters
delimiters
delimiters }
delimiters
delimiters
delimiters
delimiters
delimiters
delimiters
identifier getch
delimiters (
delimiters )
delimiters ;
delimiters
delimiters
delimiters
delimiters }
Program 9
Aim :Lexical Analyzer
#include<string.h>
#include<ctype.h>
#include<stdio.h>
#include<conio.h>
{ if(strcmp("for",str)==0||strcmp("while",str)==0||strcmp("do",str)==0||
strcmp("int",str)==0||strcmp("float",str)==0||strcmp("char",str)==0||
strcmp("double",str)==0||strcmp("static",str)==0||strcmp("switch",str)==0||
strcmp("case",str)==0)
printf("\n%s is a keyword",str);
else
printf("\n%s is an identifier",str);
main()
FILE *f1,*f2,*f3;
char c,str[10],st1[10];
int num[100],lineno=0,tokenvalue=0,i=0,j=0,k=0;
f1=fopen("input","w");
while((c=getchar())!=EOF)
putc(c,f1);
fclose(f1);
f1=fopen("input","r");
f2=fopen("identifier","w");
f3=fopen("specialchar","w");
while((c=getc(f1))!=EOF)
if(isdigit(c))
tokenvalue=c-'0';
c=getc(f1);
while(isdigit(c))
tokenvalue*=10+c-'0';
c=getc(f1);
num[i++]=tokenvalue;
ungetc(c,f1);
} else if(isalpha(c))
putc(c,f2);
c=getc(f1);
while(isdigit(c)||isalpha(c)||c=='_'||c=='$')
putc(c,f2);
c=getc(f1);
putc(' ',f2);
ungetc(c,f1);
printf(" ");
else if(c=='\n')
lineno++;
else
putc(c,f3);
fclose(f2);
fclose(f3);
fclose(f1);
for(j=0;j<i;j++)
printf("%d",num[j]);
printf("\n");
f2=fopen("identifier","r");
k=0;
while((c=getc(f2))!=EOF)
if(c!=' ')
str[k++]=c;
else
str[k]='\0';
keyword(str);
k=0;
fclose(f2);
f3=fopen("specialchar","r");
printf("%c",c);
printf("\n");
fclose(f3);
getch();
}
Program-10
Predictive parsing
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#define NONE -1
#define ID 259
#include<conio.h>
char lexemes[MAX];
char buffer[SIZE];
int lastchar = - 1;
int lastentry = 0;
int lineno = 1;
int lookahead;
struct entry
char *lexptr;
int token;
} symtable[100];
struct entry keywords[] =
exit(1);
int k;
if (strcmp(symtable[k].lexptr, s) == 0)
return k;
return 0;
int len;
len = strlen(s);
lastentry = lastentry + 1;
symtable[lastentry].token = tok;
strcpy(symtable[lastentry].lexptr, s);
return lastentry;
} /*void Initialize()
for(ptr=keywords;ptr->token;ptr+1)
insert(ptr->lexptr,ptr->token);
}*/
int lexer()
int t;
int val, i = 0;
while (1)
t = getchar();
else if (t == '\n')
lineno = lineno + 1;
else if (isdigit(t))
ungetc(t, stdin);
scanf("%d", &tokenval);
return NUM;
else if (isalpha(t))
{
while (isalnum(t))
buffer[i] = t;
t = getchar();
i = i + 1;
if (i >= SIZE)
Error_Message("Compiler error");
buffer[i] = EOS;
if (t != EOF)
ungetc(t, stdin);
val = look_up(buffer);
if (val == 0)
tokenval = val;
return symtable[val].token;
else if (t == EOF)
return DONE;
else
tokenval = NONE;
return t;
void Match(int t)
{
if (lookahead == t)
lookahead = lexer();
else
Error_Message("Syntax error");
else if (t == NUM)
else if (t == ID)
else
void F()
//void E();
switch (lookahead)
case '(':
Match('(');
E();
Match(')');
break;
case NUM:
display(NUM, tokenval);
Match(NUM);
break;
case ID:
display(ID, tokenval);
Match(ID);
break;
default:
Error_Message("Syntax error");
void T()
int t;
F();
while (1)
switch (lookahead)
case '*':
t = lookahead;
Match(lookahead);
F();
display(t, NONE);
continue;
case '/':
t = lookahead;
Match(lookahead);
display(t, NONE);
continue;
default:
return ;
E()
int t;
T();
while (1)
switch (lookahead)
case '+':
t = lookahead;
Match(lookahead);
T();
display(t, NONE);
continue;
case '-':
t = lookahead;
Match(lookahead);
T();
display(t, NONE);
continue;
default:
return ;
void parser()
lookahead = lexer();
E();
Match(';');
void main()
char ans[10];
parser();
getch();