final public Unit Variable(FieldDetails fieldDetails) throws ParseException {
  VariableUnit variable;
  String variableName = null;
  binaryExpression_AST expr = null;
    variableName = ID();
    if (MODE == 0) {
            variable = (VariableUnit)SYMBOL_TABLE.add(variableName, UnitType.VARIABLE);
    } else {
        IntegerMuted intMuted = new IntegerMuted(-1);
        variable = (VariableUnit)SYMBOL_TABLE.lookUp(variableName, UnitType.VARIABLE, intMuted);
    }
    label_5:
    while (true) {
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case LSB:
        ;
        break;
      default:
        jj_la1[10] = jj_gen;
        break label_5;
      }
      jj_consume_token(LSB);
      jj_consume_token(RSB);
              variable.setArray(true);
    }
    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
    case ASSIGN:
      jj_consume_token(ASSIGN);
      expr = Expression();
      break;
    default:
      jj_la1[11] = jj_gen;
      ;
    }
    if (MODE == 1) {
            variable.setType(fieldDetails.getType());
            variable.setModifier(fieldDetails.getModifier());
            variable.setArray(fieldDetails.isArray);
            variable.setArraySize(fieldDetails.arraySize);
            variable.rhs = expr;
    }
    {if (true) return variable;}
    throw new Error("Missing return statement in function");
  }