CC File
CC File
THEORY:-
A token is a string of one or more characters that is significant as a group. The
process of forming tokens from an input stream of characters is
called tokenization.
Tokens are identified based on the specific rules of the lexer. Some methods used
to identify tokens include: regular expressions, specific sequences of characters
known as a flag, specific separating characters called delimiters, and explicit
definition by a dictionary. Special characters, including punctuation characters,
are commonly used by lexers to identify tokens because of their natural use in
written and programming languages.
A lexical analyzer generally does nothing with combinations of tokens, a task left
for a parser. For example, a typical lexical analyzer recognizes parentheses as
tokens, but does nothing to ensure that each "(" is matched with a ")".
PROCEDURE:
#include<stdio.h>
#include<ctype.h>
#include<conio.h>
#include<string.h>
int main()
{
charstr[50];
intlen;
inti,a=0,b=0,d=0,f=0,var=0,tokens=0,constant=0,oper=0;
clrscr();
printf("enter string :");
scanf("%s",str);
len=strlen(str);
for(i=0;i<len;i++)
{
if (isalpha(str[i]))
a++;
if (isdigit(str[i]))
{
while(isdigit(str[i]))
{
i++;
}
d++;
}
if(str[i]=='%'||str[i]=='*'||str[i]=='/'||str[i]=='+'||str[i]=='-'||str[i]=='=')
f++;
else
b++;
}
var=a;
constant=d;
oper=f;
tokens=var+constant+oper;
printf("\ntotalvar:%d ",var);
printf("\ntotal constants:%d",constant);
printf("\ntotalopeators:%d",oper);
printf("\ntotal tokens: %d",tokens);
return 0;
getch();
}
OUTPUT;
\
RESULT:
The program is successfully written and created in c language
Total 6
EXPERIMENT-2
DATE:
OBJECTIVE: WAP to write a Regular Expression.
EQUIPMENT/SOFTWARE USED:
S.NO. HARDWARE SOFTWARE
1. I7 PROCESSOR OS (WINDOWS 8)
2. 8 GB RAM MICROSOFT WORD
3. KEYBOARD TURBO C/C++
4. MOUSE
5. MONITOR
6. PRINTER
THEORY:-
In theoretical computer science and formal language theory, a regular expression
(abbreviated regex or regexp) is a sequence of characters that forms a search pattern, mainly
for use in pattern matching with strings, or string matching, i.e. "find and replace"-like
operations. Each character in a regular expression is either understood to be a metacharacter
with its special meaning, or a regular character with its literal meaning. Together, they can be
used to identify textual material of a given pattern, or process a number of instances of it that
can vary from a precise equality to a very general similarity of the pattern. The pattern
sequence itself is an expression that is a statement in a language designed specifically to
represent prescribed targets in the most concise and flexible way to direct the automation of
text processing of general text files, specific textual forms, or of random input strings.
In automata theory, a nondeterministic finite automaton (NFA), or nondeterministic finite
state machine, is a finite state machine that (1) does not require input symbols for state
transitions and (2) is capable of transitioning to zero or two or more states for a given start
state and input symbol.
PROCEDURE:
#include<stdio.h>
#include<string.h>
#include<conio.h>
int main()
{ clrscr();
char reg[20];
int q[20][3],i,j,len,a,b;
for(a=0;a<20;a++)
{
for(b=0;b<3;b++)
{
q[a][b]=0;
}
}
printf("Regular expression: \n");
scanf("%s",reg);
len=strlen(reg);
i=0;
j=1;
while(i<len)
{
if(reg[i]=='a'&®[i+1]!='/'&®[i+1]!='*')
{
q[j][0]=j+1;
j++;
}
if(reg[i]=='b'&®[i+1]!='/'&®[i+1]!='*')
{
q[j][1]=j+1;
j++;
}
if(reg[i]=='e'&®[i+1]!='/'&®[i+1]!='*')
{
q[j][2]=j+1;
j++;
}
if(reg[i]=='a'&®[i+1]=='/'&®[i+2]=='b')
{
q[j][2]=((j+1)*10)+(j+3);
j++;
q[j][0]=j+1;
j++;
q[j][2]=j+3;
j++;
q[j][1]=j+1;
j++;
q[j][2]=j+1;
j++;
i=i+2;
}
if(reg[i]=='b'&®[i+1]=='/'&®[i+2]=='a')
{
q[j][2]=((j+1)*10)+(j+3);
j++;
q[j][1]=j+1;
j++;
q[j][2]=j+3;
j++;
q[j][0]=j+1;
j++;
q[j][2]=j+1;
j++;
i=i+2;
}
if(reg[i]=='a'&®[i+1]=='*')
{
q[j][2]=((j+1)*10)+(j+3);
j++;
q[j][0]=j+1;
j++;
q[j][2]=((j+1)*10)+(j-1);
j++;
}
if(reg[i]=='b'&®[i+1]=='*')
{
q[j][2]=((j+1)*10)+(j+3);
j++;
q[j][1]=j+1;
j++;
q[j][2]=((j+1)*10)+(j-1);
j++;
}
if(reg[i]==')'&®[i+1]=='*')
{
q[0][2]=((j+1)*10)+1;
q[j][2]=((j+1)*10)+1;
j++;
}
i++;
}
printf("Transition function \n");
for(i=0;i<=j;i++)
{
if(q[i][0]!=0)
printf("\n q[%d,a]-->%d",i,q[i][0]);
if(q[i][1]!=0)
printf("\n q[%d,b]-->%d",i,q[i][1]);
if(q[i][2]!=0)
{
if(q[i][2]<10)
printf("\n q[%d,e]-->%d",i,q[i][2]);
else
printf("\n q[%d,e]-->%d & %d",i,q[i][2]/10,q[i][2]%10);
}
getch();
}
OUTPUT:
RESULT:
Total 6
EXPERIMENT-4
DATE:
OBJECTIVE: WAP to remove of Left Recursion.
EQUIPMENT/SOFTWARE USED:
S.NO. HARDWARE SOFTWARE
1. I7 PROCESSOR OS (WINDOWS 8)
2. 8 GB RAM MICROSOFT WORD
3. KEYBOARD TURBO C/C++
4. MOUSE
5. MONITOR
6. PRINTER
PROCEDURE:
STRUCT PRODUCTION
{
CHAR L ;
CHAR R [10];
INT REAR ;
};
STRUCT PRODUCTION PR OD [20], PR _ NEW [20];
VOID MAIN ()
{
CLRSCR ();
COUT <<"E NTER THE TERMINAL SY MBOLS FOR YOUR PRODUCTION : ";
FOR ( INT K =0; K < D ; K ++)
{
CIN >> TERMINAL [ K ];
COUT <<"E NTER THE NON - TERMINAL SYMBOLS FOR YOUR PRODUCTION : ";
FOR ( K =0; K < F ; K ++)
{
CIN >> NONTERM [ K ];
COUT <<"\ N E NTER THE NUMBER OF S PECIAL CHARACTERS ( EXCEPT NON - TERMINALS ): ";
CIN >> Q ;
COUT <<"E NTER THE SPECIAL CHARACTERS FOR YOUR PRO DUCTION : ";
FOR ( K =0; K < Q ; K ++)
{
CIN >> ALPHA [ K ];
{
COUT <<"E NTER THE "<< K +1<<" PRODUCTION : ";
CIN >> PROD [ K ]. L ;
COUT <<"->";
{
X = NONTERM [ M ];
{
IF (( PROD [ J ]. L == X )&&( PROD [ J ]. R [0]== PROD [ J ]. L ))
FL AG =1;
}
FOR ( INT I =0; I < N ; I ++)
{
IF (( PROD [ I ]. L == X )&&( PROD [ I ]. R [0]!= X )&&( FLAG ==1))
{
PR _ NEW [ B ]. L = X ;
PR _ NEW [ B ]. R [ C ]= PROD [ I ]. R [ C ];
}
ELSE IF (( PROD [ I ]. L == X )&&( PROD [ I ]. R [0]== X )&&( FLAG ==1))
{
PR _ NEW [ B ]. L = ALPHA [ P ];
PR _ NEW [ B ]. L = ALPHA [ P ];
}
ELSE IF (( PROD [ I ]. L == X )&&( PROD [ I ]. R [0]!= X )&&( FLAG ==0))
{
PR _ NEW [ B ]. L = PROD [ I ]. L ;
B ++;
}
}
FLAG =0;
P ++;
{
COUT <<"P RODUCTION "<< S +1<<" IS : ";
COUT << PR _ NEW [ S ]. L ;
COUT <<"->";
GETCH ();
OUTPUT:
RESULT:
The program is successfully written and created in c language
Compiler Construction
Programme B.Tech-CSE Course Name
lab
Course Code CSE304 Semester 5th
Nanda Vardhan
Student Name Enrolment No. A2305216610
Reddy
Marking Criteria
Marks
Criteria Total Marks Comments
Obtained
Concept (A) 2
Implementation
2
(B)
Performance (C) 2
Total 6
EXPERIMENT – 5
DATE:
OBJECTIVE: WAP to implement recursive descent parser.
EQUIPMENT/SOFTWARE USED:
S.NO. HARDWARE SOFTWARE
1. I7 PROCESSOR OS (WINDOWS 8)
2. 8 GB RAM MICROSOFT WORD
3. KEYBOARD TURBO C/C++
4. MOUSE
5. MONITOR
6. PRINTER
THEORY:
In formal language theory, a grammar (when the context is not given, often called a formal grammar
for clarity) is a set of production rules for strings in a formal language. The rules describe how to
form strings from the language's alphabet that are valid according to the language's syntax. A
grammar does not describe the meaning of the strings or what can be done with them in whatever
context—only their form.
A grammar mainly consists of a set of rules for transforming strings. To generate a string in the
language, one begins with a string consisting of only a single start symbol. The production rules are
then applied in any order, until a string that contains neither the start symbol nor designated
nonterminal symbols is produced. A production rule is applied to a string by replacing one
occurrence of its left-hand side in the string by its right-hand side (cf. The operation of the
theoretical turing machine). The language formed by the grammar consists of all distinct strings that
can be generated in this manner. Any particular sequence of production rules on the start symbol
yields a distinct string in the language. If there are multiple ways of generating the same single
string, the grammar is said to be ambiguous.
PROCEDURE:
{
PRINTF ("E NTER EXPRESSION :");
RETURN 0;
}
VOID E D () //E'->+TE'
{
IF ( IP [ PTR ] == '+')
{
PTR ++;
T();
E D ();
}
ELSE IF ( IS A LPHA ( IP [ PTR ])) // IF IT ' S AN ALPHABET AT THE WRONG PLACE
ERROR ();
VOID T D () //T'->*FT'
{
IF ( IP [ PTR ] == '*')
{
PTR ++;
F();
T D ();
}
ELSE IF ( IS A LPHA ( IP [ PTR ])) // IF IT ' S AN ALPHABET AT THE WRONG PLACE
ERROR ();
E();
IF ( IP [ PTR ] == ')')
PTR ++;
ELSE
ERROR ();
}
ELSE
{
IF ( IS A LPHA ( IP [ PTR ])) // TERMINAL
PTR ++;
ELSE
ERROR ();
}
}
INT IS A LPHA ( CHAR C )
{
RETURN ( C >=' A ' && C <=' Z ');
}
VOID ERROR ()
{
PRINTF ("\ N I NVALID E XPRESSION \ N ");
EXIT (0);
OUTPUT:
ENTER EXPRESSION : A+ A
VALID EXPRESSION
--------------------
ENTER EXPRESSION : +A
INVALID EXPRESSION */
RESULT:
The program is successfully written and created in c language
Compiler Construction
Programme B.Tech-CSE Course Name
lab
Course Code CSE304 Semester 5th
Nanda Vardhan
Student Name Enrolment No. A2305216610
Reddy
Marking Criteria
Marks
Criteria Total Marks Comments
Obtained
Concept (A) 2
Implementation
2
(B)
Performance (C) 2
Total 6
EXPERIMENT-7
DATE:
OBJECTIVE: WAP to design a top down parser
EQUIPMENT/SOFTWARE US:
S.NO. HARDWARE SOFTWARE
1. I7 PROCESSOR OS (WINDOWS 8)
2. 8 GB RAM MICROSOFT WORD
3. KEYBOARD TURBO C/C++
4. MOUSE
5. MONITOR
6. PRINTER
THEORY:
The top down construction of a parse tree is done by starting with the root ,labeled with the starting
non-terminal ,and repeatedly performing the following two steps-
1. at node n, labeled with non-terminal A,select one of the productions for A and construct
children at n for the symbols on the right side of the production
2. Find the next node at which the subtree is constructed.
For some grammars, the above steps can be implemented during a single left to right scan of the input
string. The current token being scanned on the input is often called as the lookahead symbol . Initially
the lookahead symbol is the first i.e the leftmost token of the input string.
Here we have assumed that , at the first attempt the parser would know
which production to use to get the right output, but in general, the selection of a production of a non-
terminal may involve trial and error, that is we may have to try a production and backtrack to try
another production if the first is found to be unsuitable. A production is unsuitable ,if after using the
production, we cannot complete the tree to match the input string .we will discuss this parsing in the
next section.
PROCEDURE:
#include<iostream.h>
#include<conio.h>
#include<string.h>
class parse
{
int nt,t,m[20][20],i,s,n,p1,q,k,j;
char p[30][30],n1[20],t1[20],ch,b,c,f[30][30],fl[30][30];
public:
int scant(char);
int scannt(char);
void process();
void input();
};
int parse::scannt(char a)
{
int c=-1,i;
for(i=0;i<nt;i++)
{
if(n1[i]==a)
{
return i;
}
}
return c;
}
int parse::scant(char b)
{
int c1=-1,j;
for(j=0;j<t;j++)
{
if(t1[j]==b)
{
return j;
}
}
return c1;
}
void parse::input()
{
cout<<"Enter the number of productions:";
cin>>n;
cout<<"Enter the productions one by one"<<endl;
for(i=0;i<n;i++)
cin>>p[i];
nt=0;
t=0;
}
void parse::process()
{
for(i=0;i<n;i++)
{
if(scannt(p[i][0])==-1)
n1[nt++]=p[i][0];
}
for(i=0;i<n;i++)
{
for(j=3;j<strlen(p[i]);j++)
{
if(p[i][j]!='e')
{
if(scannt(p[i][j])==-1)
{
if((scant(p[i][j]))==-1)
t1[t++]=p[i][j];
}
}
}
}
t1[t++]='$';
for(i=0;i<nt;i++)
{
for(j=0;j<t;j++)
m[i][j]=-1;
}
for(i=0;i<nt;i++)
{
cout<<"Enter first["<<n1[i]<<"]:";
cin>>f[i];
}
for(i=0;i<nt;i++)
{
cout<<"Enter follow["<<n1[i]<<"]:";
cin>>fl[i];
}
for(i=0;i<n;i++)
{
p1=scannt(p[i][0]);
if((q=scant(p[i][3]))!=-1)
m[p1][q]=i;
if((q=scannt(p[i][3]))!=-1)
{
for(j=0;j<strlen(f[q]);j++)
m[p1][scant(f[q][j])]=i;
}
if(p[i][3]=='e')
{
for(j=0;j<strlen(fl[p1]);j++)
m[p1][scant(fl[p1][j])]=i;
}
}
for(i=0;i<t;i++)
cout<<"\t"<<t1[i];
cout<<endl;
for(j=0;j<nt;j++)
{
cout<<n1[j];
for(i=0;i<t;i++)
{
cout<<"\t"<<" ";
if(m[j][i]!=-1)
cout<<p[m[j][i]];
}
cout<<endl;
}
}
void main()
{
clrscr();
parse p;
p.input();
p.process();
getch();
}
OUTPUT:
RESULT:
The program successfully runs through many test cases and every time, and gives the correct result for
top down parser
Compiler Construction
Programme B.Tech-CSE Course Name
lab
Course Code CSE304 Semester 5th
Nanda Vardhan
Student Name Enrolment No. A2305216610
Reddy
Marking Criteria
Marks
Criteria Total Marks Comments
Obtained
Concept (A) 2
Implementation
2
(B)
Performance (C) 2
Total 6
EXPERIMENT – 8
DATE:
OBJECTIVE: WAP to check whether string is accepted or not for entered grammar
EQUIPMENT/SOFTWARE USED:
S.NO. HARDWARE SOFTWARE
1. I7 PROCESSOR OS (WINDOWS 8)
2. 8 GB RAM MICROSOFT WORD
3. KEYBOARD TURBO C/C++
4. MOUSE
5. MONITOR
6. PRINTER
THEORY:
In formal language theory, a grammar (when the context is not given, often called a formal grammar
for clarity) is a set of production rules for strings in a formal language. The rules describe how to
form strings from the language's alphabet that are valid according to the language's syntax. A
grammar does not describe the meaning of the strings or what can be done with them in whatever
context—only their form.
A grammar mainly consists of a set of rules for transforming strings. To generate a string in the
language, one begins with a string consisting of only a single start symbol. The production rules are
then applied in any order, until a string that contains neither the start symbol nor designated
nonterminal symbols is produced. A production rule is applied to a string by replacing one
occurrence of its left-hand side in the string by its right-hand side (cf. The operation of the
theoretical turing machine). The language formed by the grammar consists of all distinct strings that
can be generated in this manner. Any particular sequence of production rules on the start symbol
yields a distinct string in the language. If there are multiple ways of generating the same single
string, the grammar is said to be ambiguous.
PROCEDURE:
#include<iostream.h>
#include<conio.h>
#include<string.h>
#include<stdio.h>
void main()
{
char string[20];
int state=0,count=0;
clrscr();
cout<<"the grammar is: S->aS, S->Sb, S->ab \n";
cout<<"enter the string to be checked \n";
gets(string);
while(string[count]!='\0')
{
switch(state)
{
case 0: if (string[count]=='a')
state=1;
else
state=3;
break;
case 1: if (string[count]=='a')
state=1;
else if(string[count]=='b')
state=2;
else
state=3;
break;
case 2: if (string[count]=='b')
state=2;
else
state=3;
break;
default: break;
}
count++;
if(state==3)
break;
}
if(state==2)
cout<<"string is accepted";
else
cout<<"string is not a
ccepted";
getch();
}
OUTPUT:
RESULT:
The program is successfully written and created in C++ language.
Compiler Construction
Programme B.Tech-CSE Course Name
lab
Course Code CSE304 Semester 5th
Nanda Vardhan
Student Name Enrolment No. A2305216610
Reddy
Marking Criteria
Marks
Criteria Total Marks Comments
Obtained
Concept (A) 2
Implementation
2
(B)
Performance (C) 2
Total 6
EXPERIMENT-9
OBJECTIVE : WAP to design a shift reduce parser
EQUIPMENT/SOFTWARE USED :
S.NO. HARDWARE SOFTWARE
1. I7 PROCESSOR OS (WINDOWS 8)
2. 8 GB RAM MICROSOFT WORD
3. KEYBOARD TURBO C/C++
4. MOUSE
5. MONITOR
6. PRINTER
PROCEDURE :
Shift-Reduce parsing is a category of efficient, table-driven bottom-up parsing methods for computer
languages and other notations formally defined by a grammar. The parsing methods most commonly
used today, LR parsing and its variations, are shift-reduce methods.[1] The precedence parsers used
before the invention of LR parsing are also shift-reduce methods. All shift-reduce parsers have similar
outward effects, in the incremental order in which they build a parse tree or call specific output
actions. The outward actions of an LR parser are best understood by ignoring the arcane mathematical
details of how LR parser tables are generated, and instead looking at the parser as just some generic
shift-reduce method.
A shift-reduce parser scans and parses the input text in one forward pass over the text, without
backing up. (That forward direction is generally left-to-right within a line, and top-to-bottom for
multi-line inputs.) The parser builds up the parse tree incrementally, bottom up, and left to right,
without guessing or backtracking. At every point in this pass, the parser has accumulated a list of
subtrees or phrases of the input text that have been already parsed. Those subtrees are not yet joined
together because the parser has not yet reached the right end of the syntax pattern that will combine
them.
A shift-reduce parser works by doing some combination of Shift steps and Reduce steps.
A Shift step advances in the input stream by one symbol. That shifted symbol becomes a new single-
node parse tree.
A Reduce step applies a completed grammar rule to some of the recent parse trees, joining them
together as one tree with a new root symbol.
The parser continues with these steps until all of the input has been consumed and all of the parse
trees have been reduced to a single tree representing an entire legal input.
PROCEDURE:
#include<stdio.h>
#include<conio.h>
#include<string.h>
char exp[30],stack[30],arr[30],temp[30];
int i,k=0,j,l,r,s;
void push(char exp[])
{
arr[i]=exp[k];
i++;
}
void dispinp()
{
printf("\t\t\t");
for(k=0;k<strlen(exp);k++)
printf("%c",exp[k]);
printf("$");
}
void dispstk()
{
printf("\n");
for(k=0;k<strlen(stack);k++)
printf("%c",stack[k]);
}
void assign()
{
stack[++j]=arr[i];
exp[i]=' '; 21
dispstk();
dispinp();
}
int main()
{
printf("\t\t\tSHIFT REDUCE PARSER\n");
printf("\nThe Production is: E->E+E/E*E/d/a\n");
printf("\nEnter the string to be parsed:\n");
gets(exp);
printf("\nSTACK\t\t\tINPUT\t\t\tACTION\n");
printf("\n$");
dispinp();
printf("\t\t\tShift");
for(k=0;k<strlen(exp);k++)
push(exp);
l=strlen(exp);
stack[0]='$';
for(i=0;i<l;i++)
{
switch(arr[i])
{
case 'd':
assign();
printf("\t\t\tReduce by E->d");
stack[j]='E';
dispstk();
dispinp();
if(arr[i+1]!='\0') 22
printf("\t\t\tShift");
break;
case '+':
assign();
printf("\t\t\tShift");
break;
case '*':
assign();
printf("\t\t\tShift");
break;
case '-':
assign();
printf("\t\t\tShift");
break;
default:
printf("\nError:String not accepted");
goto label;
}}
l=strlen(stack);
while(l>2)
{
r=0;
for(i=l-1;i>=l-3;i--)
{
temp[r]=stack[i];
r++;
}
temp[r]=NULL;
if((strcmp(temp,"E+E")==0)||(strcmp(temp,"E*E")==0)||(strcmp(temp,"E*E")==0))
{
for(i=l;i>l-3;i--)
stack[i]=' ';
stack[l-3]='E';
printf("\t\t\tReduce by E->");
for(i=0;i<strlen(temp);i++)
printf("%c",temp[i]);
dispstk();
dispinp();
l=l-2;
}
else
{
printf("\nError:String not accepted");
goto label;
}}
printf("\t\t\tAccept");
printf("\n\nString accepted");
label:
return 0;
getch();
}
OUTPUT:
RESULT :
A program that for calculates the Shift Reduce Parser of a grammar has been made.
Total 6
EXPERIMENT-10
OBJECTIVE : WAP to design a SLR parser.
EQUIPMENT/SOFTWARE USED :
S.NO. HARDWARE SOFTWARE
1. I7 PROCESSOR OS (WINDOWS 8)
2. 8 GB RAM MICROSOFT WORD
3. KEYBOARD TURBO C/C++
4. MOUSE
5. MONITOR
6. PRINTER
PROCEDURE:
#include<stdio.h>
#include<string.h>
void main()
{
char table[20][20][20],ter[20],stack[20],ip[20],st1[20],pro[20][20],num;
int i,j,t,k,top=0,st,col,row,pop,np,no,len;
printf("Enter the no of productions:");
scanf("%d",&np);
printf("Enter the productions:");
for(i=0;i<np;i++)
{
scanf("%s",pro[i]);
}
printf("Enter the no.of states:");
scanf("%d",&st);
printf("Enter the states:");
scanf("%s",st1);
printf("Enter the no of terminals:");
scanf("%d",&t);
printf("Enter the terminals:");
scanf("%s",ter);
for(i=0;i<st;i++)
{
for(j=0;j<t;j++)
{
printf("\nEnter the value for %c %c:",st1[i],ter[j]);
scanf("%s",table[i][j]);
}
}
printf("\nLALR TABLE:\n");
for(i=0;i<t;i++)
{
printf("\t%c",ter[i]);
}
for(i=0;i<st;i++)
{
printf("\n\n%c",st1[i]);
for(j=0;j<t;j++)
{
printf("\t%s",table[i][j]);
}
}
stack[top]='$'; top++;
stack[top]='0';
printf("\nEnter the input string:");
scanf("%s",ip);
i=0;
printf("\n\nSTACK\t\tINPUT STRING\t\tACTION\n");
printf("\n%s\t\t%s\t\t",stack,ip);
while(i<=strlen(ip) )
{
for(j=0;j<st;j++)
{
if(stack[top]==st1[j])
col=j;
}
for(j=0;j<t;j++)
{
if(ip[i]==ter[j])
{
row=j;
}
}
if((stack[top]=='1')&&(ip[i]=='$'))
{
printf("\nString accepted");
break;
}
else if(table[col][row][0]=='s')
{
top++;
stack[top]=ter[row];
top++;
stack[top]=table[col][row][1];
i++;
printf("Shift %c %c\n",ter[row],table[col][row][1]);
}
else if(table[col][row][0]=='r')
{
no=(int)table[col][row][1];
no=no-49;
len=strlen(pro[no]);
len=len-3;
pop=2*len;
printf("POP %d",pop);
for(j=0;j<pop;j++)
{
top=top-1;
}
top++;
stack[top]=pro[no][0];
k=top;
k=k-1;
printf(" Push [%c,",pro[no][0]);
for(j=0;j<st;j++)
{
if(stack[k]==st1[j])
{
col=j;
}
}
k++;
for(j=0;j<t;j++)
{
if(stack[k]==ter[j])
{
row=j;
}
}
top++;
stack[top]=table[col][row][0];
printf("%c]\n",table[col][row][0]);
}
else{printf("\nError\nThe string not accepted.");break;
}
printf("\n");
for(j=0;j<=top;j++)
{
printf("%c",stack[j]);
}
printf("\t\t");
for(j=i;j<strlen(ip);j++)
{
printf("%c",ip[j]);
}
printf("\t\t");
}
}
OUTPUT:
RESULT:
The program is successfully written and created in c language
Internal Assessment (Mandatory Experiment) Sheet for Lab Experiment
Department of Computer Science & Engineering
Amity University, Noida (UP)
Compiler Construction
Programme B.Tech-CSE Course Name
lab
Course Code CSE304 Semester 5th
Nanda Vardhan
Student Name Enrolment No. A2305216610
Reddy
Marking Criteria
Marks
Criteria Total Marks Comments
Obtained
Concept (A) 2
Implementation
2
(B)
Performance (C) 2
Total 6
EXPERIMENT-11
DATE:
OBJECTIVE: WAP to calculate First and Follow
EQUIPMENT/SOFTWARE USED:
S.NO. HARDWARE SOFTWARE
1. I7 PROCESSOR OS (WINDOWS 8)
2. 8 GB RAM MICROSOFT WORD
3. KEYBOARD TURBO C/C++
4. MOUSE
5. MONITOR
6. PRINTER
THEORY:-
(A)FIRST
Definition: For any string α of grammar symbols, we define FIRST(α) to be the set of terminals that
occur as the first symbol in a string derived from α. So, if α⇒*xQ for x a terminal and Q a string, then
x is in FIRST(α). In addition if α⇒*ε, then ε is in FIRST(α).
Unfortunately, the algorithms for computing FIRST and FOLLOW are not as simple to state as the
definition suggests, in large part caused by ε-productions.
FIRST(a)={a} for all terminals a.
Initialize FIRST(A)=φ for all nonterminals A
If A → ε is a production, add ε to FIRST(A).
For each production A → Y1 ... Yn, add to FIRST(A) any terminal a satisfying
a is in FIRST(Yi) and
ε is in all previous FIRST(Yj).
Repeat this step until nothing is added.
FIRST of any string X=X1X2...Xn is initialized to φ and then
add to FIRST(X) any non-ε symbol in FIRST(Xi) if ε is in all previous FIRST(Xj).
add ε to FIRST(X) if ε is in every FIRST(Xj).
(B)FOLLOW
Definition: For any non terminal A, FOLLOW(A) is the set of terminals x, that can appear
immediately to the right of A in a sentential form. Formally, it is the set of terminals x, such that
S⇒*αAxβ. In addition, if A can be the rightmost symbol in a sentential form, the endmarker $ is in
FOLLOW(A).
Note that there might have been symbols between A and x during the derivation, providing they all
derived ε and eventually x immediately follows A.
Initialize FOLLOW(S)=$ and FOLLOW(A)=φ for all other nonterminals A, and then apply the
following three rules until nothing is add to any FOLLOW set.
i. For every production A → α B β, add all of FIRST(β) except ε to FOLLOW(B).
ii. For every production A → α B, add all of FOLLOW(A) to FOLLOW(B).
iii. For every production A → α B β where FIRST(β) contains ε, add all of FOLLOW(A) to
FOLLOW(B).
PROCEDURE:
(A)
#include<stdio.h>
#include<ctype.h>
void FIRST(char );
int count,n=0;
char prodn[10][10], first[10];
main()
{int i,choice;
char c,ch;
printf("How many productions ? :");
scanf("%d",&count);
printf("Enter %d productions epsilon= $ :\n\n",count);
for(i=0;i<count;i++)
scanf("%s%c",prodn[i],&ch);
do
{n=0;
printf("Element :");
scanf("%c",&c);
FIRST(c);
printf("\n FIRST(%c)= { ",c);
for(i=0;i<n;i++)
printf("%c ",first[i]);
printf("}\n");
printf("press 1 to continue : ");
scanf("%d%c",&choice,&ch);}
while(choice==1);}
void FIRST(char c)
{int j;
if(!(isupper(c)))first[n++]=c;
for(j=0;j<count;j++)
{if(prodn[j][0]==c)
{if(prodn[j][2]=='$') first[n++]='$';
else if(islower(prodn[j][2]))first[n++]=prodn[j][2];
else FIRST(prodn[j][2]);}}}
(B)
#include<stdio.h>
#include<string.h>
int n,m=0,p,i=0,j=0;
char a[10][10],f[10];
void follow(char c);
void first(char c);
int main()
{int i,z;
char c,ch;
printf("Enter the no.of productions:");
scanf("%d",&n);
printf("Enter the productions(epsilon=$):\n");
for(i=0;i<n;i++)
scanf("%s%c",a[i],&ch);
do
{ m=0;
printf("Enter the element whose FOLLOW is to be found:");
scanf("%c",&c);
follow(c);
printf("FOLLOW(%c) = { ",c);
for(i=0;i<m;i++)
printf("%c ",f[i]);
printf(" }\n");
printf("Do you want to continue(0/1)?");
scanf("%d%c",&z,&ch);}
while(z==1);
return 0;}
void follow(char c)
{if(a[0][0]==c)f[m++]='$';
for(i=0;i<n;i++)
{for(j=2;j<strlen(a[i]);j++)
{if(a[i][j]==c)
{if(a[i][j+1]!='\0')first(a[i][j+1]);
if(a[i][j+1]=='\0'&&c!=a[i][0])
follow(a[i][0]);} }}}
void first(char c)
{int k;
if(!(isupper(c)))f[m++]=c;
for(k=0;k<n;k++)
{if(a[k][0]==c)
{if(a[k][2]=='$') follow(a[i][0]);
else if(islower(a[k][2]))f[m++]=a[k][2];
else first(a[k][2]);}}}
OUTPUT:
(A)
(B)
RESULT:
The program is successfully written and created in c language
Compiler Construction
Programme B.Tech-CSE Course Name
lab
Course Code CSE304 Semester 5th
Marking Criteria
Marks
Criteria Total Marks Comments
Obtained
Concept (A) 2
Implementation
2
(B)
Performance (C) 2
Total 6
EXPERIMENT-12
DATE:
OBJECTIVE: WAP to eliminate left factoring of the given grammar.
EQUIPMENT/SOFTWARE USED:
S.NO. HARDWARE SOFTWARE
1. I7 PROCESSOR OS (WINDOWS 8)
2. 8 GB RAM MICROSOFT WORD
3. KEYBOARD TURBO C/C++
4. MOUSE
5. MONITOR
6. PRINTER
PROCEDURE:
#include<iostream.h>
#include<stdio.h>
#include<conio.h>
#include<string.h>
//Structure Declaration
struct production
{
char lf;
char rt[10];
int prod_rear;
int fl;
};
struct production prodn[20],prodn_new[20]; //Creation of object
//Variables Declaration
int b=-1,d,f,q,n,m=0,c=0;
char terminal[20],nonterm[20],alpha[10],extra[10];
char epsilon='^';
void main()
{
clrscr();
//Input of Productions
for(int cnt1=0;cnt1<n;cnt1++)
{
for(int cnt2=cnt1+1;cnt2<n;cnt2++)
{
if(prodn[cnt1].lf==prodn[cnt2].lf)
{
cnt=0;
int p=-1;
while((prodn[cnt1].rt[cnt]!='\0')&&(prodn[cnt2].rt[cnt]!='\0'))
{
if(prodn[cnt1].rt[cnt]==prodn[cnt2].rt[cnt])
{
extra[++p]=prodn[cnt1].rt[cnt];
prodn[cnt1].fl=1;
prodn[cnt2].fl=1;
}
else
{
if(p==-1)
break;
else
{
int h=0,u=0;
prodn_new[++b].lf=prodn[cnt1].lf;
strcpy(prodn_new[b].rt,extra);
prodn_new[b].rt[p+1]=alpha[c];
prodn_new[++b].lf=alpha[c];
for(int g=cnt;g<prodn[cnt2].prod_rear;g++)
prodn_new[b].rt[h++]=prodn[cnt2].rt[g];
prodn_new[++b].lf=alpha[c];
for(g=cnt;g<=prodn[cnt1].prod_rear;g++)
prodn_new[b].rt[u++]=prodn[cnt1].rt[g];
m=1;
break;
}
}
cnt++;
}
if((prodn[cnt1].rt[cnt]==0)&&(m==0))
{
int h=0;
prodn_new[++b].lf=prodn[cnt1].lf;
strcpy(prodn_new[b].rt,extra);
prodn_new[b].rt[p+1]=alpha[c];
prodn_new[++b].lf=alpha[c];
prodn_new[b].rt[0]=epsilon;
prodn_new[++b].lf=alpha[c];
for(int g=cnt;g<prodn[cnt2].prod_rear;g++)
prodn_new[b].rt[h++]=prodn[cnt2].rt[g];
}
if((prodn[cnt2].rt[cnt]==0)&&(m==0))
{
int h=0;
prodn_new[++b].lf=prodn[cnt1].lf;
strcpy(prodn_new[b].rt,extra);
prodn_new[b].rt[p+1]=alpha[c];
prodn_new[++b].lf=alpha[c];
prodn_new[b].rt[0]=epsilon;
prodn_new[++b].lf=alpha[c];
for(int g=cnt;g<prodn[cnt1].prod_rear;g++)
prodn_new[b].rt[h++]=prodn[cnt1].rt[g];
}
c++;
m=0;
}
}
}
//Display of Output
cout<<"\n\n********************************";
cout<<"\n AFTER LEFT FACTORING ";
cout<<"\n********************************";
cout<<endl;
for(int cnt3=0;cnt3<=b;cnt3++)
{
cout<<"Production "<<cnt3+1<<" is: ";
cout<<prodn_new[cnt3].lf;
cout<<"->";
cout<<prodn_new[cnt3].rt;
cout<<endl<<endl;
}
for(int cnt4=0;cnt4<n;cnt4++)
{
if(prodn[cnt4].fl==0)
{
cout<<"Production "<<cnt3++<<" is: ";
cout<<prodn[cnt4].lf;
cout<<"->";
cout<<prodn[cnt4].rt;
cout<<endl<<endl;
}
}
getche();
} //end of main program
RESULT:
The program is successfully written and created in c language
Internal Assessment (Mandatory Experiment) Sheet for Lab Experiment
Department of Computer Science & Engineering
Amity University, Noida (UP)
Compiler Construction
Programme B.Tech-CSE Course Name
lab
Course Code CSE304 Semester 5th
Nanda Vardhan
Student Name Enrolment No. A2305216610
Reddy
Marking Criteria
Marks
Criteria Total Marks Comments
Obtained
Concept (A) 2
Implementation
2
(B)
Performance (C) 2
Total 6