/* Kontextfreie Grammatik fuer Ausdruecke wie "(A*B+A*C)*D" [unzulaessig: "(A*B+D" oder "(A+B)++D"] Expression -> Term | Term Operator Expression Term -> Factor | Factor Operator '(' Term ')' | Factor Operator Letter Factor -> '(' Expression ')' | Letter Operator -> '+' | '*' Letter -> A | B | C | D | E @author MB @version: 3.0.0, DEC 2021 */ #include #include int j; // index of parsing char p[20]; // text to be parsed int parse(); int expression(); int term(); int factor(); int letter(char c); int main(void){ j = 0; puts("Geben Sie einen zu pruefenden Ausdruck ein:"); gets(p); parse(); return 0; } int parse(){ if(expression()){ puts("\nDer Ausdruck gehoert zur Sprache."); return 1; } puts("\nDer Ausdruck gehoert nicht zur Sprache."); return 0; } int expression(){ printf("In Funktion [expresssion], Index: %c\n", p[j]); int rc = 0; rc = term(); if(rc == 0) return 0; if(p[j] == '+' || p[j] == '*'){ j++; return expression(); } return rc; } int term(){ printf("In Funktion [term], Index: %c\n",p[j]); int rc = factor(); if(rc == 0) return 0; if(p[j] == '+' || p[j] == '*'){ j++; if(p[j] == '(' ){ j++; rc = term(); if(rc == 0) return 0; if(p[j] == ')'){ j++; } else{ puts("Fehler bei der Klammersetzung."); return 0; } } else{ rc = letter(p[j]); j++; } } return rc; } int factor(){ printf("In Funktion [factor], Index: %c\n",p[j]); int rc = 0; if(p[j] == '('){ j++; rc = expression(); if(rc == 0) return 0; if(p[j] == ')'){ j++; } else{ puts("Fehler bei der Klammersetzung."); return 0; } } else{ rc = letter(p[j]); j++; } return rc; } int letter(char c){ printf("In Funktion [letter], Index: %c\n",p[j]); if(c == 'A' || c =='B' || c == 'C' || c == 'D' || c == 'E'){ return 1; } return 0; }