boolean (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; }