@Nullable
  private PsiBuilder.Marker parseExpression(final PsiBuilder builder, final ExprType type, final int mode) {
    switch (type) {
      case CONDITIONAL_OR:
        return parseBinary(builder, ExprType.CONDITIONAL_AND, CONDITIONAL_OR_OPS, mode);

      case CONDITIONAL_AND:
        return parseBinary(builder, ExprType.OR, CONDITIONAL_AND_OPS, mode);

      case OR:
        return parseBinary(builder, ExprType.XOR, OR_OPS, mode);

      case XOR:
        return parseBinary(builder, ExprType.AND, XOR_OPS, mode);

      case AND:
        return parseBinary(builder, ExprType.EQUALITY, AND_OPS, mode);

      case EQUALITY:
        return parseBinary(builder, ExprType.RELATIONAL, EQUALITY_OPS, mode);

      case RELATIONAL:
        return parseRelational(builder, mode);

      case SHIFT:
        return parseBinary(builder, ExprType.ADDITIVE, BasicExpressionParser.SHIFT_OPS, mode);

      case ADDITIVE:
        return parseBinary(builder, ExprType.MULTIPLICATIVE, BasicExpressionParser.ADDITIVE_OPS, mode);

      case MULTIPLICATIVE:
        return parseBinary(builder, ExprType.UNARY, BasicExpressionParser.MULTIPLICATIVE_OPS, mode);

      case UNARY:
        return parseUnary(builder, mode);

      case TYPE:
        return myParser.getReferenceParser().parseType(builder, BasicReferenceParser.EAT_LAST_DOT | BasicReferenceParser.WILDCARD);

      default:
        assert false : "Unexpected type: " + type;
        return null;
    }
  }
@Nullable
  private PsiBuilder.Marker parseExpression(final PsiBuilder builder, final ExprType type, final int mode)