Untitled

 avatar
unknown
plain_text
20 days ago
1.9 kB
3
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;
}
Leave a Comment