0% found this document useful (0 votes)
39 views

CD Lab Manual Draft1

The program takes an expression as input from a file and generates three address codes by reading each string, checking for operators, concatenating operands and operators, and printing the expression. Temporary variables are used to store values and are replaced in the left operands of subsequent expressions.

Uploaded by

Kapil Kumar
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
39 views

CD Lab Manual Draft1

The program takes an expression as input from a file and generates three address codes by reading each string, checking for operators, concatenating operands and operators, and printing the expression. Temporary variables are used to store values and are replaced in the left operands of subsequent expressions.

Uploaded by

Kapil Kumar
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 53

‭Index‬

‭S. No.‬ ‭List of Experiments‬ ‭Page No.‬ ‭Date‬ ‭Signature‬


‭1‬ ‭Write a LEX Program to scan reserved word &‬
‭Identifiers of C Language language.‬

‭2‬ ‭Implement Predictive Parsing algorithm‬

‭3‬ ‭Write a C program to generate three address codes.‬

‭4‬ ‭Implement SLR(1) Parsing algorithm‬

‭5‬ ‭Design LALR bottom up parser for the given language‬

‭6‬ ‭Write a C program for implementing the functionalities of‬


‭predictive parser for the mini language specified in Note 1.‬
‭7‬ ‭a)‬ ‭*Write a C program for constructing LL (1) parsing.‬
*‭ Write a C program for constructing recursive descent‬
‭b)‬
‭parsing.‬
‭8‬ ‭ rite a program to accept a string (ab).‬
W

‭9‬ ‭Write a program to generate a parse tree.‬

‭10‬ ‭Write a program to find leading terminals.‬

‭11‬ ‭Write a program to find trailing terminals.‬

‭12‬ ‭Write a program to compute FIRST of non-terminal.‬

‭13‬ ‭Write a program to compute FOLLOW of non-terminal‬

‭14‬ ‭Write a program to check whether a grammar is left Recursion‬


‭and remove left Recursion.‬
‭15‬ ‭Write a program to remove left factoring.‬

‭16‬ ‭Write a program to check whether a grammar is operator‬


‭precedence.‬
‭Program-1‬
‭OBJECTIVE:‬
‭Implement the lexical analyzer using JLex, flex or other lexical analyzer generating tools.‬

‭AIM:‬
‭To analyze JLex, flex or other lexical analyzer generating tools.‬

‭RESOURCE:‬
‭●‬ ‭Linux using Putty‬

‭PROGRAM LOGIC:‬
‭●‬ ‭Read the input string.‬
‭●‬ C
‭ heck whether the string is identifier/ keyword /symbol by using the rules of‬
‭identifier and keywords using LEX Tool‬
‭ ROCEDURE:‬
P

‭●‬ ‭Go to terminal‬


‭●‬ ‭Open vi editor,‬
‭●‬ ‭Compile using Lex lex.l , cc lex.yy.c , ./a.out‬

