#include <stdio.h>
#include "tokens.h"

extern int lineno;
extern char *yytext;
int lookahead;

/*
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
*/
main() {
  lookahead = yylex();
  EL();
  if (lookahead == 0) /* no more input */
  printf("accepted\n");
  else printf("rejected\n");
}

match(int token) {
 if (token == lookahead)
    lookahead = yylex();
 else error("match");
}

error(char *where) {
  printf("Syntax error line %d: %s\n",lineno, where);
  printf("Token seen: %d\n",lookahead);
  exit(42);
}

EL() {
  if ((lookahead == LP) || (lookahead == INT)) { Ex(); EL(); }
  else if (lookahead == 0)  /* EOF */
    return;
  else error("EL");
}

Ex() {
  if ((lookahead == LP)||(lookahead==INT)) { printf("%d\n",E()); match(EQUAL);}
  else error("Ex");
}

E() {
  if ((lookahead == LP)||(lookahead==INT)) { /*T(); E_p();*/  return E_p(T());}
  else error("E");
}

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;
}

T() {
  if ((lookahead == LP)||(lookahead==INT)) { /*F(); T_p();*/ return T_p(F()); }
  else error("E");
}

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;
}


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");
}



