expr = expr.createAssign(this, new MulExpr(expr, parseAssignExpr()));
if (expr.canRead()) expr = expr.createAssign(this, new MulExpr(expr.copy(), parseAssignExpr())); else expr = expr.createAssign(this, parseAssignExpr());
  private Expr parseAssignExpr()    throws IOException  {    Expr expr = parseConditionalExpr();    while (true) {      int token = parseToken();      switch (token) {      case '=':	token = parseToken();		try {	  if (token == '&')	    expr = expr.createAssignRef(this, parseAssignExpr());	  else {	    _peekToken = token;	    expr = expr.createAssign(this, parseAssignExpr());	  }	} catch (PhpParseException e) {	  throw e;	} catch (IOException e) {	  throw error(e.getMessage());	}	break;	      case PLUS_ASSIGN:        expr = expr.createAssign(this, new AddExpr(expr, parseAssignExpr()));	break;	      case MINUS_ASSIGN:        expr = expr.createAssign(this, new SubExpr(expr, parseAssignExpr()));	break;	      case APPEND_ASSIGN:        expr = expr.createAssign(this, AppendExpr.create(expr, parseAssignExpr()));	break;	      case MUL_ASSIGN:        expr = expr.createAssign(this, new MulExpr(expr, parseAssignExpr()));	break;	      case DIV_ASSIGN:        expr = expr.createAssign(this, new DivExpr(expr, parseAssignExpr()));	break;	      case MOD_ASSIGN:        expr = expr.createAssign(this, new ModExpr(expr, parseAssignExpr()));	break;	      case LSHIFT_ASSIGN:        expr = expr.createAssign(this, new LeftShiftExpr(expr, parseAssignExpr()));	break;	      case RSHIFT_ASSIGN:        expr = expr.createAssign(this, new RightShiftExpr(expr, parseAssignExpr()));	break;	      case AND_ASSIGN:        expr = expr.createAssign(this, new BitAndExpr(expr, parseAssignExpr()));	break;	      case OR_ASSIGN:        expr = expr.createAssign(this, new BitOrExpr(expr, parseAssignExpr()));	break;	      case XOR_ASSIGN:        expr = expr.createAssign(this, new BitXorExpr(expr, parseAssignExpr()));	break;	      default:	_peekToken = token;	return expr;      }    }  }