‭PROGRAM:‬
‭%{‬
‭/* 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(); printf("\n\n"); return 0;‬
‭}‬
‭int yywrap()‬
‭{‬
‭return 0;‬
‭}‬

I‭ nput:‬
‭$vi var.c‬
‭#include<stdio.h> main()‬
‭{‬
‭int a,b;‬
‭}‬

‭ utput:‬
O
‭$lex lex.l‬
‭$cc lex.yy.c‬
‭$./a.out var.c‬
‭#include<stdio.h> is a PREPROCESSOR DIRECTIVE FUNCTION main ( )‬
‭ LOCK BEGINS‬
B
‭int is a KEYWORD a IDENTIFIER‬
‭b IDENTIFIER BLOCK ENDS‬
‭Program-2‬
‭OBJECTIVE:‬

‭Write a C program for implementing the functionalities of predictive parser .‬

‭Understanding the functionalities of predictive parser for a given language.‬

‭RESOURCE:‬
‭●‬ ‭Turbo C++‬

‭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‬

‭PROCEDURE:‬

‭●‬ ‭Go to debug -> run or press CTRL + F9 to run the program.‬

‭PROGRAM:‬

‭ include<stdio.h> #include<conio.> #include<string.>‬


#
‭char prol[7][10]={"s","A","A","B","B","C","C"};‬
‭char pror[7][10]={"Aa","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];‬
‭{‬
‭switch(c)‬
‭{‬
‭case 'S':return0; case 'A':return1;‬

‭ ase 'B':return2; case 'C':return3; case 'a':return0; case 'b':return1; case 'c':return2; case 'd':return3; case‬
c
‭'$':return4;‬
‭}‬
‭retun(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("\n The following is the predictive parsing table for the following grammar:\n"); for(i=0;i<7;i++)‬
‭printf("%s\n",prod[i]);‬
‭printf("\n Predictive parsing table is:\n "); fflush(stdin);‬
‭for(i=0;i<7;i++)‬
‭{‬
‭k=strlen(first[i]);‬
‭for(j=0;j<10;j++)‬
‭if(first[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]);‬

f‭ or(j=0;j<k;j++) strcpy(table[numr(prol[i][0])+1][numr(follow[i][j])+1]prod[i]);‬
‭}‬
‭}‬
‭}‬
‭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("%s_10S",table[i][j]); if(j==5)‬
‭printf("\n\n");‬
‭}‬
‭getch();‬
‭}‬
‭INPUT & OUTPUT:‬
‭ he following is the predictive parsing table for the following grammar: S->A‬
T
‭A->Bb A->Cd B->aB B->@ C->Cc C->@‬

‭Predictive parsing table is‬

‭a‬ ‭b‬ ‭c‬ ‭d‬ ‭$‬

‭S‬ ‭S->A‬ ‭S->A‬ ‭S->A‬ ‭S->A‬

‭A‬ ‭A->Bb‬ ‭A->Bb‬ ‭A->Cd‬ ‭A->Cd‬

‭B‬ ‭B->aB‬ ‭B->@‬ ‭B->@‬ ‭B->@‬

‭C‬ ‭C->@‬ ‭C->@‬ ‭C->@‬


‭Program-3‬
‭OBJECTIVE: Write a C program to generate three address codes.‬

‭ ESOURCE:‬
R
‭Turbo C++ ALGORITHM:‬
‭Step1: Begin the program‬

‭Step2 : The expression is read from the file using a file pointer‬

‭Step3 : Each string is read and the total no. of strings in the file is calculated.‬

‭ tep4: Each string is compared with an operator; if any operator is seen then the previous string and next string are‬
S
‭concatenated and stored in a first temporary value and the three address code expression is printed‬
‭Step5 : Suppose if another operand is seen then the first temporary value is concatenated to the next string using the‬
‭operator and the expression is printed.‬
‭Step6 : The final temporary value is replaced to the left operand value.‬

‭Step7 : End the program‬

‭PROGRAM:‬

‭#include<stdio.h> #include<conio.h> #include<stdlib.h> #include<string.h>‬

s‭ truct 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‬

‭out = in1 + in2 + in3 - in4‬

‭Output :‬ ‭out.txt‬

‭t1=in1+in2 t2=t1+in3 t3=t2-in4 out=t3‬

‭ ESULT:‬
R
‭Thus a C program to generate a three address code for a given expression is written, executed and the output is‬
‭verified.‬
‭Program-4‬
‭OBJECTIVE: Implement SLR(1) Parsing algorithm‬

‭ include<stdio.h>‬
#
‭#include<string.h>‬
‭#include<stdlib.h>‬
‭#include<unistd.h>‬
‭int i,j,k,m,n=0,o,p,ns=0,tn=0,rr=0,ch=0;‬
‭char cread[15][10],gl[15],gr[15][10],temp,templ[15],tempr[15][10],*ptr,temp2[5];‬
‭char dfa[15][10];‬
‭struct states‬
‭{‬
‭char lhs[15],rhs[15][10];‬
‭int n;//state number‬
‭}I[15];‬
‭int compstruct(struct states s1,struct states s2)‬
‭{‬
‭int t;‬
‭if(s1.n!=s2.n)‬
‭return 0;‬
‭if( strcmp(s1.lhs,s2.lhs)!=0 )‬
‭return 0;‬
‭for(t=0;t<s1.n;t++)‬
‭if( strcmp(s1.rhs[t],s2.rhs[t])!=0 )‬
‭return 0;‬
‭return 1;‬
‭}‬
‭void moreprod()‬
‭{‬
‭int r,s,t,l1=0,rr1=0;‬
‭char *ptr1,read1[15][10];‬
‭for(r=0;r<I[ns].n;r++)‬
‭{‬
‭ptr1=strchr(I[ns].rhs[l1],'.');‬
‭t=ptr1-I[ns].rhs[l1];‬
‭if( t+1==strlen(I[ns].rhs[l1]) )‬
‭{‬
‭l1++;‬
‭continue;‬
‭}‬
‭temp=I[ns].rhs[l1][t+1];‬
‭l1++;‬
‭for(s=0;s<rr1;s++)‬
‭if( temp==read1[s][0] )‬
‭break;‬
‭if(s==rr1)‬
‭{‬
‭read1[rr1][0]=temp;‬
‭rr1++;‬
‭}‬
‭else‬
‭continue;‬
‭for(s=0;s<n;s++)‬
‭{‬
‭if(gl[s]==temp)‬
{‭ ‬
‭I[ns].rhs[I[ns].n][0]='.';‬
‭I[ns].rhs[I[ns].n][1]='\0';‬
‭strcat(I[ns].rhs[I[ns].n],gr[s]);‬
‭I[ns].lhs[I[ns].n]=gl[s];‬
‭I[ns].lhs[I[ns].n+1]='\0';‬
‭I[ns].n++;‬
‭}}}}‬
‭void canonical(int l)‬
‭{‬
‭int t1;‬
‭char read1[15][10],rr1=0,*ptr1;‬
‭for(i=0;i<I[l].n;i++)‬
‭{‬
‭temp2[0]='.';‬
‭ptr1=strchr(I[l].rhs[i],'.');‬
‭t1=ptr1-I[l].rhs[i];‬
‭if( t1+1==strlen(I[l].rhs[i]) )‬
‭continue;‬
‭temp2[1]=I[l].rhs[i][t1+1];‬
‭temp2[2]='\0';‬
‭if( strcmp(temp2,read1[j])==0 )‬
‭break;‬
‭if(j==rr1)‬
‭{‬
‭strcpy(read1[rr1],temp2);‬
‭read1[rr1][2]='\0';‬
‭rr1++;‬
‭}‬
‭else‬
‭continue;‬
‭for(j=0;j<I[0].n;j++)‬
‭{‬
‭ptr=strstr(I[l].rhs[j],temp2);‬
‭if( ptr )‬
‭{‬
‭templ[tn]=I[l].lhs[j];‬
‭templ[tn+1]='\0';‬
‭strcpy(tempr[tn],I[l].rhs[j]);‬
‭tn++;‬
‭}‬
‭}‬
‭for(j=0;j<tn;j++)‬
‭{‬
‭ptr=strchr(tempr[j],'.');‬
‭p=ptr-tempr[j];‬
‭tempr[j][p]=tempr[j][p+1];‬
‭tempr[j][p+1]='.';‬
‭I[ns].lhs[I[ns].n]=templ[j];‬
‭I[ns].lhs[I[ns].n+1]='\0';‬
‭strcpy(I[ns].rhs[I[ns].n],tempr[j]);‬
‭I[ns].n++;‬
‭}‬
‭moreprod();‬
‭for(j=0;j<ns;j++)‬
‭{‬
/‭/if ( memcmp(&I[ns],&I[j],sizeof(struct states))==1 )‬
‭if( compstruct(I[ns],I[j])==1 )‬
‭{‬
‭I[ns].lhs[0]='\0';‬
‭for(k=0;k<I[ns].n;k++)‬
‭I[ns].rhs[k][0]='\0';‬
‭I[ns].n=0;‬
‭}}‬
‭if(j<ns)‬
‭{‬
‭tn=0;‬
‭for(j=0;j<15;j++)‬
‭{‬
‭templ[j]='\0';‬
‭tempr[j][0]='\0';‬
‭}‬
‭continue;‬
‭}‬
‭dfa[l][j]=temp2[1];‬
‭printf("\n\nI%d :",ns);‬
‭for(j=0;j<I[ns].n;j++)‬
‭printf("\n\t%c -> %s",I[ns].lhs[j],I[ns].rhs[j]);‬
‭//getch();‬
‭ns++;‬
‭tn=0;‬
‭for(j=0;j<15;j++)‬
‭{‬
‭templ[j]='\0';‬
‭tempr[j][0]='\0';‬
‭}}}‬
‭void main()‬
‭{‬
‭FILE *f;‬
‭int l;‬
‭//clrscr();‬
‭for(i=0;i<15;i++)‬
‭{‬
‭I[i].n=0;‬
‭I[i].lhs[0]='\0';‬
‭I[i].rhs[0][0]='\0';‬
‭dfa[i][0]= '\0';‬
‭}‬
‭n++;‬
‭}‬
‭printf("THE GRAMMAR IS AS FOLLOWS\n");‬
‭for(i=0;i<n;i++)‬
‭printf("\t\t\t\t%c -> %s\n",gl[i],gr[i]);‬
‭I[0].lhs[0]='Z';‬
‭strcpy(I[0].rhs[0],".S");‬
‭I[0].n++;‬
‭l=0;‬
‭for(i=0;i<n;i++)‬
‭{‬
‭temp=I[0].rhs[l][1];‬
‭l++;‬
‭for(j=0;j<rr;j++)‬
i‭f( temp==cread[j][0] )‬
‭break;‬
‭if(j==rr)‬
‭{‬
‭cread[rr][0]=temp;‬
‭rr++;‬
‭}‬
‭else‬
‭continue;‬
‭for(j=0;j<n;j++)‬
‭{‬
‭if(gl[j]==temp)‬
‭{‬
‭I[0].rhs[I[0].n][0]='.';‬
‭strcat(I[0].rhs[I[0].n],gr[j]);‬
‭I[0].lhs[I[0].n]=gl[j];‬
‭I[0].n++;‬
‭}‬
‭}‬
‭}‬
‭ns++;‬
‭printf("\nI%d :\n",ns-1);‬
‭for(i=0;i<I[0].n;i++)‬
‭printf("\t%c -> %s\n",I[0].lhs[i],I[0].rhs[i]);‬
‭for(l=0;l<ns;l++)‬
‭canonical(l);‬
‭printf("\n\n\t\tPRESS ANY KEY FOR TABLE");‬
‭//getch();‬
‭clrscr();‬
‭printf("\t\t\t\nDFA TABLE IS AS FOLLOWS\n\n\n");‬
‭for(i=0;i<ns;i++)‬
‭{‬
‭printf("I%d : ",i);‬
‭for(j=0;j<ns;j++)‬
‭if(dfa[i][j]!='\0')‬
‭printf("'%c'->I%d | ",dfa[i][j],j);‬
‭printf("\n\n\n");‬
‭}‬
‭printf("\n\n\n\t\tPRESS ANY KEY TO EXIT");‬
‭//getch();‬
‭}‬

‭3 OUTPUT‬
‭4‬

‭5‬
‭6‬

‭7 \\\‬

‭8‬
‭Program-5‬
‭AIM: C program to Design LALR Bottom up Parser‬

‭ ROGRAM‬
P
‭#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 isnter(char);‬
‭int isstate(char);‬
‭void error();‬
‭void isreduce(char,char);‬
‭char pop(char *,int *);‬
‭void printt(char *,int *,char [],int);‬
‭void rep(char [],int);‬
‭struct action‬
‭{‬
‭char row[6][5];‬
‭};‬
‭const struct action A[12]={‬
‭{"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];‬
‭};‬
‭const struct gotol G[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"},‬
‭{"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'};‬
c‭ har stack[100];‬
‭int top=-1;‬
‭char temp[10];‬
‭struct grammar‬
‭{‬
‭char left;‬
‭char right[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;‬
‭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=stacktop(stack);‬
‭isproduct(x,p);‬
‭if(strcmp(temp,"emp")==0)‬
‭error();‬
‭if(strcmp(temp,"acc")==0)‬
‭break;‬
‭else‬
‭{‬
‭if(temp[0]=='s')‬
‭{‬
‭push(stack,&top,inp[i]);‬
‭push(stack,&top,temp[1]);‬
‭i++;‬
‭}‬
‭else‬
‭{‬
‭if(temp[0]=='r')‬
‭{‬
‭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,&top);‬
f‭ or(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(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; s[*sp]=item;‬
‭}‬
‭}‬
‭char stacktop(char *s)‬
‭{‬
‭char i;‬
‭i=s[top];‬
‭return i;‬
‭}‬
‭void isproduct(char x,char p)‬
‭{‬
‭int k,l;‬
‭k=ister(x);‬
‭l=isstate(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;‬
‭}‬
i‭nt isstate(char p)‬
‭{‬
‭int i;‬
‭for(i=0;i<12;i++)‬
‭if(p==states[i]) return i+1;‬
‭return 0;‬
‭}‬
‭void error()‬
‭{‬
‭printf(" error in the input ");‬
‭exit(0);‬
‭}‬
‭void isreduce(char x,char p)‬
‭{‬
‭int k,l;‬
‭k=isstate(x);‬
‭l=isnter(p);‬
‭strcpy(temp,G[k-1].r[l-1]);‬
‭}‬
‭char pop(char *s,int *sp)‬
‭{‬
‭char item;‬
‭if(*sp==-1)‬
‭printf(" stack is empty ");‬
‭else‬
‭{‬
‭item=s[*sp];‬
‭*sp=*sp-1;‬
‭}‬
‭return item;‬
‭}‬
‭void printt(char *t,int *p,charinp[],int i)‬
‭{‬
‭int r;‬
‭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]);‬
‭}‬
‭void rep(char t[],int r)‬
‭{‬
‭char c;‬
‭c=t[r];‬
‭switch(c)‬
‭{‬
‭case 'a': printf("0");‬
‭break;‬
‭case 'b': printf("1");‬
‭break;‬
‭case 'c': printf("2");‬
‭break;‬
‭case 'd': printf("3");‬
‭break;‬
‭case 'e': printf("4");‬
‭ reak;‬
b
‭case 'f': printf("5");‬
‭break;‬
‭case 'g': printf("6");‬
‭break;‬
‭case 'h': printf("7");‬
‭break;‬
‭case 'm': printf("8");‬
‭break;‬
‭case 'j': printf("9");‬
‭break;‬
‭case 'k': printf("10");‬
‭break;‬
‭case 'l': printf("11");‬
‭break;‬
‭default :printf("%c",t[r]);‬
‭break;‬
‭}‬
‭}‬

‭Output:‬
‭PROGRAM-6‬
‭ BJECTIVE:‬
O
‭*Write a C program for constructing LL (1) parsing.‬
‭AIM:‬
‭Analyzing the construction of LL (1) parser.‬
‭RESOURCE:‬
‭Turbo C++‬
‭PROGRAM LOGIC:‬
∙‭the input string.‬
‭∙predictive parsing table parse the given input using stack .‬
‭∙stack [i] matches with token input string pop the token else shift it repeat the process until it reaches to $.‬
‭PROCEDURE:‬
‭∙to debug -> run or press CTRL + F9 to run the program.‬

‭PROGRAM‬

‭ include<stdio.h> #include<conio.h> #include<string.h> char s[20],stack[20]; void main()‬


#
‭{‬
‭char m[5][6][3]={"tb"," "," ","tb"," "," "," ","+tb"," "," ","n","n","fc"," "," ","fc"," "," ","‬
‭","n","*fc"," ","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,str2; clrscr();‬
‭printf("\n Enter the input string: "); scanf("%s",s);‬
‭strcat(s,"$"); n=strlen(s); stack[0]='$';‬
‭stack[1]='e'; i=1;‬
‭j=0;‬
‭printf("\nStack‬ ‭Input\n"); printf("‬ ‭\n"); while((stack[i]!='$')&&(s[j]!='$'))‬
‭{‬
‭if(stack[i]==s[j])‬
‭{‬
‭i--; j++;‬
‭}‬
‭switch(stack[i])‬
‭{‬
‭case 'e': str1=0; break;‬
‭case 'b': str1=1; break;‬
‭case 't': str1=2; break;‬
‭case 'c': str1=3; break;‬
‭case 'f': str1=4; break;‬
‭}‬
‭switch(s[j])‬
‭{‬
‭case 'i': str2=0; break;‬
‭case '+': str2=1; break;‬
‭case '*': str2=2; break;‬
‭case '(': str2=3; break;‬
‭case ')': str2=4; break;‬
‭case '$': str2=5; break;‬
‭}‬
‭if(m[str1][str2][0]=='\0')‬
‭{‬
‭printf("\nERROR"); exit(0);‬
‭}‬
‭else if(m[str1][str2][0]=='n') i--;‬
e‭ lse if(m[str1][str2][0]=='i') stack[i]='i';‬
‭else‬
‭{‬
‭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();‬
‭}‬

‭INPUT & OUTPUT:‬


‭Enter the input string:i*i+i‬

‭ TACK‬
S I‭ NPUT‬
‭$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‬
‭Program-7‬

‭OBJECTIVE:‬
‭ onstruction of recursive descent parsing for the following grammar E->TE'‬
C
‭E'->+TE/@‬ ‭"@ represents null character" T->FT'‬
‭T`->*FT'/@ F->(E)/ID‬

‭AIM:‬
‭Analyzing recursive descent parsing grammar.‬

‭RESOURCE:‬
‭Turbo C++‬

‭PROGRAM LOGIC:‬
‭‬ R
● ‭ ead 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.‬

‭PROCEDURE:‬
‭Go to debug -> run or press CTRL + F9 to run the program.‬

‭PROGRAM:‬

‭ include<stdio.h> #include<conio.h> #include<string.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:");‬
‭gets(input); if(E())‬
‭{‬
‭if(input[i+1]=='\0') printf("\nString is accepted"); else‬
‭printf("\nString is not accepted");‬
‭}‬
‭else‬
‭printf("\nString not accepted"); getch();‬
‭} E()‬
‭{‬
‭if(T())‬
‭{‬
‭if(EP())‬
‭return(1); else return(0);‬
‭}‬
‭else return(0);‬
‭} EP()‬
‭{‬
‭if(input[i]=='+')‬
‭{‬
‭i++; if(T())‬
‭{ if(EP())‬
r‭ eturn(1); else‬
‭return(0);‬
‭}‬
‭else‬
‭return(0);‬
‭}‬
‭else‬
‭return(1);‬
‭} T()‬
‭{‬
‭if(F())‬
‭{‬
‭if(TP())‬
‭return(1); else return(0);‬
‭}‬
‭else return(0);‬
‭} TP()‬
‭{‬
‭if(input[i]=='*')‬

{‭ ‬
‭i++; if(F())‬
‭{‬
‭if(TP())‬
‭return(1); else return(0);‬
‭}‬
‭else return(0);‬
‭}‬
‭else return(1);‬
‭} F()‬
‭{‬
‭if(input[i]=='(')‬
‭{‬
‭i++; if(E())‬
‭{‬
‭if(input[i]==')')‬
‭{‬
‭i++;‬
‭return(1);‬
‭}‬
‭else‬
‭return(0);‬
‭}‬
‭else return(0);‬
‭}‬
‭else if(input[i]>='a'&&input[i]<='z'||input[i]>='A'&&input[i]<='Z')‬
{‭ ‬
‭i++;‬
‭return(1);‬
‭}‬
‭else‬
‭return(0);‬
‭}‬

‭INPUT & OUTPUT:‬

I‭ NPUT:‬
‭Recursive descent parsing for the following grammar‬
‭E->TE'‬
‭E'->+TE'/@ T->FT'‬
‭T'->*FT'/@ F->(E)/ID‬

‭Enter the string to be checked:(a+b)*c‬

‭OUTPUT:‬

‭String is accepted‬

‭INPUT:‬

‭ ecursive descent parsing for the following grammar E->TE'‬


R
‭E'->+TE'/@ T->FT'‬
‭T'->*FT'/@ F->(E)/ID‬

‭Enter the string to be checked:a/c+d‬

‭OUTPUT:‬

‭String is not accepted‬


‭Program-8‬
‭ rite a program to accept a string (ab)‬
W
‭#include<iostream.h>‬
‭#include<conio.h>‬
‭#include<string.h>‬
‭enum position{true,false};‬
‭int main()‬
‭{‬
‭clrscr();‬
‭enum position postn=true;‬
‭char*str;‬
‭cout<<"Place an input string:: ";‬
‭cin>>str;‬
‭int lng=strlen(str);‬
‭for(int count=0;count<lng-1;count++)‬
‭{‬
‭if(*str=='a' && count%2==0)‬
‭{‬
‭postn=true;‬
‭}‬
‭else if(*str=='b' && count%2==1)‬
‭{‬
‭postn=true;‬
‭}‬
‭else if(*str=='a' && count%2==1)‬
‭{‬
‭postn=false;‬
‭break;‬
‭}‬
‭str++;‬
‭}‬
‭if(*str=='b' && postn==true)‬
‭{‬
‭cout<<"\nInput string belongs to the given grammar";‬
‭}‬
‭else‬
‭cout<<"\nInput string does not belong to given grammar";‬
‭getch();‬
‭return 0;‬
‭}‬

‭OUTPUT:‬
‭Program-9‬
‭ rite a program to generate a parse tree‬
W
‭#include<iostream.h>‬
‭#include<conio.h>‬
‭void main()‬
‭{‬
‭clrscr();‬
‭char op;‬
‭int ans,val1,val2;‬
‭cout<<"\n Enter the first operand:- ";‬
‭cin>>val1;‬
‭cout<<"\n Enter the second operand:- ";‬
‭cin>>val2;‬
‭cout<<"\n Enter the operation you want to perform:- ";‬
‭cin>>op;‬

s‭ witch(op)‬
‭{‬
‭case '+' :{ ans=val1+val2;}‬
‭break;‬
‭case '-' :{ ans=val1-val2;}‬
‭break;‬
‭case '*' :{ ans=val1*val2;}‬
‭break;‬
‭case '/' :{ ans=val1/val2;}‬
‭break;‬
‭}‬
‭cout<<"\n The Parse Tree for the Equation "<<num1<<operatr<<num2<<"="<<ans" is:";‬
‭cout<<"\n\n";‬
‭cout<<"\n = ";‬
‭cout<<"\n / \\" ;‬
‭cout<<"\n / \\";‬
‭cout<<"\n‬ ‭"<<op<<" "<<ans;‬
‭cout<<"\n / \\ ";‬
‭cout<<"\n / \\ ";‬
‭cout<<"\n "<<val1<<" "<<val2;‬
‭cout<<"\n\n\n";‬
‭getch();‬
‭}‬

‭OUTPUT:‬
‭Program-10‬
‭Write a program to find leading terminals.‬

‭ include<iostream.h>‬
#
‭#include<stdio.h>‬
‭#include<conio.h>‬
‭#include<string.h>‬

‭ oid install(char x,char y);‬


v
‭void pop();‬
‭int pon(char u);‬
‭int pot(char v);‬
‭int checkstatus(int a,int b);‬

i‭nt n,d,f,xn,xt,top=-1;‬
‭char X,Y;‬
‭int a[20][20];‬
‭char terminal[20],nonterm[20];‬

‭struct production‬
‭{‬
‭char l;‬
‭char r[10];‬
‭};‬

‭struct stack‬
‭{‬
‭char nt;‬
‭char t;‬
‭};‬

s‭ truct stack st[20];‬


‭struct production prod[20];‬

‭void main()‬
‭{‬

‭clrscr();‬

c‭ out<<"Provide the number of terminals: ";‬


‭cin>>d;‬
‭cout<<"Provide the terminal symbols for your production: ";‬
‭for(int k=0;k<d;k++)‬
‭{‬
‭cin>>terminal[k];‬
‭}‬

c‭ out<<"\n Provide the number of non-terminals: ";‬


‭cin>>f;‬
‭cout<<"Provide the non-terminal symbols for your production:";‬
‭for(k=0;k<f;k++)‬
‭{‬
‭cin>>nonterm[k];‬
‭}‬
c‭ out<< "\nHow many productions you want to Provide?? ";‬
‭cin>>n;‬
‭for(int i=0;i<=n-1;i++)‬
‭{‬
‭cout<<"Provide the "<< i+1<<" production: ";‬
‭cin>>prod[i].l;‬
‭cout<<"->";‬
‭cin>>prod[i].r;‬
‭}‬

f‭ or(int p=0;p<f;p++)‬
‭{‬
‭for(int q=0;q<d;q++)‬
‭{‬
‭a[p][q]=0;‬
‭}‬
‭}‬
‭for(i=0;i<=n-1;i++)‬
‭{‬
‭for(int j=0;j<d;j++)‬
‭{‬
‭if(prod[i].r[0]==terminal[j])‬
‭install(prod[i].l,prod[i].r[0]);‬
‭else if(prod[i].r[1]==terminal[j])‬
‭install(prod[i].l,prod[i].r[1]);‬
‭}‬
‭}‬

‭ hile(top>-1)‬
w
‭{‬
‭pop();‬
‭for(int c=0;c<=n-1;c++)‬
‭{‬
‭if(prod[c].r[0]==X)‬
‭install(prod[c].l,Y);‬
‭}‬
‭}‬

‭//Output‬
c‭ out<<"\n\n----------------------------------------------------------------";‬
‭cout<<"\n leading elements are:- " ;‬
‭cout<<"\n\n-----------------------------------------------------------------";‬

‭cout<<endl<<" ";‬
‭for(int w=0;w<d;w++)‬
‭cout<<" "<<terminal[w];‬
‭cout<<endl;‬
‭for(p=0;p<f;p++)‬
‭{‬
‭cout<<nonterm[p]<<" ";‬
‭for(int q=0;q<d;q++)‬
‭{‬
‭cout<<a[p][q]<<" ";‬
}‭ ‬
‭cout<<endl;‬
‭}‬

‭ etch();‬
g
‭}‬

‭ oid install(char x,char y)‬


v
‭{‬
‭int g;‬
‭xn=pon(x);‬
‭xt=pot(y);‬
‭g=checkstatus(xn,xt);‬
‭if(g==0)‬
‭return;‬
‭else if(g==1)‬
‭{‬
‭top++;‬
‭st[top].nt=x;‬
‭st[top].t=y;‬
‭a[xn][xt]=1;‬
‭}‬
‭}‬

‭ oid pop()‬
v
‭{‬
‭X=st[top].nt;‬
‭Y=st[top].t;‬
‭top--;‬
‭}‬

i‭nt pon(char u)‬


‭{‬
‭for(int x=0;x<f;x++)‬
‭{‬
‭if(u==nonterm[x])‬
‭return x;‬
‭}‬
‭}‬

i‭nt pot(char v)‬


‭{‬
‭for(int x=0;x<d;x++)‬
‭{‬
‭if(v==terminal[x])‬
‭return x;‬
‭}‬
‭}‬
‭int checkstatus(int xn,int xt)‬
‭{‬
‭if(a[xn][xt]==1)‬
‭return 0;‬
‭else‬
‭return 1;‬
‭}‬
‭OUTPUT:‬
‭Program-11‬
‭Write a program to find Trailing elements‬

‭ include<iostream.h>‬
#
‭#include<stdio.h>‬
‭#include<conio.h>‬
‭#include<string.h>‬

‭ oid install(char x,char y);‬


v
‭void pop();‬
‭int pon(char u);‬
‭int pot(char v);‬
‭int checkstatus(int a,int b);‬

i‭nt n,d,f,xn,xt,top=-1;‬
‭char X,Y;‬
‭int a[20][20];‬
‭char terminal[20],nonterm[20];‬

s‭ truct production‬
‭{‬
‭char l;‬
‭char r[10];‬
‭int rear;‬
‭};‬
‭struct stack‬
‭{‬
‭char nt;‬
‭char t;‬
‭};‬
‭struct stack st[20];‬
‭struct production prod[20];‬

‭ oid main()‬
v
‭{‬
‭clrscr();‬
‭cout<<"Enter the number of terminals: ";‬
‭cin>>d;‬
‭cout<<"Enter the terminal symbols for your production: ";‬
‭for(int k=0;k<d;k++)‬
‭{‬
‭cin>>terminal[k];‬
‭}‬

‭//Input of non-terminal symbols‬


‭cout<<"\nEnter the number of non-terminals: ";‬
‭cin>>f;‬
‭cout<<"Enter the non-terminal symbols for your production: ";‬
‭for(k=0;k<f;k++)‬
‭{‬
‭cin>>nonterm[k];‬
‭}‬

c‭ out<< "\nEnter the number of productions: ";‬


‭cin>>n;‬
f‭ or(int i=0;i<=n-1;i++)‬
‭{‬
‭cout<<"Enter the "<< i+1<<" production: ";‬
‭cin>>prod[i].l;‬
‭cout<<"->";‬
‭cin>>prod[i].r;‬
‭prod[i].rear=strlen(prod[i].r);‬
‭}‬

‭for(int p=0;p<f;p++)‬
‭{‬
‭for(int q=0;q<d;q++)‬
‭{‬
‭a[p][q]=0;‬
‭}‬
‭}‬
‭for(i=0;i<=n-1;i++)‬
‭{‬
‭for(int j=0;j<d;j++)‬
‭{‬
‭if(prod[i].r[prod[i].rear-1]==terminal[j])‬
‭install(prod[i].l,prod[i].r[prod[i].rear-1]);‬
‭else if(prod[i].r[prod[i].rear-2]==terminal[j])‬
‭install(prod[i].l,prod[i].r[prod[i].rear-2]);‬
‭}‬
‭}‬

‭ hile(top>-1)‬
w
‭{‬
‭pop();‬
‭for(int c=0;c<=n-1;c++)‬
‭{‬
‭if(prod[c].r[prod[c].rear-1]==X)‬
‭install(prod[c].l,Y);‬
‭}‬
‭}‬

c‭ out<<"\n\n****************************************************";‬
‭cout<<"\n TRAILING ELEMENTS OF GIVEN PRODUCTION ";‬
‭cout<<"\n****************************************************** ";‬
‭cout<<endl<<" ";‬
‭for(int w=0;w<d;w++)‬
‭cout<<" "<<terminal[w];‬
‭cout<<endl;‬
‭for(p=0;p<f;p++)‬
‭{‬
‭cout<<nonterm[p]<<" ";‬
‭for(int q=0;q<d;q++)‬
‭{‬
‭cout<<a[p][q]<<" ";‬
‭}‬
‭cout<<endl;‬
‭}‬
‭cout<<endl<<endl;‬
‭for(i=0;i<f;i++)‬
‭{‬
c‭ out<<"Leading("<<nonterm[i]<<")="<<" "<<"{";‬
‭for(int j=0;j<d;j++)‬
‭{‬
‭if(a[i][j]==1)‬
‭cout<<terminal[j]<<",";‬
‭}‬
‭cout<<"}"<<endl;‬
}‭ ‬
‭getch();‬
‭}‬
‭ oid install(char x,char y)‬
v
‭{‬
‭int g;‬
‭xn=pon(x);‬
‭xt=pot(y);‬
‭g=checkstatus(xn,xt);‬
‭if(g==0)‬
‭return;‬
‭else if(g==1)‬
‭{‬
‭top++;‬
‭st[top].nt=x;‬
‭st[top].t=y;‬
‭a[xn][xt]=1;‬
‭}‬
‭}‬
‭void pop()‬
‭{‬
‭X=st[top].nt;‬
‭Y=st[top].t;‬
‭top--;‬
‭}‬
‭int pon(char u)‬
‭{‬
‭for(int x=0;x<f;x++)‬
‭{‬
‭if(u==nonterm[x])‬
‭return x;‬
‭}‬
‭}‬
‭int pot(char v)‬
‭{‬
‭for(int x=0;x<d;x++)‬
‭{‬
‭if(v==terminal[x])‬
‭return x;‬
‭}‬
‭}‬

i‭nt checkstatus(int xn,int xt)‬


‭{‬
‭if(a[xn][xt]==1)‬
‭return 0;‬
‭else‬
‭return 1;‬
‭}‬
‭OUTPUT:‬
‭Program-12‬
‭Write a program to compute FIRST of non-terminal.‬

‭ include<iostream.h>‬
#
‭#include<stdio.h>‬
‭#include<conio.h>‬
‭#include<string.h>‬
‭void install(char a,char b);‬
‭void pop();‬
‭int pontr(char t);‬
‭int potr(char s);‬
‭int checkstatus(int x1,int x2);‬
‭struct prod‬
‭{‬
‭char lf;‬
‭char rt[10];‬
‭int rear1;‬
‭};‬
‭struct mystack‬
‭{‬
‭char u;‬
‭char v;‬
‭};‬
‭struct mystack stk[25];‬
‭struct prod pr[25];‬
‭int q,w,e,xn1,xt1,tn0,tn1,tn2,top1=-1;‬
‭char A,B,epsiln='^';‬
‭int ar1[25][25];‬
‭char term[25],nterm[25];‬
‭void main()‬
‭{‬
‭clrscr();‬
‭cout<<"provide no. of terminal::";‬
‭cin>>q;‬
‭cout<<"provide the terminal symbols::";‬
‭for(int cnt=0;cnt<q;cnt++)‬
‭{‬
‭cin>>term[cnt];‬
‭}‬
‭cout<<"provide no. of nonterminal::";‬
‭cin>>w;‬
‭cout<<"provide the nonterminal symbols::";‬
‭for(cnt=0;cnt<w;cnt++)‬
‭{‬
‭cin>>nterm[cnt];‬
‭}‬
‭cout<<"provide no. of production rules::";‬
‭cin>>e;‬
‭for(cnt=0;cnt<=e-1;cnt++)‬
‭{‬
‭cout<<"provide "<<cnt+1<<".)production rule::";‬
‭cin>>pr [cnt].lf;‬
‭cout<<"->";‬
‭cin>>pr [cnt].rt;‬
‭pr [cnt].rear1=strlen(pr [cnt].rt);‬
}‭ ‬
‭for(int cnt1=0;cnt1<=w+q;cnt1++)‬
‭{‬
‭for(int cnt2=0;cnt2<=q;cnt2++)‬
‭{‬
‭ar1[cnt1][cnt2]=0;‬
‭}‬
‭}‬
‭for(cnt1=w;cnt1<w+q;cnt1++)‬
‭{‬
‭for(int cnt2=0;cnt2<q;cnt2++)‬
‭{‬
‭if(cnt1-w==cnt2)‬
‭ar1[cnt1][cnt2]=1;‬
‭}‬
‭}‬
‭for(cnt1=0;cnt1<=e-1;cnt1++)‬
‭{‬
‭for(int cnt2=0;cnt2<q;cnt2++)‬
‭{‬
‭if(pr[cnt1].rt[0]==term[cnt2]);‬
‭install(pr[cnt1].lf,pr[cnt1].rt[0]);‬
‭}‬
‭if(pr[cnt1].rt[0]==epsiln)‬
‭ar1[pontr(pr[cnt1].lf)][q]=1;‬
‭}‬
‭while(top1>-1)‬
‭{‬
‭pop();‬
‭for(int i=0;i<=e-1;i++)‬
‭{‬
‭if(pr[i].rt[0]==A)‬
‭{‬
‭install(pr[i].lf,B);‬
‭for(int q=1;q<pr[i].rear1;q++)‬
‭{‬
‭tn0=pontr(pr[i].rt[q-1]);‬
‭if(ar1[tn0][q]!=1)‬
‭break;‬
‭for(int l=0;l<w;l++)‬
‭{‬
‭if(pr[i].rt[0]==nterm[l])‬
‭{‬
‭tn1=pontr(pr[i].rt[q]);‬
‭tn2=pontr(pr[i].lf);‬
‭for(int h=0;h<q;h++)‬
‭{‬
‭if(ar1[tn1][h]==1)‬
‭ar1[tn2][h]=1;‬
‭}‬
‭}‬
‭}‬
‭for(l=0;l<q;l++)‬
‭{‬
‭if(pr[i].rt[q]==term [l])‬
‭{‬
t‭n1=potr(pr[i].rt[q]);‬
‭tn2=pontr(pr[i].lf);‬
‭ar1[tn2][tn1]=1;‬
‭}‬
‭}‬
‭}‬
‭}}}‬
‭cout<<"<Leading Of productions are::->";‬
‭cout<<endl<<"";‬
‭for(int g=0;g<q;g++)‬
‭cout<<""<<term[g];‬
‭cout<<""<<epsiln;‬
‭cout<<endl;‬
‭for(cnt1=0;cnt1<w;cnt1++)‬
‭{cout<<nterm[cnt1]<<"";‬
‭for(int cnt2=0;cnt2<=q;cnt2++)‬
‭cout<<ar1[cnt1][cnt2]<<"";‬
‭cout<<endl;‬
‭}‬
‭for(cnt1=w;cnt1<q+w;cnt1++)‬
‭{‬
‭cout<<term[cnt1-w]<<"";‬
‭for(int cnt2=0;cnt2<=q;cnt2++)‬
‭cout<<ar1[cnt1][cnt2]<<"";‬
‭cout<<endl;‬
‭}‬
‭cout<<epsiln<<"";‬
‭for(int cnt2=0;cnt2<=q;cnt2++)‬
‭cout<<ar1[q+w][cnt2]<<"";‬
‭cout<<endl<<endl;‬
‭for(cnt1=0;cnt1<w;cnt1++)‬
‭{‬
‭cout<<"Leading("<<nterm[cnt1]<<")="<<""<<"{";‬
‭for(int cnt2=0;cnt2<q;cnt2++)‬
‭{‬
‭if(ar1[cnt1][cnt2]==1)‬
‭cout<<term[cnt2];‬
‭}‬
‭if(ar1[cnt1][q]==1)‬
‭cout<<epsiln;‬
‭cout<<"}"<<endl;‬
‭}‬
‭getch();}‬
‭void install(char a,char b)‬
‭{‬
‭xn1=pontr(a);‬
‭xt1=potr(b);‬
‭e=checkstatus(xn1,xt1);‬
‭if(e==0)‬
‭return;‬
‭else if(e==1)‬
‭{‬
‭top1++;‬
‭stk[top1].u=a;‬
‭stk[top1].v=b;‬
‭ar1[xn1][xt1]=1;‬
}‭ ‬
‭}‬
‭void pop()‬
‭{‬
‭A=stk[top1].u;‬
‭B=stk[top1].v;‬
‭top1--;‬
‭}‬
‭int pontr(char t)‬
‭{‬
‭for(int a=0;a<w;a++)‬
‭{‬
‭if(t==nterm[a])‬
‭return a;‬
‭}‬
‭}‬
‭int potr(char s)‬
‭{‬
‭for(int a=0;a<q;a++)‬
‭{‬
‭if(s==term[a])‬
‭return a;‬
‭}‬
‭}‬
‭int checkstatus(int xn1,int xt1)‬
‭{‬
‭if(ar1[xn1][xt1]==1)‬
‭return 0;‬
‭else‬
‭return 1;‬

‭OUTPUT:‬
‭Program-13‬
‭Write a program to compute FOLLOW of non-terminal‬

‭ include<stdio.h>‬
#
‭#include<ctype.h>‬
‭#include<string.h>‬

/‭/ Functions to calculate Follow‬


‭void followfirst(char, int, int);‬
‭void follow(char c);‬

/‭/ Function to calculate First‬


‭void findfirst(char, int, int);‬

‭int count, n = 0;‬

/‭/ Stores the final result ‬


‭// of the First Sets‬
‭char calc_first[10][100];‬

/‭/ Stores the final result‬


‭// of the Follow Sets‬
‭char calc_follow[10][100];‬
‭int m = 0;‬

/‭/ Stores the production rules‬


‭char production[10][10];‬
‭char f[10], first[10];‬
‭int k;‬
‭char ck;‬
‭int e; ‬
‭int main(int argc, char **argv)‬
‭{‬
‭ int jm = 0;‬
‭ int km = 0;‬
‭ int i, choice;‬
‭ char c, ch;‬
‭ count = 8;‬
‭ // The Input grammar‬
‭ strcpy(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");‬

‭ int kay;‬
‭ char done[count];‬
‭ int ptr = -1;‬

‭ // Initializing the calc_first array‬


‭ for(k = 0; k < count; k++) {‬
‭ for(kay = 0; kay < 100; kay++) {‬
‭ calc_first[k][kay] = '!';‬
‭ }‬
‭ }‬
‭ int point1 = 0, point2, xxx;‬

‭ for(k = 0; k < count; k++)‬


‭ {‬
‭ c = production[k][0];‬
‭ point2 = 0;‬
‭ xxx = 0;‬

‭ // Checking if First of c has‬


‭ // already been calculated‬
‭ for(kay = 0; kay <= ptr; kay++)‬
‭ if(c == done[kay])‬
‭ xxx = 1;‬

‭ if (xxx == 1)‬
‭ continue;‬

‭ // Function call ‬
‭ findfirst(c, 0, 0);‬
‭ ptr += 1;‬

‭ // Adding c to the calculated list‬


‭ done[ptr] = c;‬
‭ printf("\n First(%c) = { ", c);‬
‭ calc_first[point1][point2++] = c;‬

‭ // Printing the First Sets of the grammar‬


‭ for(i = 0 + jm; i < n; i++) {‬
‭ int lark = 0, chk = 0;‬

‭ 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][point2++] = first[i];‬
‭ }‬
‭ }‬
‭ printf("}\n");‬
‭ jm = n;‬
‭ point1++;‬
‭ }‬
‭ printf("\n");‬
‭ printf("-----------------------------------------------\n\n");‬
‭ char donee[count];‬
‭ ptr = -1;‬

‭ // Initializing the calc_follow array‬


‭ for(k = 0; k < count; k++) {‬
‭ for(kay = 0; kay < 100; kay++) {‬
‭ calc_follow[k][kay] = '!';‬
‭ }‬
‭ }‬
‭ point1 = 0;‬
‭ int land = 0;‬
‭ for(e = 0; e < count; e++)‬
‭ {‬
‭ ck = production[e][0];‬
‭ point2 = 0;‬
‭ xxx = 0;‬

‭ // Checking if Follow of ck‬


‭ // has alredy been calculated‬
‭ for(kay = 0; kay <= ptr; kay++)‬
‭ if(ck == donee[kay])‬
‭ xxx = 1;‬

‭ if (xxx == 1)‬
‭ continue;‬
‭ land += 1;‬

‭ // Function call‬
‭ follow(ck);‬
‭ ptr += 1;‬

‭ // Adding ck to the calculated list‬


‭ donee[ptr] = ck;‬
‭printf(" Follow(%c) = { ", ck);‬
‭ calc_follow[point1][point2++] = ck;‬

‭ // Printing the Follow Sets of the grammar‬


‭ for(i = 0 + km; i < m; i++) {‬
‭ int lark = 0, chk = 0;‬
‭ for(lark = 0; lark < point2; lark++) ‬
‭ {‬
‭ if (f[i] == calc_follow[point1][lark])‬
‭ {‬
‭ chk = 1;‬
‭ break;‬
‭ }‬
‭ }‬
‭ if(chk == 0)‬
‭ {‬
‭ printf("%c, ", f[i]);‬
‭ calc_follow[point1][point2++] = f[i];‬
‭ }‬
‭ }‬
‭ printf(" }\n\n");‬
‭ km = m;‬
‭ point1++; ‬
‭ }‬
‭}‬

‭void follow(char c)‬


{‭ ‬
‭ int i, j;‬

‭ // Adding "$" to the follow‬


‭ // set of the start symbol‬
‭ if(production[0][0] == c) {‬
‭ f[m++] = '$';‬
‭ }‬
‭ for(i = 0; i < 10; i++)‬
‭ {‬
‭ for(j = 2;j < 10; j++)‬
‭ {‬
‭ if(production[i][j] == c)‬
‭ {‬
‭ if(production[i][j+1] != '\0')‬
‭ {‬
‭ // Calculate the first of the next‬
‭ // Non-Terminal in the production‬
‭ followfirst(production[i][j+1], i, (j+2));‬
‭ }‬

‭ if(production[i][j+1]=='\0' && c!=production[i][0])‬


‭ {‬
‭ // Calculate the follow of the Non-Terminal‬
‭ // in the L.H.S. of the production‬
‭ follow(production[i][0]);‬
‭ }‬
‭ }‬
‭ }‬
‭ }‬
‭}‬

‭ oid findfirst(char c, int q1, int q2)‬


v
‭{‬
‭ int j;‬

‭ // The case where we ‬


‭ // encounter a Terminal‬
‭ if(!(isupper(c))) {‬
‭ first[n++] = c;‬
‭ }‬
‭ for(j = 0; j < count; j++)‬
‭ {‬
‭ if(production[j][0] == c)‬
‭ {‬
‭ if(production[j][2] == '#')‬
‭ {‬
‭ if(production[q1][q2] == '\0')‬
‭ first[n++] = '#';‬
‭ else if(production[q1][q2] != '\0' ‬
‭ && (q1 != 0 || q2 != 0))‬
‭ {‬
‭ // Recursion to calculate First of New‬
‭ // Non-Terminal we encounter after epsilon‬
‭ findfirst(production[q1][q2], q1, (q2+1));‬
‭ }‬
‭ else‬
‭ first[n++] = '#';‬
‭ }‬
‭ else if(!isupper(production[j][2]))‬
‭ {‬
‭ first[n++] = production[j][2];‬
‭ }‬
‭ else ‬
‭ {‬
‭ // Recursion to calculate First of‬
‭ // New Non-Terminal we encounter ‬
‭ // at the beginning‬
‭ findfirst(production[j][2], j, 3);‬
‭ }‬
‭ }‬
‭ }‬
‭}‬

‭ oid followfirst(char c, int c1, int c2)‬


v
‭{‬
‭ int k;‬
‭ // The case where we encounter‬
‭ // a Terminal‬
‭ if(!(isupper(c)))‬
‭ f[m++] = c;‬
‭ else‬
‭ {‬
‭ int i = 0, j = 1;‬
‭ for(i = 0; i < count; i++)‬
‭ {‬
‭ if(calc_first[i][0] == c)‬
‭ break;‬
‭ }‬

‭ //Including the First set of the‬


‭ // Non-Terminal in the Follow of‬
‭ // the original query‬
‭ while(calc_first[i][j] != '!')‬
‭ {‬
‭ if(calc_first[i][j] != '#') ‬
‭ {‬
‭ f[m++] = calc_first[i][j];‬
‭ }‬
‭ else‬
‭ {‬
‭ if(production[c1][c2] == '\0')‬
‭ {‬
‭ // Case where we reach the‬
‭ // end of a production‬
‭ follow(production[c1][0]);‬
‭ }‬
‭ else‬
‭ {‬
‭ // Recursion to the next symbol‬
‭ // in case we encounter a "#"‬
‭ followfirst(production[c1][c2], c1, c2+1);‬
‭ }‬
‭ }‬
‭ j++;‬
‭ }‬
‭ }‬
‭}‬

‭Output‬

‭ ollow(E) = { $, ), }‬
F
‭Follow(R) = { $, ), }‬
‭Follow(T) = { +, $, ), }‬
‭Follow(Y) = { +, $, ), }‬
‭Follow(F) = { *, +, $, ), }‬
‭Program-14‬

‭Write a program to check whether a grammar is left Recursion and remove left Recursion of grammar‬

‭ include<iostream.h>‬
#
‭#include<stdio.h>‬
‭#include<conio.h>‬
‭#include<string.h>‬

s‭ truct production‬
‭{‬
‭char l;‬
‭char r[10];‬
‭int rear;‬
‭};‬
‭struct production prod[20],pr_new[20];‬

i‭nt p=0,b=0,d,f,q,n,flag=0;‬
‭char terminal[20],nonterm[20],alpha[10];‬
‭char x,epsilon='^';‬

‭ oid main()‬
v
‭{‬
‭clrscr();‬

c‭ out<<"Enter the number of terminals: ";‬


‭cin>>d;‬
‭cout<<"Enter the terminal symbols for your production: ";‬
‭for(int k=0;k<d;k++)‬
‭{‬
‭cin>>terminal[k];‬
‭}‬

c‭ out<<"\nEnter the number of non-terminals: ";‬


‭cin>>f;‬
‭cout<<"Enter the non-terminal symbols for your production: ";‬
‭for(k=0;k<f;k++)‬
‭{‬
‭cin>>nonterm[k];‬
‭}‬

c‭ out<<"\nEnter the number of Special characters(except non-terminals): ";‬


‭cin>>q;‬
‭cout<<"Enter the special characters for your production: ";‬
‭for(k=0;k<q;k++)‬
‭{‬
‭cin>>alpha[k];‬
‭}‬

c‭ out<<"\nEnter the number of productions: ";‬


‭cin>>n;‬
‭for(k=0;k<=n-1;k++)‬
‭{‬
‭cout<<"Enter the "<< k+1<<" production: ";‬
‭cin>>prod[k].l;‬
‭cout<<"->";‬
‭cin>>prod[k].r;‬
‭prod[k].rear=strlen(prod[k].r);‬
‭}‬

f‭ or(int m=0;m<f;m++)‬
‭{‬
‭x=nonterm[m];‬
‭for(int j=0;j<n;j++)‬
‭{‬
‭if((prod[j].l==x)&&(prod[j].r[0]==prod[j].l))‬
‭flag=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;‬
‭for(int c=0;c<prod[i].rear;c++)‬
‭pr_new[b].r[c]=prod[i].r[c];‬
‭pr_new[b++].r[c]=alpha[p];‬
‭}‬
‭else if((prod[i].l==x)&&(prod[i].r[0]==x)&&(flag==1))‬
‭{‬
‭pr_new[b].l=alpha[p];‬
‭for(int a=0;a<=prod[i].rear-2;a++)‬
‭pr_new[b].r[a]=prod[i].r[a+1];‬
‭pr_new[b++].r[a]=alpha[p];‬
‭pr_new[b].l=alpha[p];‬
‭pr_new[b++].r[0]=epsilon;‬
‭}‬
‭else if((prod[i].l==x)&&(prod[i].r[0]!=x)&&(flag==0))‬
‭{‬
‭pr_new[b].l=prod[i].l;‬
‭strcpy(pr_new[b].r,prod[i].r);‬
‭b++;‬
‭}}‬
‭flag=0;‬
‭p++;‬
‭}‬
‭cout<<"\n\n*******************************************";‬
‭cout<<"\n AFTER REMOVING LEFT RECURSION ";‬
‭cout<<"\n*******************************************"<<endl;‬
‭for(int s=0;s<=b-1;s++)‬
‭{‬
‭cout<<"Production "<<s+1<<" is: ";‬
‭cout<<pr_new[s].l;‬
‭cout<<"->";‬
‭cout<<pr_new[s].r;‬
‭cout<<endl;‬
‭}‬
‭getche(); }‬
‭OUTPUT:‬
‭Program-15‬

‭Write a program to remove left factoring of grammar.‬

‭ include<iostream.h>‬
#
‭#include<stdio.h>‬
‭#include<conio.h>‬
‭#include<string.h>‬

‭//Structure Declaration‬

s‭ truct 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='^';‬

/‭/Beginning of Main Program‬


‭void main()‬
‭{‬
‭clrscr();‬

/‭/Input of Special characters‬


‭cout<<"\nEnter the number of Special characters(except non-terminals): ";‬
‭cin>>q;‬
‭cout<<"Enter the special characters for your production: ";‬
‭for(int cnt=0;cnt<q;cnt++)‬
‭{‬
‭cin>>alpha[cnt];‬
‭}‬

/‭/Input of Productions‬
‭cout<<"\nEnter the number of productions: ";‬
‭cin>>n;‬
‭for(cnt=0;cnt<=n-1;cnt++)‬
‭{‬
‭cout<<"Enter the "<< cnt+1<<" production: ";‬
‭cin>>prodn[cnt].lf;‬
‭cout<<"->";‬
‭cin>>prodn[cnt].rt;‬
‭prodn[cnt].prod_rear=strlen(prodn[cnt].rt);‬
‭prodn[cnt].fl=0;‬
‭}‬

/‭/Condition for left factoring‬


‭for(int cnt1=0;cnt1<n;cnt1++)‬
‭{‬
‭for(int cnt2=cnt1+1;cnt2<n;cnt2++)‬
‭{‬
i‭f(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‬
‭{‬
i‭nt 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];‬
f‭ or(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;‬
‭}‬

f‭ or(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‬

‭OUTPUT‬
‭ rogram-16‬
P
‭Write a program to check whether a grammar is operator precedent‬

‭ include<stdio.h>‬
#
‭#include<conio.h>‬
‭void main(){‬
‭/*OPERATOR PRECEDENCE PARSER*/‬
‭char stack[20],ip[20],opt[10][10][1],ter[10];‬
‭int i,j,k,n,top=0,col,row;‬
‭clrscr();‬
‭for(i=0;i<10;i++)‬
‭{‬
‭stack[i]=NULL;‬
‭ip[i]=NULL;‬
‭for(j=0;j<10;j++)‬
‭{‬
‭opt[i][j][1]=NULL;‬
‭}}‬
‭printf("Enter the no.of terminals :\n");‬
‭scanf("%d",&n);‬
‭printf("\nEnter the terminals :\n");‬
‭scanf("%s",&ter);‬
‭printf("\nEnter the table values :\n");‬
‭for(i=0;i<n;i++)‬
‭{‬
‭for(j=0;j<n;j++)‬
‭{‬
‭printf("Enter the value for %c %c:",ter[i],ter[j]);‬
‭scanf("%s",opt[i][j]);‬
‭}}‬
‭printf("\n**** OPERATOR PRECEDENCE TABLE ****\n");‬
‭for(i=0;i<n;i++)‬
‭{‬
‭printf("\t%c",ter[i]);‬
‭}‬
‭printf("\n");‬
‭for(i=0;i<n;i++){printf("\n%c",ter[i]);‬
‭for(j=0;j<n;j++){printf("\t%c",opt[i][j][0]);}}‬
‭stack[top]='$';‬
‭printf("\nEnter the input string:");‬
‭scanf("%s",ip);‬
‭i=0;‬
‭printf("\nSTACK\t\t\tINPUT STRING\t\t\tACTION\n");‬
‭printf("\n%s\t\t\t%s\t\t\t",stack,ip);‬
‭while(i<=strlen(ip))‬
‭{‬
‭for(k=0;k<n;k++)‬
‭{‬
‭if(stack[top]==ter[k])‬
‭col=k;‬
‭if(ip[i]==ter[k])‬
‭row=k;‬
‭}‬
‭if((stack[top]=='$')&&(ip[i]=='$')){‬
‭printf("String is accepted\n");‬
‭break;}‬
e‭ lse if((opt[col][row][0]=='<') ||(opt[col][row][0]=='='))‬
‭{ stack[++top]=opt[col][row][0];‬
‭stack[++top]=ip[i];‬
‭printf("Shift %c",ip[i]);‬
‭i++;‬
‭ }‬
‭else{‬
‭if(opt[col][row][0]=='>')‬
‭{‬
‭while(stack[top]!='<'){--top;}‬
‭top=top-1;‬
‭printf("Reduce");‬
‭}‬
‭else‬
‭{‬
‭printf("\nString is not accepted");‬
‭break;‬
‭}}‬
‭printf("\n");‬
‭for(k=0;k<=top;k++)‬
‭{‬
‭printf("%c",stack[k]);‬
‭}‬
‭printf("\t\t\t");‬
‭for(k=i;k<strlen(ip);k++){‬
‭printf("%c",ip[k]);‬
‭}‬
‭printf("\t\t\t");‬
‭}‬
‭getch();‬

‭ UTPUT‬
O
‭Enter the value for * *:>‬
‭Enter the value for * $:> ‬
‭Enter the value for $ i:< ‬
‭Enter the value for $ +:< ‬
‭Enter the value for $ *:< ‬
‭Enter the value for $ $:accept ‬

‭ *** OPERATOR PRECEDENCE TABLE ****


* ‬
‭ i + * $ ‬
‭i e > > > ‬
‭+ < > < > ‬
‭* < > > > ‬
‭$ < < < a‬
‭*/‬
‭Enter the input string: ‬
‭i*i ‬

‭ TACK INPUT STRING


S ACTION ‬
‭$ i*i Shift i ‬
‭$<i *i Reduce ‬
‭$ *i Shift * ‬
‭$<* i Shift i ‬
‭$<*<i ‬
‭String is not accepted‬

You might also like