final public start_AST Start() throws ParseException {
 /*@bgen(jjtree) start_AST */
  start_AST jjtn000 = new start_AST(JJTSTART_AST);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);Unit classUnit = null;
  List<Unit> classUnitList = new ArrayList<Unit >();
    try {
   SYMBOL_TABLE.enterScope(true, MODE);
  if (MODE==0) {
          //SYMBOL_TABLE.add("String", UnitType.CLASS);
          //SYMBOL_TABLE.add("IO", UnitType.CLASS);
          //SYMBOL_TABLE.add("Object", UnitType.CLASS);
          }
      label_1:
      while (true) {
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case CLASS:
          ;
          break;
        default:
          jj_la1[0] = jj_gen;
          break label_1;
        }
        classUnit = Class();
                       classUnitList.add(classUnit);
      }
   SYMBOL_TABLE.exitScope(MODE);
      jj_consume_token(0);
    jjtree.closeNodeScope(jjtn000, true);
    jjtc000 = false;
    jjtn000.setClasses(classUnitList);
    {if (true) return jjtn000;}
    } catch (Throwable jjte000) {
    if (jjtc000) {
      jjtree.clearNodeScope(jjtn000);
      jjtc000 = false;
    } else {
      jjtree.popNode();
    }
    if (jjte000 instanceof RuntimeException) {
      {if (true) throw (RuntimeException)jjte000;}
    }
    if (jjte000 instanceof ParseException) {
      {if (true) throw (ParseException)jjte000;}
    }
    {if (true) throw (Error)jjte000;}
    } finally {
    if (jjtc000) {
      jjtree.closeNodeScope(jjtn000, true);
    }
    }
    throw new Error("Missing return statement in function");
  }