Untitled
unknown
plain_text
9 months ago
1.9 kB
5
Indexable
#include <stdio.h>
#include <string.h>
#include <ctype.h>
char production[10][10];
int count;
char first[10], follow[10];
int n = 0, m = 0;
void findFirst(char c) {
for (int i = 0; i < count; i++) {
if (production[i][0] == c) {
if (!isupper(production[i][2])) {
first[n++] = production[i][2];
} else if (production[i][2] == '#') {
first[n++] = '#';
} else {
findFirst(production[i][2]);
}
}
}
}
void findFollow(char c) {
if (production[0][0] == c) follow[m++] = '$'; // Start symbol
for (int i = 0; i < count; i++) {
for (int j = 2; production[i][j] != '\0'; j++) {
if (production[i][j] == c) {
if (production[i][j + 1] != '\0') {
findFirst(production[i][j + 1]);
for (int k = 0; k < n; k++) {
if (first[k] != '#') follow[m++] = first[k];
}
}
if (production[i][j + 1] == '\0' && production[i][0] != c) {
findFollow(production[i][0]);
}
}
}
}
}
int main() {
count = 8;
strcpy(production[0], "X=TnS");
strcpy(production[1], "X=Rm");
strcpy(production[2], "T=q");
strcpy(production[3], "T=#");
strcpy(production[4], "S=p");
strcpy(production[5], "S=#");
strcpy(production[6], "R=om");
strcpy(production[7], "R=ST");
printf("First and Follow Sets:\n");
for (int i = 0; i < count; i++) {
char c = production[i][0];
n = 0;
findFirst(c);
printf("First(%c) = { ", c);
for (int j = 0; j < n; j++) printf("%c ", first[j]);
printf("}\n");
m = 0;
findFollow(c);
printf("Follow(%c) = { ", c);
for (int j = 0; j < m; j++) printf("%c ", follow[j]);
printf("}\n");
}
return 0;
}Editor is loading...
Leave a Comment