CD Lab Manual Edited
CD Lab Manual Edited
CD Lab Manual Edited
COMPILER DESIGN
LAB MANUAL
Regulation : R18/JNTUH
Academic Year : 2024-2025
Problem Solving Skills – Graduate will be able to apply computational techniques and
PSO1 software principles to solve complex engineering problems pertaining to software
engineering.
Professional Skills – Graduate will be able to think critically, communicate effectively,
PSO2 andcollaborate in teams through participation in co and extra-curricular activities.
Successful Career – Graduates will possess a solid foundation in computer science and
engineering that will enable them to grow in their profession and pursue lifelong
PSO3
learningthrough post-graduation and professional development.
DEPARTMENT OF COMPUTER SCIENCE AND ENGINEERING
L T P C
0 0 3 1.5
Prerequisites
1. A Course on “Objected Oriented Programming through Java”
Co-requisites:
1. A course on “Web Technologies”
Course Objectives:
To provide hands-on experience on web technologies
To develop client-server application using web technologies
To introduce server-side programming with Java servlets and JSP
To understand the various phases in the design of a compiler.
To understand the design of top-down and bottom-up parsers.
To understand syntax directed translation schemes.
To introduce lex and yacc tools.
Course Outcomes:
Design and develop interactive and dynamic web applications using HTML, CSS, JavaScript and
XML
Apply client-server principles to develop scalable and enterprise web applications.
Ability to design, develop, and implement a compiler for any language.
Able to use lex and yacc tools for developing a scanner and a parser.
Able to design and implement LL and LR parsers.
List of Experiments
Compiler Design Experiments
1. Write a LEX Program to scan reserved word & Identifiers of C Language
2. Implement Predictive Parsing algorithm
3. Write a C program to generate three address code.
4. Implement SLR(1) Parsing algorithm
5. Design LALR bottom up parser for the given language
<program> ::= <block>
<block> ::= { <variabledefinition> <slist> }
| { <slist> }
<variabledefinition> ::= int <vardeflist> ;
<vardeflist> ::= <vardec> | <vardec> , <vardeflist>
<vardec> ::= <identifier> | <identifier> [ <constant> ]
<slist> ::= <statement> | <statement> ; <slist>
<statement> ::= <assignment> | <ifstatement> | <whilestatement>
| <block> | <printstatement> | <empty>
<assignment> ::= <identifier> = <expression>
| <identifier> [ <expression> ] = <expression>
<ifstatement> ::= if <bexpression> then <slist> else <slist> endif
| if <bexpression> then <slist> endif
<whilestatement> ::= while <bexpression> do <slist> enddo
<printstatement> ::= print ( <expression> )
<expression> ::= <expression> <addingop> <term> | <term> | <addingop> <term>
<bexpression> ::= <expression> <relop> <expression>
S. No List of
Experiments
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
FILE *fp;
FILE *kfp;
char iden[32],num[32]; int
scantoken();
int chkkey(); static
char ch; char
n[20]; void main()
{
int token=2;
clrscr();
fp=fopen("source.c","r");
if((kfp=fopen("key.txt","r"))==NULL)
{
printf("\n Unable to open keyword file");
exit(0);
}
while(!feof(fp))
{
token=scantoken();
if(token>0)
printf("\n%d %c %s",token,ch,n);
else if(token==0)
{
if(chkkey()==1)
printf("\nKeyword: %s",iden);
else
printf("\nIdentifier: %s",iden);
}
else if(token==1) printf("\nNumber:
%s",num);
}
fclose(fp);
fclose(kfp);
}
int scantoken()
{
int token=2,j;
static int lookahead=0; if(!
lookahead)
{
ch=fgetc(fp);
lookahead=0;
}
while(token==2)
{
switch(ch)
{
case ' ':
ch=fgetc(fp); break;
case '\n':
ch=fgetc(fp);
break;
case '\t':
ch=fgetc(fp); break;
case '/':
ch=fgetc(fp);
if(ch=='*')
{
while(1)
{
ch=fgetc(fp);
if(ch=='*')
{
ch=fgetc(fp);
if(ch=='/')
break;
}
}
}
break;
case '<':
ch=fgetc(fp);
if(ch=='=')
{
token=3;
lookahead=0;
strcpy(n,"less/equal");
}
else
{
token=2;
lookahead=1;
strcpy(n,"less");
}
break;
case '>':
ch=fgetc(fp);
if(ch=='=')
{
token=5;
lookahead=0;
strcpy(n,"greater/equal");
}
else
{
token=4;
lookahead=1;
strcpy(n,"greater");
}
break;
case '=':
ch=fgetc(fp);
if(ch=='=')
{
token=7;
lookahead=0;
strcpy(n,"equalcomp");
}
else
{
token=2;
lookahead=1;
strcpy(n,"assign");
}
break;
case '!':
ch=fgetc(fp);
if(ch=='=')
{
token=9;
lookahead=0;
strcpy(n,"notequal");
}
else
{
token=8;
lookahead=1;
}
break;
case '+':
token=10; lookahead=0;
strcpy(n,"plus"); break;
case '-':
token=11; lookahead=0;
strcpy(n,"minus"); break;
case '*':
token=12; lookahead=0;
strcpy(n,"multiply");
break;
case ';':
token=13; lookahead=0;
strcpy(n,"semicolon");
break;
case '{':
token=14; lookahead=0;
strcpy(n,"openbrace");
break;
case '}':
token=15;
lookahead=0;
strcpy(n,"closebrace");
break;
case '(':
token=16;
lookahead=0;
strcpy(n,"Leftparenthesis");
break;
case ')':
token=10;
lookahead=0;
strcpy(n,"Rightparenthesis"); break;
case 'ef':
token=-3;
strcpy(n,"EOF"); break;
default: if((ch>='a')&&
(ch<='z'))
{
iden[0]=ch;
iden[1]='\0'; j=1;
ch=fgetc(fp); while((ch>='a'&&ch<='z')||
(ch>='0'&&ch<
='9'))
{
iden[j]=ch; j++;
ch=fgetc(fp);
}
iden[j]='\0';
lookahead=1; Accredited by
NAAC
token=0;
}
if(ch>='0'&&ch<='9')
{
num[0]=ch; j=1;
ch=fgetc(fp);
while(ch>='0'&&ch<='9')
{
num[j]=ch; j++;
ch=fgetc(fp);
}
iden[j]='\0';
lookahead=1;
token=-1;
}
}
}
return token;
}
int chkkey()
{
char *keyw; int
flag=0;
fseek(kfp,0,SEEK_SET);
while(!feof(kfp))
{
fscanf(kfp,"%s",keyw);
if(strcmp(keyw,iden)==0)
{
flag=1;
break;
}
}
return flag;
}
OUTPUT:
create a file with source.c in
that write void main()
{
int a;
}next create another file keyword.txt in
that write void main
int float char
now u will get the output as follows
keyword main
keyword void
16( leftparanthesis
17) right parantehsis 14 {
open brace keyword int
identifier:a
13 ; semicolon 15 }
close brace
2. Implement Predictive Parsing algorithm
#include<stdio.h>
#include<ctype.h>
#include<string.h>
#include<stdlib.h> #define
SIZE 128
#define NONE -1 #define
EOS '\0' #define NUM 257
#define KEYWORD 258
#define ID 259
#define DONE 260
#define MAX 999
charlexemes[MAX];
charbuffer[SIZE];
intlastchar=-1; intlastentry=0;
inttokenval=DONE;
intlineno=1; intlookahead;
structentry
{
char*lexptr;
inttoken;
}
symtable[100];
structentry
keywords[]=
{"if",KEYWORD,"else",KEYWORD,"for",KEYWORD,"int",KEYWORD,"float",KEYWORD,
"double",KEYWORD,"char",KEYWORD,"struct",KEYWORD,"ret
urn",KEYWORD,0,0
};
voidError_Message(char*m)
{
fprintf(stderr,"line %d, %s \n",lineno,m); exit(1);
}
intlook_up(chars[ ])
{
intk;
for(k=lastentry; k>0; k--)
if(strcmp(symtable[k].lexptr,s)==0)
returnk;
return0;
}
intinsert(chars[ ],inttok)
{
intlen; len=strlen(s);
if(lastentry+1>=MAX)
Error_Message("Symbpl table is full");
if(lastchar+len+1>=MAX)
Error_Message("Lexemes array is full"); lastentry=lastentry+1;
symtable[lastentry].token=tok;
symtable[lastentry].lexptr=&lexemes[lastchar+1];
lastchar=lastchar+len+1; strcpy(symtable[lastentry].lexptr,s);
returnlastentry;
}
/*void Initialize()
{
struct entry *ptr; for(ptr=keywords;ptr-
>token;ptr+1)
insert(ptr->lexptr,ptr->token);
}*/
intlexer()
{
intt; intval,i=0;
while(1)
{
t=getchar();
if(t==' '||t=='\t'); elseif(t=='\
n')
lineno=lineno+1;
elseif(isdigit(t))
{
ungetc(t,stdin);
scanf("%d",&tokenval);
returnNUM;
}
elseif(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)
val=insert(buffer,ID); tokenval=val;
returnsymtable[val].token;
}
elseif(t==EOF)
returnDONE;
else
{
tokenval=NONE;
returnt;
}
}
}
voidMatch(intt)
{
if(lookahead==t)
lookahead=lexer();
else
Error_Message("Syntax error");
}
voiddisplay(intt,inttval)
{
if(t=='+'||t=='-'||t=='*'||t=='/') printf("\nArithmetic
Operator: %c",t);
elseif(t==NUM)
printf("\n Number: %d",tval);
elseif(t==ID)
printf("\n Identifier: %s",symtable[tval].lexptr);
else
Identifier: a
Identifier: b
Arithmetic Operator: *
Identifier: c
Arithmetic Operator: +
5*7;
Number: 5
Number: 7
Arithmetic Operator: *
*2;
line 5, Syntax error
ALGORITHM:
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
struct three
{
char data[10],temp[7];
}s[30];
void main()
{
char d1[7],d2[7]="t";
int i=0,j=1,len=0;
FILE *f1,*f2;
clrscr();
f1=fopen("sum.txt","r");
f2=fopen("out.txt","w");
while(fscanf(f1,"%s",s[len].data)!=EOF)
len++;
itoa(j,d1,7);
strcat(d2,d1);
strcpy(s[j].temp,d2);
strcpy(d1,"");
strcpy(d2,"t"); if(!
strcmp(s[3].data,"+"))
{
fprintf(f2,"%s=%s+%s",s[j].temp,s[i+2].data,s[i+4].data);
j++;
}
else if(!strcmp(s[3].data,"-"))
{
fprintf(f2,"%s=%s-%s",s[j].temp,s[i+2].data,s[i+4].data);
j++;
}
for(i=4;i<len-2;i+=2)
{
itoa(j,d1,7);
strcat(d2,d1);
strcpy(s[j].temp,d2);
if(!strcmp(s[i+1].data,"+")) fprintf(f2,"\n%s=%s+
%s",s[j].temp,s[j-1].temp,s[i+2].data); else if(!
strcmp(s[i+1].data,"-"))
fprintf(f2,"\n%s=%s-%s",s[j].temp,s[j-1].temp,s[i+2].data);
strcpy(d1,"");
strcpy(d2,"t");
j++;
}
fprintf(f2,"\n%s=%s",s[0].data,s[j-1].temp);
fclose(f1);
fclose(f2);
getch();
}
Input: sum.txt
Output : out.txt
t1=in1+in2
t2=t1+in3
t3=t2-in4
out=t3
4. Implement SLR(1) Parsing algorithm.
/
*Z=accept;
N->error;
X->10;
Y->11;*/
char prod[7][4]={"0","E+T","T","T*F","F","(E)","d"};
char index[12]={'0','1','2','3','4','5','6','7','8','9','X','Y'};
char term[9]={'d','+','*','(',')','$','E','T','F'};
introw,col,st_pt=0,ip_pt=
0; char input[10],
stack[20]; clrscr();
void main()
{
intj,k;
printf("\n enter input string
:"); scanf("%s", input);
strcat(input,"$");
stack[0]='0';
for(j=0;j<7;j++)
strcat(prod[j],"\
0");
printf("\n STACK INPUT \n \
n"); while(1)
{
for(k=0;k<=st_pt; k+
+) printf("%c",
stack[k]); printf("
");
for(k=ip_pt;input[k-1]!='$';k++)
printf("%c", input[k]);
printf("\n");
row=is_index(stack[st_pt])
;
col=is_term(input[ip_pt]);
if(tab[row][col][0]=='S')
shift(tab[row][col][1]);
else if(tab[row][col]
[0]=='R')
reduce(tab[row][col][1]);
else if(tab[row][col]
[0]=='Z')
{
printf (" \n
success"); getch();
exit(0);
}
else if(tab[row][col]
[0]=='N')
{
printf("\n
error");
getch();
exit(0);
}
}
}
shift(char ch)
{
st_pt++; stack[st_pt+
+]=input[ip_pt++];
stack[st_pt]=ch;
}
reduce(char ch)
{
intk,prno,prlen,rowno,coln
o; for(k=1;k<7;k++)
if(index[k]==ch)
prno=k;
prlen=strlen(prod[prno
]);
for(k=1;k<=2*prlen;k+
+) st_pt--;
st_pt++;
if(prno==1||
prno==2)
stack[st_pt]='E';
else if(prno==3||
prno==4)
stack[st_pt]='T';
else if(prno==5||
prno==6)
stack[st_pt]='F';
rowno=is_index(stack[st_pt-1]);
colno=is_term(stack[st_pt]); stack[+
+st_pt]=tab[rowno][colno][0];
}
is_index(char ch)
{
int k;
for (k=0;k<=9;k+
+)
if(index[k]==ch)
return(k);
if(ch=='X')
return(10);
else
if(ch=='Y')
return(11);
}
is_term(char ch)
{
int k;
for(k=0;k<9;k++)
if(term[k]==ch)
return(k);
}
OUTPUT:
enter input string(d*d)
Stack input
(d+d)$
O(4 d+d)$
0(4d5 +d)$
0(4f3 +d)$
0(4T2 +d)$
0(4E8 +d)$
0(4E8+6 d)$
0(4E8+6d5 )$
0(4E8+6F3 )$
0(4E8+6T9 )$
0(4e8)Y $
0f3 $
0T2 $
0E1 $
success
5. Design LALR bottom up parser for the given language
Aim: To Design and implement an LALR bottom up Parser for checking the syntax of the
Statements in the given language.
ALGORITHM/PROCEDURE:
Source Code : LALR Bottom Up Parser
<parser.l>
%{
#incl
ude<
stdio.
h>
#incl
ude
"y.ta
b.h"
%}
%%
[0-9]+
{yylval.dval=atof(yyt
ext); return DIGIT;
}
\n|. return yytext[0];
%%
<parser.y>
%{
/*This YACC specification file generates the LALR parser for the program
considered in experiment 4.*/
#include<stdio.h>
%}
%union
{
double dval;
}
%token <dval> DIGIT
%type <dval> expr
%type <dval> term
%type <dval> factor
%%
line:
expr
'\n' {
print
f("%
g\n",
$1);
}
;
expr: expr '+' term {$$=$1 + $3 ;}
| term
;
term: term '*' factor {$$=$1 * $3 ;}
| factor
;
factor: '(' expr ')' {$$=$2 ;}
| DIGIT
;
%%
int main()
{
yyparse();
}
yyerror(char *s)
{
printf("%s",s);
}
Output:
$lex parser.l
$yacc –d parser.y
$cc lex.yy.cy.tab.c –ll –lm
$
.
/
a
.
o
u
t
2
+
3