final public Unit Ctor(ClassUnit classUnit) throws ParseException {
  MethodUnit methodUnit = new MethodUnit();
  Modifier modifier = null;
  List<Unit> formalArgs = null;
  Token t = null;
  String functionName = null;
  SimpleNode type = null;
  block_AST block = null;
    modifier = Modifier();
    functionName = ID();
    id_AST jjtn001 = new id_AST(JJTID_AST);
    boolean jjtc001 = true;
    jjtree.openNodeScope(jjtn001);
    try {
    jjtree.closeNodeScope(jjtn001, true);
    jjtc001 = false;
    type = jjtn001;
    } finally {
    if (jjtc001) {
      jjtree.closeNodeScope(jjtn001, true);
    }
    }
    jj_consume_token(LP);
    if (MODE == 0) {
       methodUnit = (MethodUnit)SYMBOL_TABLE.add(functionName,UnitType.METHOD);
       methodUnit.setName(functionName);
       methodUnit.setConstructor(true);
    } else {
      IntegerMuted intMuted = new IntegerMuted(-1);
      methodUnit = (MethodUnit)SYMBOL_TABLE.lookUp(functionName,UnitType.METHOD, intMuted);
    }
    type.typeObj.name = functionName;
    type.typeObj.isClass = true;
    methodUnit.setReturnType(type);
    methodUnit.classUnit = classUnit;
    methodUnit.setModifier(modifier);
    SYMBOL_TABLE.enterScopeForUnit(methodUnit,MODE);
    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
    case BOOLEAN:
    case CHAR:
    case INT:
    case ID:
      formalArgs = FormalArgs();
    if (MODE == 0) {
      methodUnit.setFormalArgs(formalArgs);
    }
      break;
    default:
      jj_la1[15] = jj_gen;
      ;
    }
    jj_consume_token(RP);
    block = Block();
    SYMBOL_TABLE.exitScope(MODE);
    methodUnit.setMethodBlock((block_AST)block);
   {if (true) return methodUnit;}
    throw new Error("Missing return statement in function");
  }