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

Port City International University: Report On: Report No: Course Code: Course Title

Here is a C program to construct an LL(1) parsing table for a given grammar: #include <stdio.h> #include <string.h> // Grammar productions char productions[7][10] = {"E->T","E->TE'","E'->+TE'","E'->","T->F","T->FT'","T'->*FT'","T'->"}; // First sets char first[8][10] = {"{a}","{a}","{+}","{}","{a}","{a}","{*}","{}"}; // Parsing table char table[5][5]; int

Uploaded by

Isfak Ahmed
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
68 views

Port City International University: Report On: Report No: Course Code: Course Title

Here is a C program to construct an LL(1) parsing table for a given grammar: #include <stdio.h> #include <string.h> // Grammar productions char productions[7][10] = {"E->T","E->TE'","E'->+TE'","E'->","T->F","T->FT'","T'->*FT'","T'->"}; // First sets char first[8][10] = {"{a}","{a}","{+}","{}","{a}","{a}","{*}","{}"}; // Parsing table char table[5][5]; int

Uploaded by

Isfak Ahmed
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 34

Port City International University

Report On: Various problems solved on compiler lab


Report No : 1 & 2
Course Code : CSE 412
Course Title : Compiler Sessional

Submitted To Submitted By

Name of Lecturer/Professor:Mr. Sowmitra Das Name of Student: Sajia Alam Sraboni

Program: B.Sc in CSE

Department of CSE Batch No: 15-(A)

ID No: CSE 01506436


Port City International University
Date of Submission: 30.04.2021
INDEX

Mid Report

Sr. NO Experiment Names Page No


01. Design a lexical analyzer for given language and the lexical analyzer 02
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.
02. Write a C program to identify whether a given line is a comment or 05
not.
03. Write a C program to recognize strings under 'a', 'a*b+', 'abb'. 07
04. Write a C program to test whether a given identifier is valid or not. 10

05. Write a C program to simulate lexical analyzer for validating 12


operators.

Final Report

06. Write a C program for implementing the functionalities of predictive 14


parser for the language.
07. Write a C program for constructing of LL (1) parsing. 17

08. Write a C program for constructing recursive descent parsing 22

09. Write a C program to implement LALR parsing 26

1
Experiment No-01:
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.

Program:
#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||strc
mp("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");
f1=fopen("input","w");
while((c=getchar())!=EOF)
putc(c,f1);
fclose(f1);
f1=fopen("input","r");
f2=fopen("identifier","w");
f3=fopen("specialchar","w");
while((c=getc(f1))!=EOF) {
if(isdigit(c))

2
{
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))
{
putc(c,f2);
c=getc(f1);
while(isdigit(c)||isalpha(c)||c=='_'||c=='$')
{
putc(c,f2);
c=getc(f1);
}
putc(' ',f2);
ungetc(c,f1);
}
else
if(c==' '||c=='\t')
printf(" ");
else
if(c=='\n')

3
lineno++;
else
putc(c,f3);
}
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("identifier","r");
k=0;
printf("The keywords and identifiers are:");
while((c=getc(f2))!=EOF) {
if(c!=' ')
str[k++]=c;
else
{
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);

4
printf("\n");
fclose(f3);
printf("Total no. of lines are:%d",lineno);
}
Output:

Experiment No- 02:


OBJECTIVE: Write a C program to identify whether a given line is a comment or not.
Program:
#include<stdio.h>
void main() {
char comm[30];
int i=2,a=0;
printf("\n Enter your comment:");
gets(comm);
if(comm[0]=='/') {
if(comm[1]=='/')

5
printf("\n It's a comment");
else if(comm[1]=='*') {
for(i=2;i<=30;i++)
{
if(comm[i]=='*'&& comm[i+1]=='/')
{
printf("\n It is a comment");
a=1;
break; }
else
continue; }
if(a==0)
printf("\n It's not a comment");
}
else
printf("\n It's not a comment");
}
else
printf("\n It's not a comment");
getch(); }

Output:

