Skip to content

Commit c6ecb71

Browse files
9th
1 parent 5a15252 commit c6ecb71

File tree

5 files changed

+573
-258
lines changed
  • cd
    • 5. Write program to convert NFA with ε transition to NFA without ε transition
    • 7. Write program to minimize any given DFA.
    • 9. Write program to find Simulate First and Follow of any given grammar.

5 files changed

+573
-258
lines changed
Lines changed: 196 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,196 @@
1+
#include <stdio.h>
2+
#include <stdlib.h>
3+
struct node
4+
{
5+
int st;
6+
struct node *link;
7+
};
8+
9+
void fc(int, int);
10+
void it(int, char, int);
11+
int fa(char);
12+
void ffs(void);
13+
void uc(int);
14+
void pec(int);
15+
static int set[20], ns, na, s, nt, nf, start, fs[20], c, r, b[20];
16+
char alphabet[20];
17+
static int e_closure[20][20] = {0};
18+
struct node *transition[20][20] = {NULL};
19+
void main()
20+
{
21+
int i, j, k, m, t, n;
22+
23+
struct node *temp;
24+
printf("enter the number of alphabets?\n");
25+
scanf("%d", &na);
26+
getchar();
27+
printf("\nEnter alphabets?\n");
28+
for (i = 0; i < na; i++)
29+
{
30+
31+
alphabet[i] = getchar();
32+
getchar();
33+
}
34+
printf("Enter the number of states?\n");
35+
scanf("%d", &ns);
36+
printf("Enter the start state?\n");
37+
scanf("%d", &start);
38+
printf("Enter the number of final states?\n");
39+
scanf("%d", &nf);
40+
printf("Enter the final states?\n");
41+
for (i = 0; i < nf; i++)
42+
scanf("%d", &fs[i]);
43+
printf("Enter no of transition?\n");
44+
scanf("%d", &nt);
45+
printf("\nEnter transition?\n");
46+
for (i = 0; i < nt; i++)
47+
{
48+
49+
scanf("%d %c%d", &r, &c, &s);
50+
it(r, c, s);
51+
}
52+
53+
printf("\n");
54+
55+
for (i = 1; i <= ns; i++)
56+
{
57+
c = 0;
58+
for (j = 0; j < 20; j++)
59+
60+
{
61+
b[j] = 0;
62+
e_closure[i][j] = 0;
63+
}
64+
fc(i, i);
65+
}
66+
printf("Equivalent NFA without epsilon\n");
67+
printf("start state:");
68+
pec(start);
69+
printf("\nAlphabets:");
70+
for (i = 0; i < na; i++)
71+
printf("%c ", alphabet[i]);
72+
printf("\n States :");
73+
for (i = 1; i <= ns; i++)
74+
pec(i);
75+
76+
printf("\nTnransitions are...:\n");
77+
78+
for (i = 1; i <= ns; i++)
79+
{
80+
81+
for (j = 0; j < na - 1; j++)
82+
{
83+
for (m = 1; m <= ns; m++)
84+
set[m] = 0;
85+
for (k = 0; e_closure[i][k] != 0; k++)
86+
{
87+
88+
t = e_closure[i][k];
89+
temp = transition[t][j];
90+
while (temp != NULL)
91+
{
92+
93+
uc(temp->st);
94+
temp = temp->link;
95+
}
96+
}
97+
printf("\n");
98+
pec(i);
99+
printf("%c\t", alphabet[j]);
100+
printf("{");
101+
for (n = 1; n <= ns; n++)
102+
{
103+
if (set[n] != 0)
104+
printf("q%d,", n);
105+
}
106+
printf("}");
107+
}
108+
}
109+
printf("\n Final states:");
110+
ffs();
111+
}
112+
113+
void fc(int x, int sta)
114+
{
115+
struct node *temp;
116+
int i;
117+
if (b[x])
118+
return;
119+
e_closure[sta][c++] = x;
120+
b[x] = 1;
121+
if (alphabet[na - 1] == 'e' && transition[x][na - 1] != NULL)
122+
{
123+
temp = transition[x][na - 1];
124+
while (temp != NULL)
125+
{
126+
fc(temp->st, sta);
127+
temp = temp->link;
128+
}
129+
}
130+
}
131+
132+
void it(int r, char c, int s)
133+
{
134+
int j;
135+
struct node *temp;
136+
j = fa(c);
137+
if (j == 999)
138+
{
139+
printf("error\n");
140+
exit(0);
141+
}
142+
temp = (struct node *)malloc(sizeof(struct node));
143+
temp->st = s;
144+
temp->link = transition[r][j];
145+
transition[r][j] = temp;
146+
}
147+
148+
int fa(char c)
149+
{
150+
int i;
151+
for (i = 0; i < na; i++)
152+
if (alphabet[i] == c)
153+
return i;
154+
155+
return (999);
156+
}
157+
158+
void uc(int i)
159+
{
160+
int j = 0, k;
161+
while (e_closure[i][j] != 0)
162+
{
163+
k = e_closure[i][j];
164+
set[k] = 1;
165+
j++;
166+
}
167+
}
168+
void ffs()
169+
{
170+
int i, j, k, t;
171+
for (i = 0; i < nf; i++)
172+
{
173+
for (j = 1; j <= ns; j++)
174+
{
175+
for (k = 0; e_closure[j][k] != 0; k++)
176+
{
177+
if (e_closure[j][k] == fs[i])
178+
{
179+
180+
pec(j);
181+
}
182+
}
183+
}
184+
}
185+
}
186+
187+
void pec(int i)
188+
{
189+
int j;
190+
printf("{");
191+
for (j = 0; e_closure[i][j] != 0; j++)
192+
printf("q%d,", e_closure[i][j]);
193+
printf("}\t");
194+
}
195+
196+
// https://3.bp.blogspot.com/-t3w2DH0PjE4/W6n_PZUzr3I/AAAAAAAAF24/GY2aLuE53Rc30MfqD2hYUEL5brWACv8sgCLcBGAs/s640/nfa852914951.jpg
Binary file not shown.
Lines changed: 165 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,166 @@
1-
// Write program to minimize any given DFA.
21

