#include #include #include "tokens.h" extern int lineno; extern char *yytext; extern int yylex(); int lookahead; void match(int), error(char*); void EL(), Ex(); int E(),T(),F(); int E_p(int), T_p(int); /* Grammar used: Production Predict EL --> Ex EL ( INT | EOF Ex --> E = ( INT E --> T E' ( INT E' --> + T E' + | - T E' - | = ) T --> F T' ( INT T' --> * F T' * | / F T' / | = ) F --> ( E ) ( | INT INT */ int main() { lookahead = yylex(); EL(); if (lookahead == 0) /* no more input */ printf("accepted\n"); else printf("rejected\n"); } void match(int token) { if (token == lookahead) lookahead = yylex(); else error("match"); } void error(char *where) { printf("Syntax error line %d: %s\n",lineno, where); printf("Token seen: %d\n",lookahead); exit(42); } void EL() { if ((lookahead == LP) || (lookahead == INT)) { Ex(); EL(); } else if (lookahead == 0) /* EOF */ return; else error("EL"); } void Ex() { if ((lookahead == LP)||(lookahead==INT)) { printf("%d\n",E()); match(EQUAL);} else error("Ex"); } int E() { if ((lookahead == LP)||(lookahead==INT)) { /*T(); E_p();*/ return E_p(T());} else error("E"); } int E_p(int k) { if (lookahead == PLUS) { match(PLUS); /*T(); E_p(); */ return E_p(k+T()); } else if (lookahead == MINUS) { match(MINUS); /*T(); E_p(); */ return E_p(k-T()); } else return k; } int T() { if ((lookahead == LP)||(lookahead==INT)) { /*F(); T_p();*/ return T_p(F()); } else error("T"); } int T_p(int k) { if (lookahead == TIMES ) { match(TIMES); /*F(); T_p(); */ return T_p(k*F()); } else if (lookahead == DIVIDE) { match(DIVIDE); /*F(); T_p(); */ return T_p(k/F()); } else return k; } int F() { if (lookahead == LP) { int k; match(LP); k= E(); match(RP); return k;} else if (lookahead == INT){ int k; k = atoi(yytext); match(INT); return k; } else error("F"); }