Untitled

 avatar
unknown
plain_text
20 days ago
2.7 kB
3
Indexable
#include <stdio.h>
#include <string.h>

char prol[7][10] = { "S", "A", "A", "B", "B", "C", "C" };
char pror[7][10] = { "A", "Bb", "Cd", "aB", "@", "Cc", "@" };
char prod[7][10] = { "S->A", "A->Bb", "A->Cd", "B->aB", "B->@", "C->Cc", "C->@" };
char first[7][10] = { "abcd", "ab", "cd", "a@", "@", "c@", "@" };
char follow[7][10] = { "$", "$", "$", "a$", "b$", "c$", "d$" };
char table[5][6][10]; 

int numr(char c) {
    switch (c) {
        case 'S': return 0;
        case 'A': return 1;
        case 'B': return 2;
        case 'C': return 3;
        case 'a': return 0;
        case 'b': return 1;
        case 'c': return 2;
        case 'd': return 3;
        case '$': return 4;
        default: return -1;  // Error case for invalid input
    }
}

int main() {
    int i, j, k;
    
    // Initialize the table with empty strings
    for (i = 0; i < 5; i++) {
        for (j = 0; j < 6; j++) {
            strcpy(table[i][j], " ");
        }
    }

    // Print grammar rules
    printf("The following grammar is used for Parsing Table:\n");
    for (i = 0; i < 7; i++) {
        printf("%s\n", prod[i]);
    }
    
    // Fill the predictive parsing table based on FIRST and FOLLOW sets
    printf("\nPredictive parsing table:\n");

    // Fill table using FIRST set
    for (i = 0; i < 7; i++) {
        k = strlen(first[i]);
        for (j = 0; j < k; j++) {
            if (first[i][j] != '@') {
                strcpy(table[numr(prol[i][0])][numr(first[i][j])], prod[i]);
            }
        }
    }

    // Fill table using FOLLOW set (for epsilon productions)
    for (i = 0; i < 7; i++) {
        if (strlen(pror[i]) == 1 && pror[i][0] == '@') {
            k = strlen(follow[i]);
            for (j = 0; j < k; j++) {
                strcpy(table[numr(prol[i][0])][numr(follow[i][j])], prod[i]);
            }
        }
    }

    // Set the header row and column for the table
    strcpy(table[0][0], " ");
    strcpy(table[0][1], "a");
    strcpy(table[0][2], "b");
    strcpy(table[0][3], "c");
    strcpy(table[0][4], "d");
    strcpy(table[0][5], "$");

    strcpy(table[1][0], "S");
    strcpy(table[2][0], "A");
    strcpy(table[3][0], "B");
    strcpy(table[4][0], "C");

    // Print the table
    printf("\n--------------------------------------------------------\n");
    for (i = 0; i < 5; i++) {
        for (j = 0; j < 6; j++) {
            printf("%-10s", table[i][j]);
            if (j == 5) {
                printf("\n--------------------------------------------------------\n");
            }
        }
    }

    return 0;
}
Editor is loading...
Leave a Comment