Compiler Design Lab Manual
Compiler Design Lab Manual
in
JNTU World
COMPILER DESIGN
LAB MANUAL
Program Outcomes
PO1
PO2
PO3
PO4
PO5
PO6
PO7
PO8
PO9
PO10
PO11
PO12
PSO1
PSO2
PSO3
Sl. No.
List of Experiments
1
2
3
4
5
11
12
Implement the lexical analyzer using JLex, flex or other lexical analyzer generating
tools.
Write a C program for implementing the functionalities of predictive parser for the min
language specified in Note 1.
9
10
Design a lexical analyzer for given language and the lexical analyzer should ignore
redundant spaces, tabs and new lines. It should also ignore comments. Although the
syntax specification states that identifiers can be arbitrarily long, you may restrict the
length to some reasonable value. Simulate the same in C language.
calculate th
expression that takes an expression with digits, + and * and computes the value.
Convert the BNF rules into Yacc form and write code to generate abstract syntax tree
for the mini language specified in Note 1.
Write a C program to generate machine code from abstract syntax tree generated by the
parser. The instruction set specified in Note 2 may be considered as the target code.
Note 1:
A simple language written in this language is
{int
a[3],t1,
t2;
T1=2;
A[0]=1;a[1]=2;a[t]=3;
T2=-( a[2]+t1*6)/(a[2]-t1);
I
f
t
2
>
5
t
h
e
n
P
r
i
n
t
(
t
2
)
E
l
s
e
{
I
n
t
t
3
;
T
3
=
9
9
;
T
2
=
2
5
;
Print(-t1+t2*t3);/*this is a comment on 2 lines*/
}endif
}
Comments(zero or more characters enclosed between the standard C/JAVA Style comment
brackets/**/)can be inserted .The language has rudimentary support for1-dimenstional array,the
declaration int a[3] declares an array of three elements,referenced as a[0],a[1] and a[2].Note also you
should worry about the scopping of names.
Note 2:
Consider the following mini language, a simple procedural high level language, only operating on integer
data, with a syntax looking vaguely like a simple C crossed with pascal. The syntax of the language is
defined by the following grammar.
<program>::=<block>
<block>::={<variable definition><slist>}
|{<slist>}
<variabledefinition>::=int <vardeflist>
<vardec>::=<identifier>|<identifier>[<constant>]
<slist>::=<statement>|<statement>;<slist>
<statement>::=<assignment>|<ifstament>|<whilestatement>
|<block>|<printstament>|<empty>
<assignment>::=<identifier>=<expression>
|<identifier>[<expression>]=<expression>
<if
statement>::=if<bexpression>then<slist>else<slist>endif
|if<bexpression>then<slisi>endif
<whilestatement>::=while<bexpreession>do<slisi>enddo
<printstatement>:;=print(<expression>)
<expression>::=<expression>::=<expression><addingop><term>|<term>|<addingop>
<term>
<bexprssion>::=<expression><relop><expression>
<relop>::=<|<=|==|>=|>|!=
<addingop>::=+|-
<term>::=<term><multop><factor>|<factor>
<Multop>::=*|/
<factor>::=<constant>|<identifier>|<identifier>[<expression>]
|(<expression>)
<constant>::=<digit>|<digit><constant>
<identifier>::=<identifier><letter or digit>|<letter>
<letter or digit>::=<letter>|<digit>
<letter>:;=a|b|c|d|e|f|g|h|I|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z
<digit>::=0|1|2|3|4|5|^|7|8|9
<empty>::=has the obvious meaning
ATTAINMENT OF PROGRAM
OUTCOMES
& PROGRAM SPECIFIC
OUTCOMES
Experiment
Program
Outcomes
Attained
Design a lexical analyzer for given language and the lexical analyzer
should ignore redundant spaces, tabs and new lines. It should also
ignore comments. Although the syntax specification states that
identifiers can be arbitrarily long, you may restrict the length to some
reasonable value. Simulate the same in C language.
PO1
Exp. No.
1
2
3
4
PO1, PO2
PO1
PO1, PO2
9
10
11
12
PO1, PO2
PO1, PO2
PO1, PO2, PO3,
PO4, PO5
OUTCOMES:
Upon the completion of Compiler Design practical course, the student will be able to:
3. Understand and use Context free grammar, and parse tree construction.
4. Learn & use the new tools and technologies used for designing a compiler.
5. Develop program for solving parser problems.
6. Learn how to write programs that execute faster.
EXPERIMENT- 1
1.1
OBJECTIVE:
Design a lexical analyzer for given language and the lexical analyzer should ignore redundant
spaces, tabs and new lines. It should also ignore comments. Although the syntax specification
states that identifiers can be arbitrarily long, you may restrict the length to some reasonable value.
Simulate the same in C language.
1.2 RESOURCE:
Turbo C ++
1.3 PROGRAM LOGIC:
1. Read the input Expression
2. Check whether input is alphabet or digits then store it as identifier
3. If the input is is operator store it as symbol
4. Check the input for keywords
1.4 PROCEDURE:
Go to debug -> run or press CTRL + F9 to run the program
1.5 PROGRAM:
#include<string.h>
#include<ctype.h>
#include<stdio.h>
void keyword(char str[10])
{
if(strcmp("for",str)==0||strcmp("while",str)==0||strcmp("do",str)==0||strcmp("int",str)==0||str
cmp("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; printf("\nEnter the c
program");/*gets(st1);*/
f
1
=
f
o
p
e
n
(
"
i
n
p
ut","w"); while((c=getchar())!=EOF)
putc(c,f1);
fclose(f1);
f1=fopen("input","r
");
f2=fopen("identifie
r","w");
f3=fopen("specialch
ar","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))
{
p
u
t
c
(
c
,
f
2
)
;
c
=
g
e
t
c
(
f
1
)
;
while(isdigit(c)||isalpha(c)||c=='_'||c=='$')
{
p
u
t
c
(
c
,
f
2
)
;
c
=
g
e
t
c
(
f
1
)
;
}
putc('
',f2);
unget
}
else c(c,f1
);
if(c==' '||c=='\t')
printf(" ");
else
if(c=='\n')
lineno++;
else
}
fclose(
f2);
fclose(
f3);
fclose(
f1);
printf("\nThe no's in the
program are"); for(j=0;j<i;j+
+)
printf("%d",num
[j]); printf("\n");
f2=fopen("identif
ier","r"); k=0;
printf("The keywords and
identifiersare:");
while((c=getc(f2))!=EOF)
{
i
f
(
putc(c,f3);
c
!
=
'
'
)
s
t
r
[
k
+
+
]
=
c
;
e
l
s
e
{
str[k]='\0
';
keyword
(str);
k=0;
}
fclose(f2);
f3=fopen("specialchar","r
"); printf("\nSpecial
characters are");
while((c=getc(f3))!=EOF)
printf("%c",c);
printf("\n
");
fclose(f3
);
printf("Total no. of lines are:%d",lineno);
}
1.6 PRE LAB QUESTIONS
1. What is token?
2. What is lexeme?
3. What is the difference between token and lexeme?
4. Define phase and pass?
5. What is the difference between phase and pass?
6. What is the difference between compiler and interpreter?
INPUT
&
OUTPU
T:
Input:
Enter Program $ for termination:
{
int a[3],t1,t2;
t1=2; a[0]=1; a[1]=2; a[t1]=3;
t2=-(a[2]+t1*6)/(a[2]-t1);
i
f
t
2
>
5
t
h
e
n
p
r
i
n
t
(
t
2
)
;
e
l
s
e
{
i
n
t
t
3
;
t
3
=
9
9
;
t
2
=
2
5
;
print(-t1+t2*t3); /* this is a comment on 2 lines */
} endif
}
$
Output:
Variables : a[3] t1
t2 t3 Operator : + * / > Constants
: 2 1 3 6 5 99 -25
Keywords : int if then else
endif Special Symbols : , ; (
){}
Comments : this is a comment on 2 lines
EXPERIMENT-2
2.1 OBJECTIVE:
* Write a C program to identify whether a given line is a comment or not.
2.2 RESOURCE:
Turbo C++
2.3 PROGRAM LOGIC:
Read the input string.
Check whether the string is starting with / and check next character is / or*.
If condition satisfies print
comment. Else not a
comment.
2.4 PROCEDURE:
Go to debug -> run or press CTRL + F9 to run the program.
2.5 PROGRAM:
#include<stdio.h>
#includ
e<conio
.h>
void
main()
{
ch
ar
co
m[
30
];
int
i=
2,
a=
0;
clr
scr
();
printf("\n Enter
comment:"); gets(com);
if(com[0]=='/') {
if(com[1]=='/')
printf("\n It is a
comment"); else
if(com[1]=='*') {
for(i=2;i<=30;i++)
{
if(com[i]=='*'&&com[i+1]=='/')
{
printf("\n It is a
comment");
a=1;
break; }
}
else
else
con
tinu
e; }
if(a==0)
printf("\n It is not a comment");
EXPERIMENT-3
3.1
OBJECTIVE:
*Write a C program to recognize strings under 'a*', 'a*b+', 'abb'.
3.2 RESOURCE:
Turbo C++
3.3 PROGRAM LOGIC:
By using transition diagram we verify input
of the state. If the state recognize the given
pattern rule.
Then print string is accepted under
a*/ a*b+/ abb. Else print string not
accepted.
3.4 PROCEDURE:
Go to debug -> run or press CTRL + F9 to run the program.
3.5 PROGRAM:
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<
stdlib.h>
void
main()
{
char s[20],c;
int
state=
0,i=0;
clrscr(
);
printf("\n Enter a
string:"); gets(s);
while(s[i]!='\0')
{
switch(state)
state=1;
case 0: c=s[i++];
if(c=='a')
else if(c=='b')
state=2;
else
state=6;
b
reak;
case
1:
c=s[i
++];
if(c=='a')
state=3;
else if(c=='b')
state=4;
e
l state=6;
s
e
b
reak;
case 2:
c=s[i++];
if(c=='a')
s
tate=
6;
else
if(c=
='b')
state=2;
e
l state=6;
s
e
break;
case 3: c=s[i++];
if(c=='a')
s
tate=3
; else
if(c=
='b')
state=2;
e
ls
e
b
reak;
case 4:
c=s[i++];
state=6;
if(c=='a')
state=6;
else if(c=='b')
state=5;
el
s state=6;
e
b
state=6;
reak;
case 5:
c=s[i++];
if(c=='a')
else if(c=='b')
state=2;
else
st
at
e
=
6;
br
e
a
k;
f(state==1)
printf("\n %s is accepted under
rule 'a'",s); else if((state==2)||(state==4))
printf("\n %s is accepted under rule
'a*b+'",s); else if(state==5)
printf("\n %s is accepted under rule 'abb'",s);
getch();
3.6
INPUT
&
OUTPU
T:
Input :
Enter a String: aaaabbbbb
Output:
aaaabbbbb is accepted under rule 'a*b+'
Enter a
string:
cdgs cdgs
is not
recognize
d
EXPERIMENT-4
4.1 OBJECTIVE:
*Write a C program to test whether a given identifier is valid or not
4.2 RESOURCE:
Turbo C++
4.3 PROGRAM LOGIC:
Read the given input string.
Check the initial character of the string is numerical or any special character except _ then print it is not a
valid
identifier.
Otherwise print it as valid identifier if remaining characters of string doesnt contains any special
characters except _.
4.4 PROCEDURE:
Go to debug -> run or press CTRL + F9 to run the program.
4.5 PROGRAM:
#include<stdio.h>
#include<conio.h>
#include
<ctype.h
> void
main()
{
c
h
a
r
a
[
1
0
]
;
i
n
t
f
l
a
g
,
i
=
1
;
c
l
r
s
c
r
(
)
;
printf("\n Enter an
identifier:");
gets(a);
if(isalpha(a[0]))
flag=1;
else
while(a[i]!='\0')
{
if(!isdigit(a[i])&&!isalpha(a[i]))
{
}
i
+
+
;
}
f
l
a
g
=
0
;
b
r
e
a
k
;
if(flag==1)
printf("\n Valid
identifier"); getch();
}
4.6
EXPERIMENT-5
5.1
OBJECTIVE:
*Write a C program to simulate lexical analyzer for validating operators.
5.2 RESOURCE:
Turbo C++
5.3 PROGRAM LOGIC :
Read the given input.
If the given input matches with any
operator symbol. Then display in terms of
words of the particular symbol. Else print
not a operator.
5.4
PROCEDURE:
Go to debug -> run or press CTRL + F9 to run the program.
5.5 PROGRAM:
#include<stdio.h>
#include
<conio.h
> void
main()
{
char s[5];
clrscr();
printf("\n Enter any
operator:");
gets(s);
switch(s[0])
{
case'>': if(s[1]=='=')
printf("\n Greater than
or equal"); else
printf("\n Greater
than"); break;
case'<': if(s[1]=='=')
printf("\n Less
than or equal");
else
printf("\
nLess
than");
case'=':
case'!':
case'&':
case'|':
break;
if(s[1]=='=')
printf("\nE
qual to");
else
printf("\nA
ssignment")
; break;
if(s[1]=='=')
printf("\nN
ot Equal");
else
printf("\n
Bit Not");
break;
if(s[1]=='&')
printf("\nLogica
l AND"); else
printf("\n Bitwise
AND"); break;
if(s[1]=='|')
printf("\nLogical OR");
else
printf("\nBi
twise
OR");
break;
case'+': printf("\n
Addition
");
break;
case'-':
printf("\nSub
straction");
break;
case'*':
printf("\nMultipli
cation"); break;
case'/': printf("\nDivision");
break;
case'%': printf("Modulus");
break;
default: printf("\n Not a operator");
}
getch();
}
5.6
INPUT
&
OUTPU
T:
Input
Enter
any
operator:
* Output
Multiplic
ation
10
EXPERIMENT-6
6.1 OBJECTIVE:
Implement the lexical analyzer using JLex, flex or other lexical analyzer generating tools.
6.2 RESOURCE:
Linux using Putty
6.3 PROGRAM LOGIC:
Read the input string.
Check whether the string is identifier/ keyword /symbol by using the rules of identifier and
keywords using LEX Tool
6.4 PROCEDURE:
Go to terminal .Open vi editor ,Lex lex.l , cc lex.yy.c , ./a.out
6.5
PROGRAM:
/* program name is lexp.l */
%{
/* program to recognize a c
program */ int
COMMENT=0;
%}
identifier [a-zA-Z][a-zA-Z0-9]*
%%
#.* { printf("\n%s is a PREPROCESSOR DIRECTIVE",yytext);}
int |float |char |double |while |for |do |if |break |continue |void |switch |case |long |struct |const |typedef |return
|else |goto {printf("\n\t%s is a
KEYWORD",yytext);} "/*" {COMMENT
= 1;}
/*{printf("\n\n\t%s is a
COMMENT\n",yytext);}*/ "*/"
{COMMENT = 0;}
/* printf("\n\n\t%s is a COMMENT\n",yytext);}*/
{identifier}\( {if(!COMMENT)printf("\n\nFUNCTION\n\t%s",yytext);}
{ {if(!COMMENT) printf("\n BLOCK BEGINS");}
} {if(!COMMENT) printf("\n BLOCK ENDS");}
{identifier}(\[[0-9]*\])? {if(!COMMENT) printf("\n %s
IDENTIFIER",yytext);} ".*\" {if(!COMMENT) printf("\n\t%s is a
STRING",yytext);}
[0-9]+ {if(!COMMENT) printf("\n\t%s is a NUMBER",yytext);}
{if(!COMMENT)
printf("\n\t");ECHO;printf("\n");} (
ECHO;
{if(!COMMENT)printf("\n\t%s is an ASSIGNMENT OPERATOR",yytext);}
<= |>= |< |== |> {if(!COMMENT) printf("\n\t%s is a RELATIONAL OPERATOR",yytext);}
%%
int main(int argc,char **argv)
{
if (argc > 1)
{
FILE *file;
file =
fopen(argv[1],"r
"); if(!file)
{
printf("could not open %s
\n",argv[1]); exit(0);
}
yyin = file;
}
yylex();
11
p
ri
nt
f(
"\
n\
n
")
;
re
tu
r
n
0;
} int yywrap()
{
return 0;
}
6.6 PRE LAB QUESTIONS:
1.
2.
3.
4.
5.
1.
Write a program that defines auxiliary definitions and translation rules of Pascal tokens?
2.
Write a program that defines auxiliary definitions and translation rules of C tokens?
3.
Write a program that defines auxiliary definitions and translation rules of JAVA tokens
What is Jlex?
2.
What is Flex?
3.
4.
5.
6.6
INPUT
&
OUTPU
T:
Input
$vi var.c
#include<
stdio.h>
main()
{
int a,b;
}
Output
$lex lex.l
$cc lex.yy.c
$./a.out var.c
#include<stdio.h> is a PREPROCESSOR
DIRECTIVE FUNCTION
main (
)
BLOCK BEGINS
int is a
KEYW
ORD a
IDENTI
FIER
b
IDENTIFI
ER
BLOCK
ENDS
12
EXPERIMENT-7
7.1 OBJECTIVE:
Write a C program for implementing the functionalities of predictive parser for the mini language
specified in Note 1.
7.2 RESOURCE:
Turbo C++
7.3 PROGRAM LOGIC:
Read the input string.
By using the FIRST AND FOLLOW values.
Verify the FIRST of non terminal and insert the production in the FIRST value
If we have any @ terms in FIRST then insert the productions in
FOLLOW values Constructing the predictive parser table
7.4 PROCEDURE:
Go to debug -> run or press CTRL + F9 to run the program.
7.5 PROGRAM:
#include<stdio.h>
#include<conio.h>
#include<string.h>
char
prol[7][10]={"S","A","A","B","B","C","C"};
char
pror[7][10]={"A","Bb","Cd","aB","@","Cc","@"};
char
prod[7][10]={"S->A","A->Bb","A->Cd","B->aB","B->@","C->Cc","C->@"};
char
first[7][10]={"abcd","ab","cd","a@","@","c@","@"};
char
follow[7]
[10]={"$","$","$","a$","b$","c$","d$"}; char
table[5][6][10];
numr(char c)
{
switch(c)
{
case
'S':
retur
n 0;
case
'A':
retur
n 1;
case
'B':
retur
n 2;
case
'C':
retur
n 3;
case
'a':
retur
n 0;
case
'b':
retur
n 1;
case
'c':
retur
n 2;
case
'd':
retur
n 3;
case
'$':
retur
n 4;
}
13
return(2);
}
void main()
{
int i,j,k;
clrscr(
);
for(i=0
;i<5;i+
+)
for(j=0
;j<6;j+
+)
strcpy(table[i][j]," ");
printf("\nThe following is the predictive parsing table for the following
grammar:\n"); for(i=0;i<7;i++)
printf("%s\n",prod[i]);
printf("\nPredictive parsing table
is\n"); fflush(stdin);
for(i=0;i<7;i++)
{
k=str
len(f
irst[i
]);
for(j
=0;j<
10;j+
+)
if(fir
st[i]
[j]!
='@'
)
strcpy(table[numr(prol[i][0])+1][numr(first[i][j])+1],prod[i]);
}
for(i=0;i<7;i++)
{
if(strlen(pror[i])==1)
{
if(pror[i][0]=='@')
{
k=strlen(
follow[i]
);
for(j=0;j
<k;j++)
strcpy(table[numr(prol[i][0])+1][numr(follow[i][j])+1],prod[i]);
14
}
}
}
strcpy(table[0][0]," ");
strcpy(table[0][1],"a");
strcpy(table[0][2],"b");
strcpy(table[0][3],"c");
strcpy(table[0][4],"d");
strcpy(table[0][5],"$");
strcpy(table[1][0],"S");
strcpy(table[2][0],"A");
strcpy(table[3][0],"B");
strcpy(table[4][0],"C");
printf("\n--------------------------------------------------------\n");
for(i=0
;i<5;i+
+)
for(j=0
;j<6;j+
+)
{
printf("%10s",table[i][j]);
if(j==5)
printf("\n--------------------------------------------------------\n");
}
getch();
}
2.
3.
4.
5.
6.
What are the derivation methods to generate a string for the given grammar?
7.
15
+
T
E
'
/
F
T
T
'
*
F
T
'
/
2.
(
E
)
/
i
Write a program to compute FIRST for the
following grammar? SiCtSS
SeS/
3.
2.
3.
4.
5.
What is LR Parser?
---------------------------------------------------
--------------- S
S->A
S->A
S->A
S->A
----------------------------------------------------------------- A
A->Cd
A->Bb
A->Bb
A->Cd
-----------------------------------------------------------------
B->@
B->aB
B->@
B->@
----------------------------------------------------------------- C
C->@
C->@
C->@
------------------------------------------------------------------
16
EXPERIMENT-8(a)
8.1 OBJECTIVE:
*Write a C program for constructing of LL (1) parsing.
8.2 RESOURCE:
Turbo C++
8.3 PROGRAM LOGIC:
Read the input string.
Using predictive parsing table parse the given input using stack .
If stack [i] matches with token input string pop the token else shift it repeat the process until it reaches to $.
8.4 PROCEDURE:
Go to debug -> run or press CTRL + F9 to run the program.
8.5 PROGRAM
#include<stdio.h>
#include<conio.h>
#include<
string.h>
char
s[20],stac
k[20];
void
main()
{
char m[5][6][3]={"tb"," "," ","tb"," "," "," ","+tb"," "," ","n","n","fc"," "," ","fc"," "," ","
","n","*fc"," a ","n","n","i"," "," ","(e)"," "," "};
int
size[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,str
2;
clrscr(
);
printf("\n Enter the input string:
"); scanf("%s",s);
strcat(
s,"$");
n=strl
en(s);
stack[
0]='$';
s
t
a
c
k
[
1
]
=
'
e
'
;
i
=
1
;
j=0;
printf("\nStack
Input\n"); printf("
\n")
; while((stack[i]!
='$')&&(s[j]!='$'))
{
if(stack[i]==s[j])
{
i
;
j
+
+
;
17
}
switch(stack[i])
{
case 'e': str1=0;
b
reak; case
'b':
str1=1;
b
reak; case
't': str1=2;
b
reak; case
}
'c': str1=3;
b
switch(s[j])
{
reak; case
'f': str1=4;
break;
str2=2;
b
reak; case
'(': str2=3;
b
reak; case
')': str2=4;
b
; case '$':
str2=5;
break;
k
if(m[str1][str2][0]=='\0')
{
printf("\
nERRO
R");
exit(0);
}
else if(m[str1]
[str2][0]=='n')
i--;
else if(m[str1][str2][0]=='i')
18
s
t
a
c
k
[
i
]
=
'
i
'
;
e
l
s
e
{
for(k=size[str1][str2]-1;k>=0;k--)
{
stack[i]=m[str1]
[str2][k]; i++;
}
i--;
}
for(k=0;k
<=i;k++)
printf("
%c",stack
[k]);
printf("
");
for(k=j;k
<=n;k++)
printf("%
c",s[k]);
printf(" \n
");
}
printf("\n
SUCCESS");
getch(); }
8.6 INPUT & OUTPUT:
Enter the input string:i*i+i
Stack
INPUT
$bt
i*i+i$
$bcf
i*i+i$
$bci
i*i+i$
$bc
*i+i$
$bcf*
*i+i$
$bcf
i+i$
$bci
i+i$
$bc
+i$
$b
+i$
$bt+
+i$
$bt
i$
$bcf
i$
$ bci
i$
$bc
$b
success
19
EXPERIMENT-8(b)
8.1 OBJECTIVE:
Construction of recursive descent parsing for the
following grammar E->TE'
E'->+TE/@
"@ represents
8.2 RESOURCE:
Turbo C++
8.3 PROGRAM LOGIC:
Read the input string.
Write procedures for the non terminals
Verify the next token equals to non terminals if it satisfies match the
non terminal. If the input string does not match print error.
8.4 PROCEDURE:
Go to debug -> run or press CTRL + F9 to run the program.
8.5 PROGRAM:
#include<stdio.h>
#include<conio.h>
#inclu
de<str
ing.h>
char
input[
100];
int i,l;
void main()
{
clrscr();
printf("\nRecursive descent parsing for the following
grammar\n"); printf("\nE->TE'\nE'->+TE'/@\nT>FT'\nT'->*FT'/@\nF->(E)/ID\n"); printf("\nEnter the
string to be checked:");
g
e
t
s
(
i
n
p
u
t
)
;
i
f
(
E
(
)
)
{
if(input[i+1]=='\0')
printf("\nString is accepted");
els
e
}
else
printf("\nString not accepted");
20
getch(
);
E
(
)
{
if(T())
{
if(EP())
r
e
else
t
}
else
u
r
n
(
1
)
;
r
e
t
u
r
n
(
0
return(0);
}
E
P
(
)
{
if(input[i]=='+')
{
i
+
+;
if(
T(
))
{
}
else
i
f
(
E
P
(
)
)
ret
ur
n(
1)
;
el
se
ret
ur
n(
0)
;
return(0);
r
n
(
e
if(F())
r
e
t
if(TP())
r
et
u
}
else
r
n
(
1
);
el
s
e
r
et
u
r
n
(
0
);
21
return(0);
}
T
P
()
{
if(input[i]=='*')
{
i
+
+
;
i
f
}
else
F
(
)
)
{
if(TP())
r
e
t
u
r
n
(
1
)
;
e
l
s
e
r
e
t
u
r
n
(
)
return(0);
}
else
return(1);
}
F()
{
if(input[i]=='(')
{
i
+
+
;
i
f
(
E
(
)
)
{
if(input[i]==')')
{
i++;
return(1);
}
else
return(0);
}
e
l
s
e
r
e
t
u
r
n
(
0
)
;
}
else
if(input[i]>='a'&&input[i]<='z'||input[i]>='A'&&input[i]<='Z')
{
i++;
return(1);
22
}
e
l
s
e
r
e
t
u
r
n
(
0
)
;
}
*
F
T
'
/
@
F
>
(
E
)
/
I
D
Enter the string to be checked:
(a+b)*c String is accepted
Recursive descent parsing for the
following grammar E->TE'
E
'
>
+
T
E
'
/
@
T
>
F
T
'
T
'
>
*
F
T
'
/
@
F
>
(
E
)
/
I
D
Enter the string to be
checked:a/c+d String is
not accepted
23
EXPERIMENT-9
9.1
OBJECTIVE:
Write a program to Design LALR Bottom up Parser.
9.2 RESOURCE:
TURBO C++
9.3 PROGRAM LOGIC:
Read the input string.
Push the input symbol with its state symbols in to the stack by referring
lookaheads We perform shift and reduce actions to parse the grammar.
Parsing is completed when we reach $ symbol.
9.4 PROCEDURE:
Go to debug -> run or press CTRL + F9 to run the program.
9.5 PROGRAM:
/
*LA
LR
PAR
SER
E>E+
T
E->T
T
>
T
*
F
T
>
F
F
>
(
E
)
F
>
i
*/
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
void push(char
*,int *,char); char
stacktop(char *);
void
isproduct(char,
char); int
ister(char);
int
isnte
r(cha
r);
int
isstat
e(ch
ar);
void
error
();
void
isreduce(char,c
har); char
pop(char *,int
*);
void printt(char *,int
*,char [],int); void
rep(char [],int);
struct action
{
char row[6][5];
};
24
{"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"}
};
struct gotol
{
char r[3][4];
}
;
{"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"},
{"emp","emp","emp"},
};
char ter[6]={'i','+','*',')','(','$'};
char nter[3]={'E','T','F'};
char
states[12]={'a','b','c','d','e','f','g','h','m','j','
k','l'}; char stack[100];
int
to
p=
-1;
ch
ar
te
m
p[
10
];
str
uc
t
gr
a
m
m
ar
{
25
c
h
a
r
l
e
f
t
;
c
h
a
r
r
i
g
h
t
[
5
]
;
};
const struct grammar rl[6]={
{'E',"e+T"},
{'E',"T"},
{'T',"T*F"},
{'T',"F"},
{'F',"(E)"},
{'F',"i"},
};
void main()
{
char
inp[80],x,p,dl[80],y,
bl='a'; int
i=0,j,k,l,n,m,c,len;
clrscr();
printf(" Enter
the input :");
scanf("%s",inp
);
len=strlen(inp)
; inp[len]='$';
inp[len+1]='\0';
push(stack,&top,
bl); printf("\n
stack \t\t\t
input");
printt(stack,&top
,inp,i);
do
{
x=inp[
i];
p=stac
ktop(st
ack);
isproduct(x,p);
if(strcmp(temp,"em
p")==0)
error();
if(strcmp(temp,"acc"
)==0)
break;
else
{
if(temp[0]=='s')
{
push(stack,&to
p,inp[i]);
push(stack,&to
p,temp[1]); i+
+;
26
}
else
{
if(temp[0]=='r')
{
j=isstate(tem
p[1]);
strcpy(temp,
rl[j-2].right);
dl[0]=rl[j2].left;
dl[1]='\0';
n=strlen(temp);
for(k=0;k<2*n;k+
+)
pop(stack,&top);
for(m=0;dl[m]!='\0';m++)
push(stack,&top,dl[m]);
l
=
t
o
p
;
y
=
s
t
a
c
k
[
l
1
]
;
isreduce(y,dl[0]);
for(m=0;temp[m]!
='\0';m++)
push(stack,&top,temp[m]);
}
}
}
printt(stack,&top,inp,i);
}while(inp[i]!='\0');
if(strcmp(temp,"acc")==0)
printf(" \n accept the input ");
else
printf(" \n do not accept the input ");
getch();
}
void push(char *s,int *sp,char item)
{
if(*sp==100)
printf(" stack is full ");
else
{
*sp=*sp+1;
27
s[*sp]=item;
}
}
char stacktop(char *s)
{
c
h
a
r
i;
i
=
s
[t
o
p
];
r
e
t
u
r
n
i;
}
void isproduct(char x,char p)
{
i
n
t
k
,
l
;
k
=
i
s
t
e
r
(
x
)
;
l
=
i
s
s
t
a
t
e
(
p
)
;
strcpy(temp,A[l-1].row[k-1]);
}
int ister(char x)
{
int i;
for(i=0
;i<6;i+
+)
if(x==ter[i])
return i+1;
return 0;
}
int isnter(char x)
{
int i;
for(i=0
;i<3;i+
+)
if(x==nter[i])
return i+1;
return 0;
}
int isstate(char p)
{
int i;
for(i=0
;i<12;i
++)
if(p==states[i])
28
return i+1;
return 0;
}
void error()
{
printf(" error in the
input "); exit(0);
}
void isreduce(char x,char p)
{
i
n
t
k
,
l
;
k
=
i
s
s
t
a
t
e
(
x
)
;
l
=
i
s
n
t
e
r
(
p
)
;
strcpy(temp,G[k-1].r[l-1]);
}
i
t
e
m
;
i
f
(
*
s
p
=
=
1
)
printf(" stack is empty ");
else
{
item=s[*sp];
*sp=*sp-1;
}
return item;
}
void printt(char *t,int *p,char inp[],int i)
{
i
n
t
r
;
p
r
i
n
t
f
(
"
\
n
"
)
;
for(r=0;r<=*p;r++)
rep(t,r);
printf("\t\t\t");
for(r=i;inp[r]!
='\0';r++)
29
printf("%c",inp[r]);
}
void rep(char t[],int r)
{
c
h
a
r
c
;
c
=
t
[
r
]
;
s
w
i
t
c
h
(
c
)
{
case 'a': printf("0");
break;
case 'b': printf("1");
break;
case 'c': printf("2");
break;
30
9.7
9.8
LAB ASSIGNMENT
1
POST-LAB QUESTIONS:
1.
2.
3.
4.
5.
9.9
INPUT
&
OUTPU
T: Enter
the
input:
i*i+1
Output
Stack
input
i*i+i$
0i5
*i+i$
0F3
*i+i$
0T2
*i+i$
0T2*7
i+i$
0T2*7i5
+i$
0T2*7i5F10
+i$
0T2
+i$
0E1
+i$
0E1+6
i$
0E1+6i5
0E1+6F3
0E1+6T9
0E1
31
EXPERIMENT-10(a)
10.1OBJECTIVE:
*Write a C program to implement operator precedence parsing.
10.2RESOURCE:
Turbo C++
10.3PROGRAM LOGIC:
Read the arithmetic input string.
Verify the precedence between terminals and symbols
Find the handle enclosed in < . > and reduce it to production
symbol. Repeat the process till we reach the start node.
10.4PROCEDURE:
Go to debug -> run or press CTRL + F9 to run the program.
10.5PROGRAM:
#include
<stdio.h>
char
str[50],op
str[75];
int
f[2][9]={2,3,4,4,4,0,6,6,0,1,1,3,3,5,5,0,5,0};
int
col,col
1,col2;
char c;
swt()
{
switch(c)
{
case'+':col
col=1;brea
k;
case'*':col=
2;break;
case'/':col=
3;break;
case'^':col=
4;break;
case'(':col=
5;break;
case')':col=
6;break;
case'd':col=
7;break;
'
case'$':col=
8;break;
'
default:printf("\nTERMINAL
MISSMATCH\n"); exit(1);
32
break;
}
// return 0;
}
main()
{
int
i=0,j=0,col1
,cn,k=0; int
t1=0,foundg
=0;
char
tem
p[20
];
clrsc
r();
printf("\nEnter arithmetic
expression:"); scanf("%s",&str);
while(str[i]!='\0')
i++;
str[i]='$';
str[++i]='\0';
printf(
"%s\n"
,str);
come:
i=0;
o
p
s
t
r
[
0
]
=
'
$
'
;
j
=
1
;
c='$';
s
w
t
(
)
;
c
o
l
1
=
c
o
l
;
c
=
s
t
r
[
i
]
;
s
w
t
(
)
;
c
o
l
2
=
c
o
l
;
if(f[1][col1]>f[2][col2])
{
o
p
s
t
r
[
j
]
=
'
>
';
j
+
+
;
}
else if(f[1][col1]<f[2][col2])
{
o
p
st
r[
j]
='
<'
;
j
+
+
;
}
33
else
{
opstr[j]='=';j++;
while(str[i]!='$')
{
c=str[i];
s
w
t(
);
c
ol
1
=
c
ol
;
c
=
st
r[
+
+
i]
;
s
w
t(
);
c
ol
2
=
c
ol
;
opst
r[j]=
str[-i];
j++;
if(f[0][col1]>f[1][col2])
{
op
str[
j]=
'>';
j+
+;
}
else if(f[0][col1]<f[1][col2])
{
o
p
s
t
r
[
j
]
=
'
<
'
;
j
+
+
;
}
else
{
opstr[j]='=';j++;
}
opstr[j]='$';
i
+
+
;
opstr[++j]='\0';
printf("\nPrecedence Input:
%s\n",opstr); i=0;
j=0;
while(opstr[i]!='\0')
34
{
foundg=0;
while(found
g!=1)
{
if(opstr[i]=='\0')g
oto redone;
if(opstr[i]=='>')fo
undg=1; t1=i;
i++;
}
if(
fou
nd
g=
=1)
for
(i=
t1;i
>0;
i--)
if(opstr[i]=='<')break;
if(i==0)
{printf("\nERROR\n");exit(
1);} cn=i;
j
=
0
;
i
=
t
1
+
1
;
while(opstr[i]!='\0')
{
temp
[j]=o
pstr[i]
; j+
+;i+
+;
}
temp[j]='\0';
opstr[cn]='
E';
opstr[+
+cn]='\0';
strcat(opst
r,temp);
printf("\n
%s",opstr
); i=1;
}
redone:k=0;
while(opstr[
k]!='\0')
{
k++;
if(opstr[k]=='<')
{
Printf(
"\nErr
or");
exit(1
);
}
35
}
if((opstr[0]=='$')&&(opstr[2]=='$')
)goto sue; i=1
while(opstr[i]!='\0')
{
c=opstr[i]; if(c=='+'||
c=='*'||c=='/'||c=='$')
{
tem
p[j]
=c;j
++;}
i++;
}
temp[j]=
'\0';
strcpy(s
tr,temp)
; goto
come;
sue:
printf("\n
success");
return 0;
}
Output:
(d*d)+d$
Precedence input:$<(<d>*<d>)>+<d>$
$<(E*<d>)>+<d>$
$<(E*E)>+<E>$
$E+<E>$
$E+E$
Precedence input:$<+>$
$
E
$
s
u
c
c
e
s
s
36
EXPERIMENT-10(b)
10.1OBJECTIVE:
Program to implement semantic rules to calculate the expression that takes an expression with digits, +
and
* and computes the value.
10.2RESOURCE:
Linux using putty
10.3PROCEDURE:
Reading an input file
Calculate the sum or multiplication of given
expression. Using expression rule print the
result of the given values.
10.4PROGRAM:
<parser.l>
%{
#include<stdio.h>
#include "y.tab.h"
%}
%%
[0-9]+
{yylval.dval=atof(yytext)
; 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' {
37
printf("%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);
}
10.6 INPUT & OUTPUT:
$lex parser.l
$yacc d parser.y
$cc lex.yy.c y.tab.c ll lm
$
.
/
a
.
o
u
t
2
+
3
5.0000
38
EXPERIMENT-11
11.1 OBJECTIVE:
Convert The BNF rules into Yacc form and write code to generate abstract syntax tree.
11.2 RESOURCE :
linux using putty
11.3 PROGRAM LOGIC:
Reading an input file line by line.
Convert it in to abstract syntax tree using three address
code. Represent three address code in the form of
quadruple tabular form.
11.4 PROCEDURE:
Go to terminal .Open vi editor ,Lex lex.l , cc lex.yy.c , ./a.out
11.5 PROGRAM
<int.l>
%{
#include"y.tab.h"
#include<stdio.h>
#inclu
de<stri
ng.h>
int
LineN
o=1;
%}
identifier [a-zA-Z][_a-zAZ0-9]* number [0-9]+|([09]*\.[0-9]+)
%%
main\(\)
return
MAIN; if
return IF;
else return
ELSE;
while
return
WHILE;
int |
char |
float return TYPE;
{identifier}
{strcpy(yylval.var,yytext);
return VAR;}
{number}
{strcpy(yylval.var,yytext);
return NUM;}
< |> |>= |<= |==
{strcpy(yylval.var,yytext);
return RELOP;}
[ \t] ;
\n LineNo++;
. return yytext[0];
%%
<int.y>
%{
#include<string.h>
#include<
stdio.h>
struct
quad{
ch
ar
op
[5]
;
ch
ar
ar
g1
[1
0];
ch
ar
ar
g2
[1
0];
ch
ar
res
ult
[1
0];
}QUAD[30];
struct stack{
int
ite
ms
[1
00
];
int
to
p;
}stk;
int Index=0,tIndex=0,StNo,Ind,tInd;
39
sprintf(QUAD[Ind].result,"%d
",Index);
}
| IFST ELSEST
;
IFST: IF '(' CONDITION ')' {
strcpy(QUAD[Index].op,"
==");
strcpy(QUAD[Index].arg
1,$3);
strcpy(QUAD[Index].arg
2,"FALSE");
strcpy(QUAD[Index].res
ult,"-1"); push(Index);
40
Index++;
}
BLOCK {
strcpy(QUAD[Index].op,"GOT
O");
strcpy(QUAD[Index].arg1,"");
strcpy(QUAD[Index].arg2,"");
strcpy(QUAD[Index].result,"1"); push(Index);
Index++;
};
ELSEST: ELSE{
t
I
n
d
=
p
o
p
(
)
;
I
n
d
=
p
o
p
(
)
;
p
u
s
h
(
t
I
n
d
)
;
sprintf(QUAD[Ind].result,"%d",Index);
}
B
L
O
C
K
{
Ind=pop();
sprintf(QUAD[Ind].result,"%d
",Index);
};
CONDITION: VAR RELOP VAR
{AddQuadruple($2,$1,$3,$$); StNo=Index-1;
}
| VAR
| NUM
;
WHILEST: WHILELOOP{
Ind=pop();
sprintf(QUAD[Ind].result,"%
d",StNo); Ind=pop();
sprintf(QUAD[Ind].result,"%d
",Index);
}
;
WHILELOOP: WHILE '(' CONDITION ')' {
strcpy(QUAD[Index].op,"
==");
strcpy(QUAD[Index].arg
1,$3);
strcpy(QUAD[Index].arg
2,"FALSE");
strcpy(QUAD[Index].res
ult,"-1"); push(Index);
Index++;
}
BLOCK {
strcpy(QUAD[Index].op,"GOT
O");
strcpy(QUAD[Index].arg1,"");
strcpy(QUAD[Index].arg2,"");
strcpy(QUAD[Index].result,"1"); push(Index);
Index++;
}
;
%%
extern FILE *yyin;
int main(int
argc,char *argv[]) {
FILE *fp;
i
n
t
i
;
i
f
(
a
r
g
c
>
1
)
{
fp=fopen(
argv[1],"r"
); if(!fp) {
printf("\n File not
found"); exit(0);
41
}
yyin=fp;
}
yyparse();
printf("\n\n\t\t ----------------------------""\n\t\t Pos Operator Arg1 Arg2 Result" "\n\t\t
--------------------");
for(i=0;i<Index;i++)
{
printf("\n\t\t %d\t %s\t %s\t %s\t
%s",i,QUAD[i].op,QUAD[i].arg1,QUAD[i].arg2,QUAD[i].result);
}
printf("\n\t\t
-----------------------");
printf("\n\n");
return 0;
}
void
push(int
data){
stk.top++;
if(stk.top=
=100)
{
printf("\n Stack
overflow\n");
exit(0);
}
stk.items[stk.top]=data;
}
int pop()
{
int
dat
a;
if(s
tk.t
op
==1){
printf("\n Stack
underflow\n");
exit(0);}
data=stk.items[stk.
top--]; return
data;
}
void AddQuadruple(char op[5],char arg1[10],char arg2[10],char result[10])
{
strcpy(QUAD[Index].op,op);
strcpy(QUAD[Index].arg1,arg1);
strcpy(QUAD[Index].arg2,arg2);
sprintf(QUAD[Index].result,"t%d",tIndex+
+); strcpy(result,QUAD[Index++].result);
}
yyerror()
{
printf("\n Error on line no:%d",LineNo);
}
Input:
$
v
i
t
e
s
t
.
c
m
a
i
n
(
)
{
i
n
t
a
,
b
,
c
;
i
f
(
a
<
b
)
{
a=a+b;
}
w
hi
le
(a
<
b
){
a
=
a
+
b;
}
i
f
(
a
<
=
b
)
{
c
=
a
b
;
}
42
else
{
c=a+b;
}
}
11.8
What are the record structures we use to represent three address code?
LAB ASSIGNMENT
1
11.9
11.10
POST-LAB QUESTIONS:
1.
2.
3.
4.
5.
OUTPUT
Pos
0
Operator
<
Arg1
a
1
2
3
4
==
+
==
GOTO
t0
a
t1
Arg2
b
FALSE
b
Result
t0
5
t1
5
5
6
7
8
9
10
11
12
13
14
15
16
<
==
+
=
GOTO
<=
==
=
GOTO
+
=
43
a
t2
a
t3
b
FALSE
b
a
t4
a
t5
b
FALSE
b
a
t6
t2
10
t3
a
5
t4
15
t5
c
17
t6
c