Compiler - Design - Practical File
Compiler - Design - Practical File
Compiler - Design - Practical File
BRANCH:CSE(3RDYEAR)
ROLL NO.:2101660100050
SEMESTER:5th
Department of Computer Science and Engineering
INDEX
S.No Practical’s Name Date Remark
1 WAP to generate Symbol Table. 22/09/2023
2 Write a C program to recognize strings under 'a', 'a*b+', 29/09/2023
'abb'.
3 WAP to check whether it is Keyword or Valid Identifier. 06/10/2023
4 WAP to check the valid comment. 20/10/2023
WAP for the Recursive Descent Parser for the given 01/12/2023
10 grammar.
P ---> E '#'
E ---> T {('+'|'-') T}
T ---> S {('*'|'/') S}
S ---> F '^' S | F
F ---> char | '(' E ')'
PROGRAM 1:: WAP to generate Symbol Table.
#include<stdio.h>
#include<conio.h>
#include<malloc.h>
#include<string.h>
#include<math.h>
#include<ctype.h>
void main()
{
int i=0,j=0,x=0,flag=0,n;
void *p, *add[15];
char c, ch, srch, b[15],d[15],g[10];
clrscr();
printf("Expression Terminated by '$' :: \n");
while((c=getchar())!='$')
{
b[i]=c;
i++;
}
n=i-1;
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
void main()
{
char s[50],c;
int state=0,i=0;
clrscr();
printf("\n Enter a string:");
scanf("%s", s);
while(s[i]!='\0')
{
switch(state)
{
case 0:
c=s[i++];
if(c=='a') state=1;
else if(c=='b') state=2;
else state=6;
break;
case 1:
c=s[i++];
if(c=='a')
state=3;
else if(c=='b')
state=4;
else
state=6;
break;
case 2:
c=s[i++];
if(c=='a')
state=6;
else if(c=='b')
state=2;
else
state=6;
break;
case 3: c=s[i++];
if(c=='a')
state=3;
else if(c=='b')
state=2;
else
state=6;
break;
case 4:
c=s[i++];
if(c=='a')
state=6;
else if(c=='b')
state=5;
else
state=6;
break;
case 5:
c=s[i++];
if(c=='a')
state=6;
else if(c=='b')
state=2;
else
state=6;
break;
case 6:
printf("\n %s is not recognised.",s);
exit(0);
}
}
if(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();
}
OUTPUT:
PROGRAM 3:: WAP to check whether it is Keyword or Valid Identifier.
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
#include<ctype.h>
void main()
{
int flag,i=1,m;
char a[10], s[32][10]={"if","else","goto","continue","return","auto","double",
"int","struct", "break","long","switch","case","enum",
"register","typedef","char","extern","union","const",
"float","short","unsigned","sizeof","volatile","for",
"signed","void","default","do","static","while" };
for(i=0;i<32;i++)
{
m=strcmp(a,s[i]);
if(m==0)
flag=1;
}
if(flag==0)
{
printf("\n It is not a keyword");
if(isalpha(a[0])||a[0]=='_')
flag=1;
else
{
printf("\n Invalid identifier");
exit(1);
}
while(a[i]!='\0')
{
if(!isdigit(a[i])&& !isalpha(a[i])|| a[i]=='_')
{
flag=1;
break;
}i++;
}
if(flag==1)
printf("\n Valid identifier");
}
else
printf("\n It is a keyword, So it can't be an identifier");
getch();
}
OUTPUT:
PROGRAM 4:: WAP to check the valid comment.
#include<stdio.h>
#include<conio.h>
#include<string.h>
void
main ()
{
char com[100];
printf ("\n Enter element");
scanf ("%[^;]s", com);
if (com[0] == '/')
{
if (com[1] == '/')
printf ("\n It is a Single Line comment");
{
if (com[(strlen(com)-2)] == '*' && com[(strlen(com)-1)] == '/')
else
else
printf ("It is not a right syntax of comment");
else
getch ();
OUTPUT:
PROGRAM 5:: WAP to count number of lines and spaces.
#include<stdio.h>
#include<conio.h>
#include<string.h>
void main()
{
char str[200],ch;
int a=0,space=0,newline=0;
//clrscr();
printf("\nEnter a string.(Press escape to quit entering)\n");
ch=getchar();
while((ch!=27)&&(a<199))
{ str[a]=ch;
if(str[a]==' ')
space++;
if(str[a]==10)
newline++;
a++;
ch=getchar();
}
printf("\nthe number of lines used is %d",newline+1);
printf("\nthe number of spaces used is %d",space);
}
OUTPUT:
PROGRAM 6:: WAP to check whether the syntax of “IF” statement is valid or not.
#include<stdio.h>
#include<conio.h>
#include<string.h>
int main()
{
char ch[80];
int i=0, length, ter=0;
printf("Enter the if statement syntax:\n");
printf("Press ESC to terminate your expression:\n");
while(ter!=27)
{
ch[i]=getchar();
ter=(int)ch[i];
i++;
}
length = i;
if(ch[0]=='i'&&ch[1]=='f'&&ch[2]=='('&&ch[length-2]=='}'||ch[length-3]=='}')
{
for(i=3;i<length-1;i++)
{
if(ch[i]==')'&&ch[i+1]=='{'||ch[i+1]=='{' || ch[i+2]=='{')
{
i=1000;
break;
}}}
if(i==1000)
printf("\n\tYour if statement syntax is correct\n");
else
printf("\nWrong Syntax...!!!");
getch();
}
OUTPUT:
PROGRAM 7:: WAP to find the FIRST of Non-Terminal in production.
#include<stdio.h>
#include<ctype.h>
void FIRST(char[],char );
void resultSet(char[],char);
int nop;
char proSet[10][10];
void main()
{
int i;
char choice;
char c;
char result[20];
printf("Enter the Number of Production in Grammar ::");
scanf(" %d",&nop);
printf("\nEnter productions in form of S=A+B and for Epsilon A=$ \n");
for(i=0;i<nop;i++)
{
printf("Enter productions Number %d : ",i+1);
scanf(" %s",proSet[i]);
}
do
{
printf("\n Find the FIRST of :");
scanf(" %c",&c);
FIRST(result,c);
printf("\n FIRST(%c)= { ",c);
for(i=0;result[i]!='\0';i++)
printf(" %c ",result[i]);
printf("}\n");
printf("press 'y' to continue : ");
scanf(" %c",&choice);
}
while(choice=='y'||choice =='Y');
}
if(!(isupper(c)))
{
resultSet(Result,c);
return ;
}
for(i=0;i<nop;i++)
{
if(proSet[i][0]==c)
{
if(proSet[i][2]=='$')
resultSet(Result,'$');
else
{
j=2;
while(proSet[i][j]!='\0')
{ foundEpsilon=0;
FIRST(subResult,proSet[i][j]);
for(k=0;subResult[k]!='\0';k++)
resultSet(Result,subResult[k]);
for(k=0;subResult[k]!='\0';k++)
if(subResult[k]=='$')
{
foundEpsilon=1;
break;
}
if(!foundEpsilon)
break;
j++;
}
}
}
}
#include<stdio.h>
#include<string.h>
#include<ctype.h>
int n,m=0,p,i=0,j=0;
char a[10][10],followResult[10];
void follow(char c);
void first(char c);
void addToResult(char);
int main()
{
int i;
int choice;
char c,ch;
printf("Enter the no.of productions: ");
scanf("%d", &n);
printf(" Enter %d productions\nProduction with multiple terms should be give as separate
productions \n", n);
for(i=0;i<n;i++)
scanf("%s%c",a[i],&ch);
// gets(a[i]);
do
{
m=0;
printf("Find FOLLOW of -->");
scanf(" %c",&c); follow(c);
printf("FOLLOW(%c) = { ",c);
for(i=0;i<m;i++)
printf("%c ",followResult[i]);
printf(" }\n");
printf("Do you want to continue(Press 1 to continue... )?");
scanf("%d%c",&choice,&ch);
}
while(choice==1);
}
void follow(char c)
{
if(a[0][0]==c)addToResult('$');
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;
addToResult(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];
addToResult(a[k][2]);
else first(a[k][2]);
}
}
}
void addToResult(char c)
{
int i;
for( i=0;i<=m;i++)
if(followResult[i]==c)
return;
followResult[m++]=c;
}
OUTPUT:
PROGRAM 9:: SR Parser for Grammar E->E+E / E/E / E*E / E-E / id
#include<stdio.h>
#include<conio.h>
#include<string.h>
char ip_sym[15],stack[15];
int ip_ptr=0,st_ptr=0,len,i;
char temp[2],temp2[2];
char act[15];
void check();
void main()
{
clrscr();
printf("\n\t\t SHIFT REDUCE PARSER\n");
printf("\n GRAMMER\n"); printf("\n
E->E+E\n E->E/E"); printf("\n E-
>E*E\n E->E-E\n E->id"); printf("\n
enter the input symbol:\t");
gets(ip_sym);
printf("\n\t stack implementation table"); printf("\n
stack\t\t input symbol\t\t action"); printf("\n
\t\t \t\t \n"); printf("\n
$\t\t%s$\t\t\t--",ip_sym);
strcpy(act,"shift ");
temp[0]=ip_sym[ip_ptr];
temp[1]='\0';
strcat(act,temp);
len=strlen(ip_sym);
for(i=0;i<=len-1;i++)
{
stack[st_ptr]=ip_sym[ip_ptr];
stack[st_ptr+1]='\0';
ip_sym[ip_ptr]=' ';
ip_ptr++;
printf("\n $%s\t\t%s$\t\t\t%s",stack,ip_sym,act);
strcpy(act,"shift ");
temp[0]=ip_sym[ip_ptr];
temp[1]='\0';
strcat(act,temp);
check();
st_ptr++;
}
st_ptr++;
check();
}
void check()
{
int flag=0;
temp2[0]=stack[st_ptr];
temp2[1]='\0';
if(islower(temp2[0]))
{
stack[st_ptr]='E';
flag=1;
}
if((!strcmp(temp2,"+"))||(!strcmp(temp2,"*"))
||(!strcmp(temp2,"/"))||(!strcmp(temp2,"-")))
{
flag=1;
}
if((!strcmp(stack,"E+E"))||(!strcmp(stack,"E/E"))
||(!strcmp(stack,"E*E"))||(!strcmp(stack,"E-E")))
{
if(!strcmp(stack,"E+E"))
{
strcpy(stack,"E");
printf("\n $%s\t\t%s$\t\t\tE->E+E",stack,ip_sym);
else
if(!strcmp(stack,"E/E"))
{
strcpy(stack,"E");
printf("\n $%s\t\t %s$\t\t\tE->E/E",stack,ip_sym);
}
else
if(!strcmp(stack,"E-E"))
{
strcpy(stack,"E");
printf("\n $%s\t\t %s$\t\t\tE->E-E",stack,ip_sym);
}
else
{
strcpy(stack,"E");
printf("\n $%s\t\t%s$\t\t\tE->E*E",stack,ip_sym);
} flag=1;
st_ptr=0;
}
if(!strcmp(stack,"E")&&ip_ptr==len)
{
printf("\n $%s\t\t%s$\t\t\tACCEPT",stack,ip_sym);
getch();
exit(0);
}
if(flag==0)
{
printf("\n $%s\t\t\t%s\t\t reject",stack,ip_sym);
getch();
exit(0);
}
return;
}
OUTPUT:
PROGRAM 10:: WAP for the Recursive Descent Parser for the given grammar.
P ---> E '#'
E ---> T {('+'|'-') T}
T ---> S {('*'|'/') S}
S ---> F '^' S | F
F ---> char | '(' E ')'
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
char next; void
E(void); void
T(void); void
S(void); void
F(void); void
error(int); void
scan(void); void
enter(char); void
leave(char); void
spaces(int); int
level = 0;
void main(void)
{
printf("Enter the string:: ");
scan();
E();
if (next != '#') error(1);
else printf("Successful parse\n");
}
void E(void)
{
enter('E');
T();
while (next == '+' || next == '-') {
scan();
T();
}
leave('E');
}
void T(void)
{
enter('T');
S();
while (next == '*' || next == '/') {
scan();
S();
}
leave('T');
}
void S(void)
{
enter('S');
F();
if (next == '^') {
scan();
S();
}
leave('S');
}
void F(void)
{
enter('F');
if (isalpha(next)) {
scan();
}
else if (next == '(') {
scan();
E();
if (next == ')') scan();
else error(2);
}
else {
error(3);
}
leave('F');
}
void scan(void)
{
while (isspace(next = getchar()))
;
}
void error(int n)
{
printf("\n*** ERROR: %i\n", n);
exit(1);
}
void enter(char name)
{
spaces(level++);
printf("+-%c: Enter, \t", name);
printf("Next == %c\n", next);
}
void leave(char name)
{
spaces(--level);
printf("+-%c: Leave, \t", name);
printf("Next == %c\n", next);
}
OUTPUT: