Untitled
#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