return _factory.createMinus(expr);
token = parseToken();  if (token == '=') { token = parseToken();  if (token == '&') { return _factory.createMinus(expr.createAssignRef(this, parseBitOrExpr())); } else { _peekToken = token;  return _factory.createMinus(expr.createAssign(this, parseConditionalExpr())); }  } else { _peekToken = token;  return _factory.createMinus(expr); }
  private Expr parseTermBase()    throws IOException  {    int token = parseToken();    switch (token) {    case STRING:      return _factory.createString(_lexeme);          case SYSTEM_STRING:      {	ArrayList<Expr> args = new ArrayList<Expr>();	args.add(_factory.createString(_lexeme));	return _factory.createFunction(getLocation(), "shell_exec", args);      }          case SIMPLE_SYSTEM_STRING:      {	ArrayList<Expr> args = new ArrayList<Expr>();	args.add(parseEscapedString(_lexeme, SIMPLE_STRING_ESCAPE, true));	return _factory.createFunction(getLocation(), "shell_exec", args);      }    case COMPLEX_SYSTEM_STRING:      {	ArrayList<Expr> args = new ArrayList<Expr>();	args.add(parseEscapedString(_lexeme, COMPLEX_STRING_ESCAPE, true));	return _factory.createFunction(getLocation(), "shell_exec", args);      }          case SIMPLE_STRING_ESCAPE:    case COMPLEX_STRING_ESCAPE:      return parseEscapedString(_lexeme, token, false);    case BINARY:      {	// XXX: getBytes is incorrect	return _factory.createBinary(_lexeme.getBytes());      }    case SIMPLE_BINARY_ESCAPE:    case COMPLEX_BINARY_ESCAPE:      return parseEscapedString(_lexeme, token, false);    case LONG:      return _factory.createLiteral(LongValue.create(Long.parseLong(_lexeme)));          case DOUBLE:      return _factory.createLiteral(new DoubleValue(Double.parseDouble(_lexeme)));    case NULL:      return _factory.createNull();    case TRUE:      return _factory.createLiteral(BooleanValue.TRUE);    case FALSE:      return _factory.createLiteral(BooleanValue.FALSE);    case '$':      return parseVariable();      /* quercus/0211    case '&':      {	Expr expr = parseTerm();		return expr.createRef();      }      */    case '-':      {        Expr expr = parseTerm();        return _factory.createMinus(expr);      }    case '+':      {        Expr expr = parseTerm();        return _factory.createPlus(expr);      }    case '!':      {	// XXX: quercus/03i3 vs quercus/03i4	        Expr expr = parseTerm();	token = parseToken();	if (token == '=') {	  token = parseToken();	  // php/03i6	  if (token == '&') {	    return _factory.createNot(expr.createAssignRef(this, parseBitOrExpr()));	  }	  else {	    _peekToken = token;		    return _factory.createNot(expr.createAssign(this, parseConditionalExpr()));	  }	}	else {	  _peekToken = token;	  	  return _factory.createNot(expr);	}      }    case '~':      {        Expr expr = parseTerm();        return _factory.createBitNot(expr);      }    case '@':      {        Expr expr = parseTerm();	return _factory.createSuppress(expr);      }    case CLONE:      {        Expr expr = parseTerm();	return _factory.createClone(expr);      }    case INCR:      {        Expr expr = parseTerm();        return _factory.createPreIncrement(expr, 1);      }    case DECR:      {        Expr expr = parseTerm();        return _factory.createPreIncrement(expr, -1);      }    case NEW:      return parseNew();    case INCLUDE:      return _factory.createInclude(getLocation(), _sourceFile, parseExpr());    case REQUIRE:      return _factory.createRequire(getLocation(), _sourceFile, parseExpr());    case INCLUDE_ONCE:      return _factory.createIncludeOnce(getLocation(), _sourceFile, parseExpr());    case REQUIRE_ONCE:      return _factory.createRequireOnce(getLocation(), _sourceFile, parseExpr());    case LIST:      return parseList();    case PRINT:      return parsePrintExpr();          case EXIT:      return parseExit();          case DIE:      return parseDie();    case IDENTIFIER:      {        if (_lexeme.equals("new"))          return parseNew();        String className = null;        String name = _lexeme;	            token = parseToken();        _peekToken = token;        boolean isInstantiated = false;	    if (token == SCOPE) {	      _peekToken = -1;          className = name;          if (className.equals("self")) {            isInstantiated = true;            className = _quercusClass.getName();            if (className == null)              throw error(L.l("cannot access self when not in object scope"));          }          else if (className.equals("parent")) {            isInstantiated = true;            className = _quercusClass.getParentName();            if (className == null)              throw error(L.l("object does not have a parent class"));          }          token = parseToken();          if (token == '$')              return parseStaticClassField(className);	      else	        _peekToken = token;	  	      name = parseIdentifier();	      token = parseToken();	      _peekToken = token;	    }	          if (token == '(')          return parseFunction(className, name, isInstantiated);        else          return parseConstant(className, name);      }    case '(':      {	Expr expr = parseExpr();	expect(')');	if (expr instanceof ConstExpr) {	  String type = ((ConstExpr) expr).getVar();	  	  if ("bool".equals(type) || "boolean".equals(type))	    return _factory.createToBoolean(parseTerm());	  else if ("int".equals(type) || "integer".equals(type))	    return _factory.createToLong(parseTerm());	  else if ("float".equals(type)		   || "double".equals(type)		   || "real".equals(type))	    return _factory.createToDouble(parseTerm());	  else if ("string".equals(type))	    return _factory.createToString(parseTerm());	  else if ("binary".equals(type))	    return _factory.createToBinary(parseTerm());	  else if ("unicode".equals(type))	    return _factory.createToUnicode(parseTerm());	  else if ("object".equals(type))	    return _factory.createToObject(parseTerm());	  else if ("array".equalsIgnoreCase(type))	    return _factory.createToArray(parseTerm());	}	return expr;      }    default:      throw error(L.l("{0} is an unexpected token, expected an expression.",		      tokenName(token)));    }  }