import java.io.* ;

class Instit {
  Lexer lexer ;

  Instit (Lexer lexer) {
    this.lexer = lexer ;
    step() ;
  }

  Token tok ;

  void step() {
    tok = lexer.read() ;
  }

  void error(String expected, Token seen) {
    System.err.println("Erreur de syntaxe, " + expected + " attendu, " + seen + " trouvé") ;
    System.exit(2) ;
  }

   void parseF() {
    switch (tok.nature) {
    case Token.OPAR:
      step() ;
      parseE() ;
      if (tok.nature != Token.CPAR) error(")", tok) ;
      step() ;
      return ;
    case Token.INT:
      step() ;
      return  ;
    default:
      error("entier", tok) ;
      return ; // Not Reached
    }
  }

  void parseP() {
    parseF() ;
    while (tok.nature == Token.MUL || tok.nature == Token.DIV) {
      step() ;
      parseF() ;
    }
  }

  void parseE() {
    parseP() ;
    while (tok.nature == Token.ADD || tok.nature == Token.SUB) {
      step() ;
      parseP() ;
    }
  }

  void parse() {
    parseE() ;
    if (tok.nature != Token.EOF) error("EOF", tok) ;
  }

  public static void main(String [] argv) {
    Lexer lexer = new Lexer (new StringReader (argv[0])) ;
    Instit i = new Instit (lexer) ;
    i.parse() ;
  }
}