6
Experiment No- 03:
OBJECTIVE: Write a C program to recognize strings under 'a*', 'a*b+', 'abb'.
Program:
#include<stdio.h>
void main()
{char s[20],c;
int state=0,i=0;
printf("\n Enter a string:");
gets(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')

7
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;

8
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 || state==3)
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:

9
Experiment No- 04:
OBJECTIVE: Write a C program to test whether a given identifier is valid or not.

Programs:
#include<stdio.h>
#include<string.h>
#include<ctype.h>
int main()
{
char string[20];
int c=0,flag,i;
printf("Enter a identifier to check:");
gets(string);
if(isalpha(string[0])||(string[0]=='_')||(string[0]=='$'))
{
c=1;
}
else if(isdigit(string[1])&&(string[0]=='_')||(string[0]=='$'))
{
c=0;
}
else
{

10
printf("Invalid Identifier");
}
while(string[i]!='\0')
{
if((string[i]==' ')||(string[i]=='\t'))
{
c=0;
break;
}
i++;
}
if(c==1)
printf("Valid identifier");
else if(c==0)
printf("Invalid Identifier");
}
Output:

11
Experiment No- 05:
OBJECTIVE: Write a C program to simulate lexical analyzer for validating operators.
Programs:
#include<stdio.h>
int main()
{
char s[2];

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");
break;
case'=': if(s[1]=='=')
printf("\nEqual to");
else
printf("\nAssignment");
break;
case'!': if(s[1]=='=')

12
printf("\nNot Equal");
else
printf("\n Bit Not");
break;
case'&': if(s[1]=='&')
printf("\nLogical AND");
else
printf("\n Bitwise AND");
break;
case'|': if(s[1]=='|')
printf("\nLogical OR");
else
printf("\nBitwise OR");
break;
case'+': printf("\n Addition");
break;
case'-': printf("\nSubtraction");
break;
case'*': printf("\nMultiplication");
break;
case'/': printf("\nDivision");
break;
case'%': printf("Modulus");
break;
default: printf("\n Not a operator");
}
return 0;
}

13
Output:

Experiment No- 06:


OBJECTIVE: Write a C program for implementing the functionalities of predictive parser for
the language .
Programs:
#include<stdio.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': return 0;
case 'A': return 1;
case 'B': return 2;
case 'C': return 3;
case 'a': return 0;

14
case 'b': return 1;
case 'c': return 2;
case 'd': return 3;
case '$': return 4;
}
return(2);
}
void main()
{
int i,j,k;
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=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)

15
{
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]);
}
}
}
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();}

16
Output:

Experiment No- 07:


OBJECTIVE: Write a C program for constructing of LL (1) parsing.
Programs:
#include<stdio.h>
#include<string.h>
char s[20],stack[20];
void main()
{
char m[5][6][3]= {"tb"," "," ","tb"," ",
" "," ","+tb"," "," ",
"n","n","fc"," "," ",
"fc"," "," "," ","n",

17
"*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,str2;
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])
{

18
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 '(':

19
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--;
else 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(" ");

20
for(k=j; k<=n; k++) printf("%c",s[k]);
printf(" \n ");
}
printf("\n SUCCESS");
return 0;
}
Output:

21
Experiment No-08:
OBJECTIVE: Construction of recursive descent parsing for the following grammar
E->TE'
E'->+TE/@
T->FT'
T`->*FT'/@
F-> (E)/ID
Programs:
#include<stdio.h>

char input[100];
int i,l;
void main()
{
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();

22
}
E()
{
if(T())
{
if(EP())
return(1);
else
return(0);
}
else
return(0);
}
EP()
{
if(input[i]=='+')
{
i++;
if(T())
{
if(EP())
return(1);
else
return(0);
}
else
return(0);
}

23
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

24
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);
}

25
else
return(0);
}
Output:

Experiment No-09:
OBJECTIVE: Write a program to Design LALR Bottom up Parser.
Programs:
#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);

26
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','+','*',')','(','$'};

27
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 top=-1;

char temp[10];

struct grammar
{
char left;
char right[5];
};
/*
E->E+T
E->T
T->T*F
T->F
F->(E)
F->i

/*
const struct grammar rl[6]={
{'E',"e+T"},
{'E',"T"},
{'T',"T*F"},
{'T',"F"},
{'F',"(E)"},
{'F',"i"},
};

void main()

28
{
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=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);
for(m=0;dl[m]!='\0';m++)
push(stack,&top,dl[m]);
l=top;

29
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])

30
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])
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;
}

31
void printt(char *t,int *p,char inp[],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");
break;
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;

32
}
}
Output:

33

You might also like