Compiler Design Exercise Soft
Compiler Design Exercise Soft
AIM:
Tostudyaboutlexicalanalyzer.
EXERCISE
1.ImplementationofFiniteAutomataforStringValidationforgivenRE.
#include<stdio.h>
#include<string.h>
#defineNO_OF_CHARS256
GandhinagarInstituteofTechnology 3170701CD
printf("\nPatternfoundatindex%d",i-M+1);
}
}
intmain()
{
char*txt="AABAACAADAABAAABAA";
char*pat="AABA";s
earch(pat,txt);return0
;
}
Output:
GandhinagarInstituteofTechnology 3170701CD
Practical 2
AIM:
Tostudyaboutpredictiveparser.
EXCERSICE:
1. ImplementationofRecursiveDescentParserwithoutbacktrackingforgivengrammar.
#include<stdio.h>
#include<string.h>
#include<ctype.h>
charinput[10];
int
i,error;voi
dE();
voidT();
void
Eprime();void
Tprime();void
F();main()
{i=
0;
error=0;
printf("Enteranarithmeticexpression:");//Eg:a+a*agets(
input);
E();
if(strlen(input)==i&&error==0)
printf("\nAccepted..!!!\n");
elseprintf("\nRejected..!!!\n");
GandhinagarInstituteofTechnology 3170701CD
}
void E()
T();
Eprime();
voidEprime()
if(input[i]=='+')
{i+
+;
T();
Eprime();
void T()
F();
Tprime();
voidTprime()
if(input[i]=='*')
{i+
+;
GandhinagarInstituteofTechnology 3170701CD
F();
Tprime();
voidF()
if(isalnum(input[i]))i++;
elseif(input[i]=='(')
{i+
+;
E();
if(input[i]==')')
i++;
elseerror=1;
elseerror=1;
Output:
GandhinagarInstituteofTechnology 3170701CD
2. ImplementaCprogramtofind“First”and"Follow"setforgivengrammar.
//Cprogramtocalculate theFirstand
//Followsetsofagivengrammar#in
clude<stdio.h>#include<ctype.h
>#include<string.h>
//FunctionstocalculateFollowv
oid followfirst(char, int,
int);voidfollow(charc);
// Function to calculate
Firstvoidfindfirst(char,int,in
t);
int count, n = 0;
//Storesthefinalresult
//of theFirst Sets
charcalc_first[10][100];
//Storesthefinalresult
//of theFollow Sets
charcalc_follow[10][100];i
nt m = 0;
intmain(intargc,char**argv)
{
int jm =
0;int km =
0;int i,
choice;char
c,
ch;count=8;
// The Input
grammarstrcpy(production[0],
"E=TR");strcpy(production[1],
"R=+TR");strcpy(production[2],
"R=#");strcpy(production[3],
"T=FY");strcpy(production[4],
"Y=*FY");strcpy(production[5],
"Y=#");strcpy(production[6],
"F=(E)");strcpy(production[7],"
F=i");
intkay;
char
done[count];int
ptr =-1;
//Initializingthecalc_firstarrayfo
r(k=0; k<count;k++) {
for(kay=0;kay<100;kay++){calc
GandhinagarInstituteofTechnology 3170701CD
_first[k][kay]='!';
}
GandhinagarInstituteofTechnology 3170701CD
}
intpoint1 =0, point2,xxx;
//CheckingifFirst ofchas
// already been
calculatedfor(kay=0;kay<=ptr;
kay++)
if(c==done[kay])
xxx=1;
if(xxx==1)
continue;
// Function
callfindfirst(c,0,
0);
ptr+=1;
//PrintingtheFirstSetsofthegrammarfor(
i=0+jm; i <n;i++){
int lark =0, chk=0;
GandhinagarInstituteofTechnology 3170701CD
for(lark =0;lark<point2;lark++){
if(first[i]==calc_first[point1][lark])
{
chk=1;
break;
}
}
if(chk==0)
{
printf("%c,",first[i]);calc_first[point1][p
oint2++]=first[i];
}
}
printf("}\n");
jm =
n;point1++;
}
printf("\n");
printf("
\n\n");
chardonee[count];
ptr=-1;
//Initializingthecalc_followarrayfo
r(k=0; k<count; k++){
for(kay=0;kay<100;kay++){calc
_follow[k][kay]='!';
}
}
point1 =
0;intland=0
GandhinagarInstituteofTechnology 3170701CD
;
GandhinagarInstituteofTechnology 3170701CD
for(e=0;e<count; e++)
{
ck=production[e][0];p
oint2 =0;
xxx=0;
//CheckingifFollowofck
// has already been
calculatedfor(kay=0;kay<=ptr;
kay++)
if(ck==donee[kay])
xxx=1;
if(xxx==1)
continue;
land+=1;
//Functioncallf
ollow(ck);
ptr+=1;
//PrintingtheFollowSetsofthegrammarfor(
i=0+km; i < m;i++) {
int lark=0, chk=0;
for(lark=0;lark<point2;lark++)
{
if(f[i]==calc_follow[point1][lark])
GandhinagarInstituteofTechnology 3170701CD
{
chk=1;
break;
}
}
if(chk==0)
{
printf("%c,",f[i]);calc_follow[point1
][point2++]=f[i];
}
}
printf("
}\n\n");km =
m;point1++;
}
}
voidfollow(charc)
{
int i, j;
//Adding"$"tothe follow
// set of the start
symbolif(production[0][0]==c){
f[m++]='$';
}
for(i=0; i <10;i++)
{
for(j=2;j <10; j++)
{
if(production[i][j]==c)
GandhinagarInstituteofTechnology 3170701CD
{
if(production[i][j+1]!='\0')
{
//Calculatethefirstof thenext
// Non-Terminal in the
productionfollowfirst(production[i][j+1],i,(j+2));
}
if(production[i][j+1]=='\0'&&c!=production[i][0])
{
//Calculatethefollowof theNon-Terminal
//intheL.H.S.oftheproductionfoll
ow(production[i][0]);
}
}
}
}
}
voidfindfirst(charc,intq1,intq2)
{
int j;
//Thecasewhere we
//encounteraTerminalif
(!(isupper(c))){
first[n++]=c;
}
for(j=0;j <count;j++)
{
if(production[j][0]==c)
GandhinagarInstituteofTechnology 3170701CD
{
if(production[j][2]=='#')
{
if(production[q1][q2] ==
'\0')first[n++]='#';
elseif(production[q1][q2]!='\0'
&&(q1 !=0||q2!=0))
{
//Recursiontocalculate FirstofNew
//Non-
Terminalweencounterafterepsilonfindfirst(
} production[q1][q2],q1,(q2+1));
else
} first[n++]='#';
elseif(!isupper(production[j][2]))
{
first[n++]=production[j][2];
}
else
{
//Recursiontocalculate First of
//NewNon-Terminalweencounter
// at the
beginningfindfirst(production[
} j][2],j,3);
}
}
}
voidfollowfirst(charc,int c1,intc2)
GandhinagarInstituteofTechnology 3170701CD
{
int k;
//Thecasewhereweencounter
// a
Terminalif(!(is
upper(c)))
f[m++]=c;
else
{
int i = 0, j =1;
for(i=0;i <count;i++)
{
if(calc_first[i][0] ==
c)break;
}
//Includingthe Firstsetofthe
//Non-Terminal intheFollowof
// the original
querywhile(calc_first[i][j]!
='!')
{
if(calc_first[i][j]!='#')
{
f[m++]=calc_first[i][j];
}
else
{
if(production[c1][c2]=='\0')
{
//Casewherewereachthe
GandhinagarInstituteofTechnology 3170701CD
//endofaproduction
GandhinagarInstituteofTechnology 3170701CD
follow(production[c1][0]);
}
else
{
//Recursion tothenextsymbol
// in case we encounter a
"#"followfirst(production[c1][c2],c1,c2+1);
}
}j+
+;
}
}
}
Output:
GandhinagarInstituteofTechnology 3170701CD
3. ImplementaCprogramforconstructingLL(1)parsingforgivengrammar.
#include<stdio.h>
#include<conio.h>
#include<string.h>
chars[20],stack[20];
voidmain()
charm[5][6][3]={"tb","","","tb","","","","+tb","","","n","n","fc","","","fc","","","","n","
*fc","a","n","n","i"," "," ","(e)"," "," "};
intsize[5][6]={2,0,0,2,0,0,0,3,0,0,1,1,2,0,0,2,0,0,0,1,3,0,1,1,1,0,0,3,0,0};
int
i,j,k,n,str1,str2;clr
scr();
printf("\nEntertheinputstring:");sc
anf("%s",s);
strcat(s,"$");
n=strlen(s)st
ack[0]='$';
stack[1]='e';
i=1;
j=0;
printf("\nStack
Input\n");p
rintf("
\n");while((
GandhinagarInstituteofTechnology 3170701CD
stack[i]!='$')&&(s[j]!='$')
GandhinagarInstituteofTechnology 3170701CD
if(stack[i]==s[j])
i--
;j++
switch(stack[i])
case 'e':
str1=0;break;
case'b':str1=1;brea
k;
case't':str1=2;break
case 'c':
str1=3;break;
case'f':str1=4;brea
k;
switch(s[j])
case'i':str2=0;break
case '+':
str2=1;break;
case'*':str2=2;
GandhinagarInstituteofTechnology 3170701CD
break;
case'(':str2=3;brea
k;
case')':str2=4;brea
k;
case'$':str2=5;brea
k;
if(m[str1][str2][0]=='\0')
printf("\nERROR");
exit(0);
else
if(m[str1][str2][0]=='n')i--;
else
if(m[str1][str2][0]=='i')stac
k[i]='i';
else
for(k=size[str1][str2]-1;k>=0;k--)
stack[i]=m[str1][str2][k];i+
+;
i--;
GandhinagarInstituteofTechnology 3170701CD
}
for(k=0;k<=i;k++)pri
ntf("
%c",stack[k]);printf("
");for(
k=j;k<=n;k++)printf(
"%c",s[k]);printf("\n"
);
printf("\n
SUCCESS");getch();
Output:
GandhinagarInstituteofTechnology 3170701CD
Practical 3
AIM:
TostudyaboutLRParsers.
EXCERSICE:
1.WriteaCprogramtoimplement LALR(1)parser.
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
voidpush(char*,int*,char);
charstacktop(char*);voidis
product(char,char);intister
(char);intisnter(char);intis
state(char);voiderror();voi
disreduce(char,char);charp
op(char*,int*);
voidprintt(char*,int*,char[],int);v
oidrep(char[],int);
structaction
{
charrow[6][5];
};
conststructactionA[12]={
GandhinagarInstituteofTechnology 3170701CD
{"sf","emp","emp","se","emp","emp"},
{"emp","sg","emp","emp","emp","acc"},
{"emp","rc","sh","emp","rc","rc"},
{"emp","re","re","emp","re","re"},
{"sf","emp","emp","se","emp","emp"},
{"emp","rg","rg","emp","rg","rg"},
{"sf","emp","emp","se","emp","emp"},
{"sf","emp","emp","se","emp","emp"},
{"emp","sg","emp","emp","sl","emp"},
{"emp","rb","sh","emp","rb","rb"},
{"emp","rb","rd","emp","rd","rd"},
{"emp","rf","rf","emp","rf","rf"}
};
structgotol
{
charr[3][4];
};
conststructgotolG[12]={
{"b","c","d"},
{"emp","emp","emp"},
{"emp","emp","emp"},
{"emp","emp","emp"},
{"i","c","d"},
{"emp","emp","emp"},
{"emp","j","d"},
{"emp","emp","k"},
{"emp","emp","emp"},
GandhinagarInstituteofTechnology 3170701CD
{"emp","emp","emp"},
};charter[6]={'i','+','*',')','(','$'
};
charnter[3]={'E','T','F'};charstates[12]={'a','b','c','d','e','f','g','
h','m','j','k','l'};charstack[100];
inttop=-
1;chartemp[10
];structgramm
ar
{
charleft;char
right[5];
};
conststructgrammarrl[6]={
{'E',"e+T"},
{'E',"T"},
{'T',"T*F"},
{'T',"F"},
{'F',"(E)"},
{'F',"i"},
};
voidmain()
{
charinp[80],x,p,dl[80],y,bl='a';inti
=0,j,k,l,n,m,c,len;
clrscr();printf("Enterthe
input:");
GandhinagarInstituteofTechnology 3170701CD
scanf("%s",inp);
len=strlen(inp);i
np[len]='$';
inp[len+1]='\0';push(stac
k,&top,bl);printf("\nstack
\t\t\tinput");printt(stack,&
top,inp,i);do
{
x=inp[i];p=stacktop(stack);
isproduct(x,p);if(strcmp(te
mp,"emp")==0)error();if(st
rcmp(temp,"acc")==0)brea
k;
else
{
if(temp[0]=='s')
{
push(stack,&top,inp[i]);p
ush(stack,&top,temp[1]);i
++;
}
else
{
if(temp[0]=='r')
GandhinagarInstituteofTechnology 3170701CD
j=isstate(temp[1]);strcpy
(temp,rl[j-
2].right);dl[0]=rl[j-
2].left;
dl[1]='\0';
n=strlen(temp);for(k=0;k
<2*n;k++)pop(stack,&to
p);for(m=0;dl[m]!='\0';m
++)
push(stack,&top,dl[m]);l
=top;
y=stack[l-
1];isreduce(y,dl[0]);for(m=0
;temp[m]!='\0';m++)push(sta
ck,&top,temp[m]);
}
}
printt(stack,&top,inp,i);
}while(inp[i]!='\0');if(strc
mp(temp,"acc")==0)printf
("\naccepttheinput");else
printf("\ndonotaccepttheinput");
getch();
}
voidpush(char*s,int*sp,charitem)
GandhinagarInstituteofTechnology 3170701CD
if(*sp==100)printf(
"stackisfull");else
{
*sp=*sp+1;s
[*sp]=item;
}
}
charstacktop(char*s)
{
chari;i=s
[top];ret
urni;
}
voidisproduct(charx,charp)
{
intk,l;k=iste
r(x);l=isstat
e(p);
strcpy(temp,A[l-1].row[k-1]);
}
intister(charx)
{
inti;for(i=0;i<6;
i++)
GandhinagarInstituteofTechnology 3170701CD
if(x==ter[i])
returni+1;re
turn0;
}
intisnter(charx)
{
inti;for(i=0;i<3;
i++)if(x==nter[i
])returni+1;retu
rn0;
}
intisstate(charp)
{
inti;for(i=0;i<12;
i++)if(p==states[
i])returni+1;retur
n0;
}
voiderror()
{
printf("errorintheinput");
exit(0);
}
voidisreduce(charx,charp)
{
GandhinagarInstituteofTechnology 3170701CD
intk,l;k=isst
ate(x);l=isnt
er(p);
strcpy(temp,G[k-1].r[l-1]);
}
charpop(char*s,int*sp)
{
charitem;if
(*sp==-1)
printf("stackisempty");
else
{
item=s[*sp];
*sp=*sp-1;
}
returnitem;
}
voidprintt(char*t,int*p,charinp[],inti)
{
intr;printf("
\n");
for(r=0;r<=*p;r++)
rep(t,r);printf("\t\t\t
");
for(r=i;inp[r]!='\0';r++)
printf("%c",inp[r]);
}
GandhinagarInstituteofTechnology 3170701CD
voidrep(chart[],intr)
{
charc;c=t
[r];switc
h(c)
case'a':printf("0");b
reak;case'b':printf("
1");break;case'c':pr
intf("2");break;cas
e'd':printf("3");brea
k;case'e':printf("4")
;break;case'f':printf
("5");break;case'g':
printf("6");break;c
ase'h':printf("7");br
eak;case'm':printf("
8");break;case'j':pri
ntf("9");break;case'
k':printf("10");
GandhinagarInstituteofTechnology 3170701CD
break;case'l':printf("11"
);break;default:printf("
%c",t[r]);break;
}
}
Output:
GandhinagarInstituteofTechnology 3170701CD
Practical 4
AIM:Tostudyaboutoperatorprecedenceparser.
EXCERSICE:
1.ImplementaCprogramtoimplementoperatorprecedenceparsingforgiven grammar.
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
voidf()
printf("Not operator
grammar");exit(0);
voidmain()
char grm[20][20],
c;inti,n,j=2,flag=0;sc
anf("%d",&n);
scanf("%s",grm[i]);
c=grm[i][2];
while(c!= '\0'){
if(grm[i][3] =='+'||grm[i][3]=='-'
||grm[i][3]=='*'||grm[i][3]=='/')
GandhinagarInstituteofTechnology 3170701CD
flag=1;
else{
flag=0;f();
if(c=='$'){
flag =
0;f();
c=grm[i][++j];
if(flag==1)
printf("Operatorgrammar");
Output:
GandhinagarInstituteofTechnology 3170701CD
Practical 5
AIM:
Tostudyaboutlexicalanalyzergenerator(lex)andflex(fastlexicalanalyzer).
EXCERSICE:
1. ImplementfollowingProgramsUsingLex
a. GenerateHistogramofwords
#include<stdio.h>
#defineIN_WORD1/*pointinword */#defineOUT_WORD0/*
pointoutofword*/#defineMAX_LEN 20 /* maxword length to consider*/
intmain()
{
inti,j;/*iterators */intc;/*character*/
int len; /* word length */ int state; /* in/out of word */ int
top_count;inthistogram[MAX_LEN];
i = j = c = len = top_count = 0; state =
OUT_WORD;for(i =0; i<MAX_LEN; ++i)
histogram[i]=0;
/*processinput*/
while((c=getchar())!=EOF){
if(c==' '||c=='\t' ||c=='\n'){ if(state==IN_WORD){
/*incrementhistogramentryforcurrentwordlength*/ if(len<MAX_LEN)j=len;
else
j=MAX_LEN;
++histogram[j-1];
/* keep a record of the highest count */ if (histogram[j-1] > top_count) top_count
=histogram[j-1];
}
/*resetstate*/len=0;sta
te=OUT_WORD;
}else {
/*keeptrackofcurrentwordlength*/
++len;
state= IN_WORD;
}}
/*printhistogram fromtop tobottom*/for(i =top_count; i>0; --i){
/*printY-axis*/ printf("%3d|",i);
/*printentriesforeachwordlength*/for(j=0;j
<MAX_LEN;++j){if(histogram[j]<i) printf(" ");
elseprintf(".");
}
putchar('\n');
GandhinagarInstituteofTechnology 3170701CD
}
printf("");
/*printX-axis*/
for (i = 0; i < MAX_LEN; ++i) printf("--
");putchar('\n');
return0;
}
Output:
b. CaesarCypher
%%
[a-
z]{charcipher_char=yytext[0];ciph
er_char+=3;
if(cipher_char>'z')cipher_char-=('z'+1-
'a');printf("%c",cipher_char );
}
[A-
Z]{charcipher_char=yytext[0];cipher
_char+=3;
if(cipher_char>'Z')cipher_char-=('Z'+1-
'A');printf("%c",cipher_char);
}
%%
Output:
GandhinagarInstituteofTechnology 3170701CD
c. ExtractsingleandmultilinecommentsfromCProgram
/*DefinitionSection*/
%{
%}
/*Startingcharactersequenceformultilinecomment*/sta
rt\/\*
/*Endingcharactersequenceformultilinecomment*/en
d\*\/
/*RuleSection*/
%%
/*Regularexpressionfor singlelinecomment*/
\/\/(.*);
/*Regularexpressionformultilinecomment*/
{start}.*{end};
%%
/*Driverfunction*/
intmain(intk,char**argcv)
{
yyin=fopen(argcv[1],"r");
yyout=fopen("out.c","w");
/*call the yylex
function.*/yylex();
return0;
}
Output:
GandhinagarInstituteofTechnology 3170701CD
2. ImplementfollowingProgramsUsingLex
a. ConvertRomantoDecimal
#include<stdio.h>#include<string.h>
int convert(char);//functionprototypeofconversionfunctionint main()
{
int i = 0, num =0;
charromanNumber[100];//arrayforstoringromannumberprintf("EnterRomannumber:");
scanf("%s",
romanNumber);while(roma
nNumber[i])
{
//ifcondition forcheckingvalidityof romannumber if(convert(romanNumber[i ]) < 0)
{
printf("\nInvalidRomanNumber.\n");return0;
}
//ifcondition forcheckingvalidityof romannumberif((strlen(romanNumber)-i)>2)
{
if(convert(romanNumber[i])<convert(romanNumber[i +2]))
{
printf("\nInvalidRomanNumber.\n");return0;
}
}
//if condition for converting roman number into decimal
numberif(convert(romanNumber[i])>=convert(romanNumber[i
+1]))
//trueisfirst romannumberisgreaterorequalto secondnum
=num+convert(romanNumber[i]);
else
{
num=num+(convert(romanNumber[i+1])- convert(romanNumber[i]));i++;
}i++;
}
//displaying converted number printf("\nEquivalent decimal number: %d\n", num);
return0;
}
//convertingromannumberintoequivalentdecimalvalueint convert(charch)
{
intvalue=0;switch(
ch)
{
case 'I': value = 1;
break;case 'V': value = 5;
break;case 'X': value = 10;
break;case'L': value=50;
break;
GandhinagarInstituteofTechnology 3170701CD
case 'C': value = 100;
break;case 'D': value = 500;
break;case'M':value=1000;br
eak;case '\0': value = 0;
break;default:value=-1;
}
returnvalue;
Output:
b. Checkweathergivenstatementiscompoundorsimple
%{
#include<stdio.h>
intis_simple=1;
%}
%%
[\t\n]+[aA][nN][dD][\t\n]+{is_simple=0;}
[\t\n]+[bB][uU][tT][\t\n]+{is_simple=0;}
[\t\n]+[oO][rR][\t\n]+{is_simple=0;}
. {;}
%%
main()
printf("Enterthesentence:");
GandhinagarInstituteofTechnology 3170701CD
yylex();if(is_sim
ple==1)
sentence\n");else
printf("\nthegivensentenceiscompoundsentence\n");
intyywrap()
return1;
Output:
c. Extracthtmltagsfrom.html file
/*Declarationsection*/
%{
%}
GandhinagarInstituteofTechnology 3170701CD
%%
"<"[^>]*>{printf("%s\n",yytext);}
%%
intyywrap(){}
intmain(intargc,char*argv[])
externFILE*yyin=fopen("tags.txt","r");y
ylex();
return0;
Input:
Output:
GandhinagarInstituteofTechnology 3170701CD
Practical 6
AIM:
Tostudyaboutyetanothercompiler-compiler(yacc).
EXCERSICE:
1.CreateyaccandlexspecificationfiletogenerateCalculatorProgram.
LEXPART:
%{
#include<stdio.h>
#include
"y.tab.h"externint
yylval;
%}
%%
[0-9]+{
yylval=atoi(yytext);
returnNUMBER;
[\t];
[\n]return0;
.returnyytext[0];
%%
intyywrap()
return1;
GandhinagarInstituteofTechnology 3170701CD
YACCPART:
%{
#include<stdio.h>
intflag=0;
%}
%tokenNUMBER
%left'+''-'
%left'*''/''%'
%left'('')'
%%
ArithmeticExpression:
E{printf("\nResult=%d\n",$$);
return0;
};
E:E'+'E{$$=$1+$3;}
|E'-'E{$$=$1-$3;}
|E'*'E{$$=$1*$3;}
|E'/'E{$$=$1/$3;}
|E'%'E{$$=$1%$3;}
|'('E')'{$$=$2;}
|NUMBER{$$=$1;}
%%
voidmain()
GandhinagarInstituteofTechnology 3170701CD
Multiplication, Divison, Modulus and Round
brackets:\n");yyparse();
if(flag==0)
printf("\nEnteredarithmeticexpressionisValid\n\n");
}
voidyyerror()
printf("\nEnteredarithmeticexpressionisInvalid\n\n");
flag=1;
}
Output:
GandhinagarInstituteofTechnology 3170701CD
GandhinagarInstituteofTechnology 3170701CD