-
Notifications
You must be signed in to change notification settings - Fork 3
/
ll1.c
104 lines (99 loc) · 2.24 KB
/
ll1.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int i=0,top=0;
char stack[20], ip[20];
void push(char c)
{
if(top > 20)
printf("Stack Overflow");
else
stack[top++] = c;
}
void pop()
{
if(top < 0)
printf("Stack Underflow");
else
top--;
}
void error()
{
printf("Error");
exit(0);
}
int main()
{
int n;
printf("Given Grammar\n");
printf("E -> TE'\n");
printf("E' -> +TE' | e\n");
printf("T -> FT' | e\n");
printf("T' -> *FT' | e\n");
printf("F -> (E) | i'\n\n");
printf("Enter string to be parsed: ");
scanf(" %s",ip);
n = strlen(ip);
ip[n] = '$';
ip[n+1] = '\0';
push('$');
push('E');
/*3 conditions
1. top = terminal = $
2. top = terminal != $
3. top != terminal*/
while(ip[i] != '\0')
{
if(ip[i] == '$' && stack[top-1] == '$')
printf("Parsing successful");
else if(ip[i] == stack[top-1])
{
printf("\nMatch of %c ",ip[i]);
i++;
pop();
}
else
{
if(stack[top-1] == 'E' && (ip[i] == 'i' || ip[i] == '('))
{
printf("\nE -> TE' ");
pop();
push('A'); // E' = A
push('T');
}
else if(stack[top-1] == 'A' && (ip[i] == '+'))
{
printf("\nE' -> +TE' ");
pop();
push('A');
push('T');
push('+');
}
else if(stack[top-1] == 'A' && (ip[i] == ')') || (ip[i] == '$'))
{
printf("\nE' -> e");
pop();
}
else if(stack[top-1] == 'T' && (ip[i] == '(' || ip[i] == 'i'
pop();
}
else if(stack[top-1] == 'F' && (ip[i] == 'i'))
{
printf("\nF -> i");
pop();
push('i');
}
else if(stack[top-1] == 'F' && (ip[i] == '('))
{
printf("\nF -> (E)");
pop();
push(')');
push('E');
push('(');
}
else
error();
}
}
return 0;
}