public static boolean expression_0(PsiBuilder b, int l, int g) {
    if (!recursion_guard_(b, l, "expression_0")) return false;
    boolean r = true;
    while (true) {
      Marker m = enter_section_(b, l, _LEFT_, null);
      if (g < 3 && consumeTokenSmart(b, MINUS_OP)) {
        r = expression(b, l, 3);
        exit_section_(b, l, m, MINUS_EXPRESSION, r, true, null);
      }
      else if (g < 1 && consumeTokenSmart(b, AND_OP)) {
        r = expression(b, l, 1);
        exit_section_(b, l, m, AND_EXPRESSION, r, true, null);
      }
      else if (g < 1 && consumeTokenSmart(b, OR_OP)) {
        r = expression(b, l, 1);
        exit_section_(b, l, m, OR_EXPRESSION, r, true, null);
      }
      else if (g < 2 && binaryConditionalOperator(b, l + 1)) {
        r = expression(b, l, 2);
        exit_section_(b, l, m, CONDITIONAL_EXPRESSION, r, true, null);
      }
      else if (g < 2 && regexExpression_0(b, l + 1)) {
        r = true;
        exit_section_(b, l, m, REGEX_EXPRESSION, r, true, null);
      }
      else if (g < 3 && consumeTokenSmart(b, PLUS_OP)) {
        r = expression(b, l, 3);
        exit_section_(b, l, m, PLUS_EXPRESSION, r, true, null);
      }
      else if (g < 4 && consumeTokenSmart(b, MULTIPLY_OP)) {
        r = expression(b, l, 4);
        exit_section_(b, l, m, MULTIPLY_EXPRESSION, r, true, null);
      }
      else if (g < 4 && consumeTokenSmart(b, DIVIDE_OP)) {
        r = expression(b, l, 4);
        exit_section_(b, l, m, DIVIDE_EXPRESSION, r, true, null);
      }
      else {
        exit_section_(b, l, m, null, false, false, null);
        break;
      }
    }
    return r;
  }
public static boolean expression_0(PsiBuilder b, int l, int g)