PROJECT REPORT
OF
“Compiler Design”
Submitted in partial fulfillment of the requirements for the award degree
of
Bachelor of Technology
In
Computer Science and Engineering
Bundelkhand Institute of Engineering and Technology, Jhansi (U.P)
(BIET Jhansi)
ACADEMIC SESSION 2023-24
Submitted by
Vivek Kumar (2100430100059)
Shrawan Kumar (2100430100050)
Nikhil Kumar(2100430100033)
Under the guidance of
Prof. Sanjai Kumar Gupta
ACKNOWLEDGEMENT
We are indebted to our respected Head of the Department Dr. Yashpal Singh for
guiding us. Theteam is also grateful to our project guide Prof. Sanjai Kumar Gupta,
for their invaluable guidance for this project. We also thank our respected faculty
members of the Computer Science and Engineering department for their
indomitable contribution and guidance without which this project would have been
impossible to complete. Our sincerest thanks to all the teachers, seniors and
colleagues whose help and guidance brought this project to successful completion.
Submitted by:
Vivek Kumar (2100430100059)
Shrawan Kumar(2100430100050)
Nikhil Kumar (2100430100033)
EXPERIMENT:
AIM:
Write a C program to construct predictive parsing table.
RESOURCE:
Visual Studio Code
Algorithm:
1. Start
2. Find the first and follow of each NT.
3. For each production A->a in G
4. For each terminal a in First(a).
5. Add A-> a to M[A,a).
6. If C is in First(a)
7. For each symbol b in Follow(A).
8. Add A-> a to M[A,b].
PROCEDURE:
Go to debug run or press CTRL+F9 to run the program.
PROGRAM:
#include < stdio.h >
#include < conio.h >
#include < string.h >
void main()
{
char fin[10][20], st[10][20], ft[20][20], fol[20][20];
int a = 0, e, i, t, b, c, n, k, l = 0, j, s, m, p;
clrscr();
printf("enter the no. of coordinates\n");
scanf("%d",& n);
printf("enter the productions in a grammar\n");
for (i = 0; i < n; i++)
scanf("%s", st[i]);
for (i = 0; i < n; i++)
fol[i][0] = '\0';
for (s = 0; s < n; s++) {
for (i = 0; i < n; i++) {
j = 3;
l = 0;
a = 0;
l1: if (!((st[i][j] > 64) && (st[i][j] < 91))) {
for (m = 0; m < l; m++) {
if (ft[i][m] == st[i][j])
goto s1;
}
ft[i][l] = st[i][j];
l = l + 1;
s1: j = j + 1;
}
else {
if (s > 0) {
while (st[i][j] != st[a][0]) {
a++;
}
b = 0;
while (ft[a][b] != '\0') {
for (m = 0; m < l; m++) {
if (ft[i][m] == ft[a][b])
goto s2;
}
ft[i][l] = ft[a][b];
l = l + 1;
s2: b = b + 1;
}
}
}
while (st[i][j] != '\0') {
if (st[i][j] == '|') {
j = j + 1;
goto l1;
}
j = j + 1;
}
ft[i][l] = '\0';
}
}
printf("first pos\n");
for (i = 0; i < n; i++)
printf("FIRS[%c]=%s\n", st[i][0], ft[i]);
fol[0][0] = '$';
for (i = 0; i < n; i++) {
k = 0;
j = 3;
if (i == 0)
l = 1;
else
l = 0;
k1: while ((st[i][0] != st[k][j]) && (k < n)) {
if (st[k][j] == '\0') {
k++;
j = 2;
}
j++;
}
j = j + 1;
if (st[i][0] == st[k][j - 1]) {
if ((st[k][j] != '|') && (st[k][j] != '\0')) {
a = 0;
if (!((st[k][j] > 64) && (st[k][j] < 91))) {
for (m = 0; m < l; m++) {
if (fol[i][m] == st[k][j])
goto q3;
}
fol[i][l] = st[k][j];
l++;
q3:
}
else {
while (st[k][j] != st[a][0]) {
a++;
}
p = 0;
while (ft[a][p] != '\0') {
if (ft[a][p] != '@') {
for (m = 0; m < l; m++) {
if (fol[i][m] == ft[a][p])
goto q2;
}
fol[i][l] = ft[a][p];
l = l + 1;
}
else
e = 1;
q2: p++;
}
if (e == 1) {
e = 0;
goto a1;
}
}
}
else {
a1: c = 0;
a = 0;
while (st[k][0] != st[a][0]) {
a++;
}
while ((fol[a][c] != '\0') && (st[a][0] != st[i][0])) {
for (m = 0; m < l; m++) {
if (fol[i][m] == fol[a][c])
goto q1;
}
fol[i][l] = fol[a][c];
l++;
q1: c++;
}
}
goto k1;
}
fol[i][l] = '\0';
}
printf("follow pos\n");
for (i = 0; i < n; i++)
printf("FOLLOW[%c]=%s\n", st[i][0], fol[i]);
printf("\n");
s = 0;
for (i = 0; i < n; i++) {
j = 3;
while (st[i][j] != '\0') {
if ((st[i][j - 1] == '|') || (j == 3)) {
for (p = 0; p <= 2; p++) {
fin[s][p] = st[i][p];
}
t = j;
for (p = 3; ((st[i][j] != '|') && (st[i][j] != '\0')); p++) {
fin[s][p] = st[i][j];
j++;
}
fin[s][p] = '\0';
if (st[i][k] == '@') {
b = 0;
a = 0;
while (st[a][0] != st[i][0]) {
a++;
}
while (fol[a][b] != '\0') {
printf("M[%c,%c]=%s\n", st[i][0], fol[a][b], fin[s]);
b++;
}
}
else if (!((st[i][t] > 64) && (st[i][t] < 91)))
printf("M[%c,%c]=%s\n", st[i][0], st[i][t], fin[s]);
else {
b = 0;
a = 0;
while (st[a][0] != st[i][3]) {
a++;
}
while (ft[a][b] != '\0') {
printf("M[%c,%c]=%s\n", st[i][0], ft[a][b], fin[s]);
b++;
}
}
s++;
}
if (st[i][j] == '|')
j++;
}
}
getch();
}
OUTPUT:
Enter the [Link] co - ordinates
2
Enter the productions in a grammar
S -> CC
C -> eC | d
First pos
FIRS[S] = ed
FIRS[C] = ed
Follow pos
FOLLOW[S] = $
FOLLOW[C] = ed$
M[S, e] = S -> CC
M[S, d] = S -> CC
M[C, e] = C -> eC
M[C, d] = C -> d