Untitled

 avatar
unknown
plain_text
12 days ago
2.4 kB
1
Indexable
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>

int n, m = 0, p, i = 0, j = 0;
char a[10][10], f[10];

void follow(char c);
void first(char c);

int main() {
    int i, z;
    char c, ch;

    printf("Enter the number of productions:\n");
    scanf("%d", &n);
    printf("Enter the productions:\n");

    // Input productions
    for (i = 0; i < n; i++) {
        scanf("%s%c", a[i], &ch);
    }

    do {
        m = 0;
        printf("Enter the element whose first & follow is to be found: ");
        scanf(" %c", &c);  // Ensure to capture the next non-whitespace character
        
        // Calculate First set
        first(c);
        printf("First(%c) = {", c);
        for (i = 0; i < m; i++) {
            printf("%c", f[i]);
            if (i < m - 1) printf(", ");
        }
        printf("}\n");

        // Reset f[] and m for the follow set
        strcpy(f, "");
        m = 0;

        // Calculate Follow set
        follow(c);
        printf("Follow(%c) = {", c);
        for (i = 0; i < m; i++) {
            printf("%c", f[i]);
            if (i < m - 1) printf(", ");
        }
        printf("}\n");

        printf("Continue (1 for Yes, 0 for No): ");
        scanf("%d%c", &z, &ch);
    } while (z == 1);
}

void first(char c) {
    int k;
    if (!isupper(c)) {
        f[m++] = c;  // If the character is a terminal, add it to the First set
    }
    for (k = 0; k < n; k++) {
        if (a[k][0] == c) {  // Check if the production starts with character c
            if (a[k][2] == '$') {  // If it contains epsilon
                follow(a[k][0]);
            } else if (islower(a[k][2])) {
                f[m++] = a[k][2];  // If the next character is a terminal
            } else {
                first(a[k][2]);  // Otherwise, recursively call first() on the next character
            }
        }
    }
}

void follow(char c) {
    if (a[0][0] == c) {  // Add $ to the Follow set if c is the start symbol
        f[m++] = '$';
    }
    for (i = 0; i < n; i++) {
        for (j = 2; j < strlen(a[i]); j++) {  // Check the production rules
            if (a[i][j] == c) {
                if (a[i][j + 1] != '\0') {
                    first(a[i][j + 1]);
                }
                if (a[i][j + 1] == '\0' && c != a[i][0]) {
                    follow(a[i][0]);
                }
            }
        }
    }
}
Leave a Comment