3-
#include<stdio.h>
4-
#include<string.h>
2+
#include <stdio.h>
3+
#include <stdlib.h>
4+
#include <string.h>
5+
6+
int **transitionMap;
7+
int **ptm;
8+
int ss;
9+
long int r;
10+
long int as;
11+
long int fs;
12+
long int nonfs;
13+
long int *P;
14+
void dfs(int v) {
15+
r |= (1 << v);
16+
17+
for (int i = 0; i < 26; i++)
18+
if ((transitionMap[v][i] != -1) &&
19+
((r & (1 << transitionMap[v][i])) == 0)) {
20+
dfs(transitionMap[v][i]);
21+
}
22+
}
23+
int main() {
24+
fs = 0;
25+
as = 0;
26+
27+
transitionMap = (int **)malloc(64 * sizeof(int *));
28+
for (int i = 0; i < 64; i++) {
29+
transitionMap[i] = (int *)malloc(26 * sizeof(int));
30+
for (int j = 0; j < 26; j++) {
31+
transitionMap[i][j] = -1;
32+
}
33+
}
34+
ptm = (int **)malloc(64 * sizeof(int *));
35+
for (int i = 0; i < 64; i++) {
36+
ptm[i] = (int *)malloc(26 * sizeof(int));
37+
for (int j = 0; j < 26; j++) {
38+
ptm[i][j] = -1;
39+
}
40+
}
41+
42+
char buff[125];
43+
fgets(buff, sizeof(buff), stdin);
44+
char *p = strtok(buff, " ");
45+
ss = atoi(p);
46+
47+
fgets(buff, sizeof(buff), stdin);
48+
p = strtok(buff, " ");
49+
while (p != NULL) {
50+
int state = atoi(p);
51+
fs |= 1 << (state);
52+
p = strtok(NULL, " ");
53+
}
54+
55+
int from;
56+
char symbol;
57+
int to;
58+
while (fscanf(stdin, "%d %c %d", &from, &symbol, &to) != EOF) {
59+
transitionMap[from][symbol - 'a'] = to;
60+
61+
llStates |= (1 << from);
62+
as |= (1 << to);
63+
}
64+
65+
r = 0;
66+
dfs(ss);
67+
68+
as &= r;
69+
fs &= r;
70+
71+
P = (long int *)malloc(64 * sizeof(long int));
72+
for (int i = 0; i < 64; i++) {
73+
P[i] = 0;
74+
}
75+
76+
nonfs = as & ~fs;
77+
P[0] = fs;
78+
P[1] = nonfs;
79+
int npi = 2;
80+
81+
for (int i = 0; i < 64; i++) {
82+
83+
long int np = 0;
84+
85+
if (P[i] == 0) {
86+
break;
87+
}
88+
/* Try to find leftmost bit in the bitset. This loop will only run to its
89+
entirety once when that bit is found*/
90+
for (int j = 63; j >= 0; j--) {
91+
92+
long int sts = (long int)1 << j;
93+
94+
if ((P[i] & (sts)) != 0) {
95+
96+
97+
ptm[i] = transitionMap[j];
98+
99+
for (int k = j - 1; k >= 0; k--) {
100+
101+
long int os = (long int)1 << k;
102+
103+
if ((P[i] & (os)) != 0) {
104+
/* Iterate across the entire alphabet and check if sts and os can transition
105+
to Different*/
106+
for (int l = 0; l < 26; l++) {
107+
108+
int sn = -1;
109+
int on = -1;
110+
for (int m = 0; m < npi; m++) {
111+
if ((P[m] & (1 << transitionMap[j][l])) != 0) {
112+
sn = m;
113+
}
114+
if ((P[m] & (1 << transitionMap[k][l])) != 0) {
115+
on = m;
116+
}
117+
}
118+
119+
if (transitionMap[j][l] != transitionMap[k][l] &&
120+
(sn != on)) {
121+
P[i] &= ~(1 << k);
122+
np |= (1 << k);
123+
break;
124+
}
125+
}
126+
}
127+
}
128+
break;
129+
}
130+
}
131+
132+
if (np != 0) {
133+
P[npi] = np;
134+
npi++;
135+
}
136+
}
137+
138+
int sp = 0;
139+
for (int i = 0; i < npi; i++) {
140+
if ((P[i] & (1 << ss)) != 0) {
141+
sp = i;
142+
break;
143+
}
144+
}
145+
printf("%d \n", sp);
146+
147+
for (int i = 0; i < npi; i++) {
148+
if ((P[i] & fs) != 0) {
149+
printf("%d ", i);
150+
}
151+
}
152+
printf("\n");
153+
154+
for (int i = 0; i < npi; i++) {
155+
for (int j = 0; j < 26; j++) {
156+
if (ptm[i][j] != -1) {
157+
for (int k = 0; k < npi; k++) {
158+
if ((P[k] & (1 << ptm[i][j])) != 0) {
159+
printf("%d %c %d\n", i, j + 'a', k);
160+
}
161+
}
162+
}
163+
}
164+
}
165+
return 0;
166+
}
Binary file not shown.

0 commit comments

Comments
 (0)