// ---- ExternalRules.java -----------------
// This is a generated file. Not intended for manual editing.
package ;

import com.intellij.lang.PsiBuilder;
import com.intellij.lang.PsiBuilder.Marker;
import static generated.GeneratedTypes.*;
import static org.intellij.grammar.test.ParserUtil.*;
import com.intellij.psi.tree.IElementType;
import com.intellij.lang.ASTNode;
import com.intellij.psi.tree.TokenSet;
import com.intellij.lang.PsiParser;
import com.intellij.lang.LightPsiParser;

@SuppressWarnings({"SimplifiableIfStatement", "UnusedAssignment"})
public class ExternalRules implements PsiParser, LightPsiParser {

  public ASTNode parse(IElementType root_, PsiBuilder builder_) {
    parseLight(root_, builder_);
    return builder_.getTreeBuilt();
  }

  public void parseLight(IElementType root_, PsiBuilder builder_) {
    boolean result_;
    builder_ = adapt_builder_(root_, builder_, this, EXTENDS_SETS_);
    Marker marker_ = enter_section_(builder_, 0, _COLLAPSE_, null);
    result_ = parse_root_(root_, builder_);
    exit_section_(builder_, 0, marker_, root_, result_, true, TRUE_CONDITION);
  }

  protected boolean parse_root_(IElementType root_, PsiBuilder builder_) {
    return parse_root_(root_, builder_, 0);
  }

  static boolean parse_root_(IElementType root_, PsiBuilder builder_, int level_) {
    boolean result_;
    if (root_ == EXTRA_ROOT) {
      result_ = ExternalRules2.extra_root(builder_, level_ + 1);
    }
    else {
      result_ = root(builder_, level_ + 1);
    }
    return result_;
  }

  public static final TokenSet[] EXTENDS_SETS_ = new TokenSet[] {
    create_token_set_(COLLAPSE_ONE, COLLAPSE_TWO),
  };

  /* ********************************************************** */
  // <<uniqueListOf one>>
  public static boolean collapse_one(PsiBuilder builder_, int level_) {
    if (!recursion_guard_(builder_, level_, "collapse_one")) return false;
    boolean result_;
    Marker marker_ = enter_section_(builder_, level_, _COLLAPSE_, COLLAPSE_ONE, "<collapse one>");
    result_ = uniqueListOf(builder_, level_ + 1, ExternalRules::one);
    exit_section_(builder_, level_, marker_, result_, false, null);
    return result_;
  }

  /* ********************************************************** */
  public static boolean collapse_two(PsiBuilder builder_, int level_) {
    Marker marker_ = enter_section_(builder_);
    exit_section_(builder_, marker_, COLLAPSE_TWO, true);
    return true;
  }

  /* ********************************************************** */
  static Parser comma_list_$(Parser param) {
    return (builder_, level_) -> comma_list(builder_, level_ + 1, param);
  }

  // <<param>> (',' <<param>>) *
  public static boolean comma_list(PsiBuilder builder_, int level_, Parser param) {
    if (!recursion_guard_(builder_, level_, "comma_list")) return false;
    boolean result_;
    Marker marker_ = enter_section_(builder_);
    result_ = param.parse(builder_, level_);
    result_ = result_ && comma_list_1(builder_, level_ + 1, param);
    exit_section_(builder_, marker_, COMMA_LIST, result_);
    return result_;
  }

  // (',' <<param>>) *
  private static boolean comma_list_1(PsiBuilder builder_, int level_, Parser param) {
    if (!recursion_guard_(builder_, level_, "comma_list_1")) return false;
    while (true) {
      int pos_ = current_position_(builder_);
      if (!comma_list_1_0(builder_, level_ + 1, param)) break;
      if (!empty_element_parsed_guard_(builder_, "comma_list_1", pos_)) break;
    }
    return true;
  }

  // ',' <<param>>
  private static boolean comma_list_1_0(PsiBuilder builder_, int level_, Parser param) {
    if (!recursion_guard_(builder_, level_, "comma_list_1_0")) return false;
    boolean result_;
    Marker marker_ = enter_section_(builder_);
    result_ = consumeToken(builder_, COMMA);
    result_ = result_ && param.parse(builder_, level_);
    exit_section_(builder_, marker_, null, result_);
    return result_;
  }

  /* ********************************************************** */
  static Parser comma_list_pinned_$(Parser head, Parser param) {
    return (builder_, level_) -> comma_list_pinned(builder_, level_ + 1, head, param);
  }

  // <<head>> <<param>> (<<comma_list_tail <<param>>>>) *
  public static boolean comma_list_pinned(PsiBuilder builder_, int level_, Parser head, Parser param) {
    if (!recursion_guard_(builder_, level_, "comma_list_pinned")) return false;
    boolean result_;
    Marker marker_ = enter_section_(builder_);
    result_ = head.parse(builder_, level_);
    result_ = result_ && param.parse(builder_, level_);
    result_ = result_ && comma_list_pinned_2(builder_, level_ + 1, param);
    exit_section_(builder_, marker_, COMMA_LIST_PINNED, result_);
    return result_;
  }

  // (<<comma_list_tail <<param>>>>) *
  private static boolean comma_list_pinned_2(PsiBuilder builder_, int level_, Parser param) {
    if (!recursion_guard_(builder_, level_, "comma_list_pinned_2")) return false;
    while (true) {
      int pos_ = current_position_(builder_);
      if (!comma_list_pinned_2_0(builder_, level_ + 1, param)) break;
      if (!empty_element_parsed_guard_(builder_, "comma_list_pinned_2", pos_)) break;
    }
    return true;
  }

  // <<comma_list_tail <<param>>>>
  private static boolean comma_list_pinned_2_0(PsiBuilder builder_, int level_, Parser param) {
    return comma_list_tail(builder_, level_ + 1, param);
  }

  /* ********************************************************** */
  // ',' <<param>>
  public static boolean comma_list_tail(PsiBuilder builder_, int level_, Parser param) {
    if (!recursion_guard_(builder_, level_, "comma_list_tail")) return false;
    if (!nextTokenIs(builder_, COMMA)) return false;
    boolean result_, pinned_;
    Marker marker_ = enter_section_(builder_, level_, _NONE_, COMMA_LIST_TAIL, null);
    result_ = consumeToken(builder_, COMMA);
    pinned_ = result_; // pin = 1
    result_ = result_ && param.parse(builder_, level_);
    exit_section_(builder_, level_, marker_, result_, pinned_, null);
    return result_ || pinned_;
  }

  /* ********************************************************** */
  // '(' <<param>> (',' <<param>>) * ')'
  static boolean comma_paren_list(PsiBuilder builder_, int level_, Parser param) {
    if (!recursion_guard_(builder_, level_, "comma_paren_list")) return false;
    if (!nextTokenIs(builder_, PAREN1)) return false;
    boolean result_, pinned_;
    Marker marker_ = enter_section_(builder_, level_, _NONE_);
    result_ = consumeToken(builder_, PAREN1);
    pinned_ = result_; // pin = 1
    result_ = result_ && report_error_(builder_, param.parse(builder_, level_));
    result_ = pinned_ && report_error_(builder_, comma_paren_list_2(builder_, level_ + 1, param)) && result_;
    result_ = pinned_ && consumeToken(builder_, PAREN2) && result_;
    exit_section_(builder_, level_, marker_, result_, pinned_, null);
    return result_ || pinned_;
  }

  // (',' <<param>>) *
  private static boolean comma_paren_list_2(PsiBuilder builder_, int level_, Parser param) {
    if (!recursion_guard_(builder_, level_, "comma_paren_list_2")) return false;
    while (true) {
      int pos_ = current_position_(builder_);
      if (!comma_paren_list_2_0(builder_, level_ + 1, param)) break;
      if (!empty_element_parsed_guard_(builder_, "comma_paren_list_2", pos_)) break;
    }
    return true;
  }

  // ',' <<param>>
  private static boolean comma_paren_list_2_0(PsiBuilder builder_, int level_, Parser param) {
    if (!recursion_guard_(builder_, level_, "comma_paren_list_2_0")) return false;
    boolean result_;
    Marker marker_ = enter_section_(builder_);
    result_ = consumeToken(builder_, COMMA);
    result_ = result_ && param.parse(builder_, level_);
    exit_section_(builder_, marker_, null, result_);
    return result_;
  }

  /* ********************************************************** */
  // empty_external
  static boolean empty_external_usage(PsiBuilder builder_, int level_) {
    return null(builder_, level_ + 1);
  }

  /* ********************************************************** */
  // <<>>
  static boolean empty_external_usage2(PsiBuilder builder_, int level_) {
    return true;
  }

  /* ********************************************************** */
  // !(',' | ';' | ')')
  static boolean item_recover(PsiBuilder builder_, int level_) {
    if (!recursion_guard_(builder_, level_, "item_recover")) return false;
    boolean result_;
    Marker marker_ = enter_section_(builder_, level_, _NOT_);
    result_ = !item_recover_0(builder_, level_ + 1);
    exit_section_(builder_, level_, marker_, result_, false, null);
    return result_;
  }

  // ',' | ';' | ')'
  private static boolean item_recover_0(PsiBuilder builder_, int level_) {
    if (!recursion_guard_(builder_, level_, "item_recover_0")) return false;
    boolean result_;
    result_ = consumeToken(builder_, COMMA);
    if (!result_) result_ = consumeToken(builder_, ";");
    if (!result_) result_ = consumeToken(builder_, PAREN2);
    return result_;
  }

  /* ********************************************************** */
  // <<head>> <<comma_list <<param>>>> (<<comma_list_tail <<comma_list <<param>>>>>>) *
  public static boolean list_of_lists(PsiBuilder builder_, int level_, Parser head, Parser param) {
    if (!recursion_guard_(builder_, level_, "list_of_lists")) return false;
    boolean result_;
    Marker marker_ = enter_section_(builder_);
    result_ = head.parse(builder_, level_);
    result_ = result_ && comma_list(builder_, level_ + 1, param);
    result_ = result_ && list_of_lists_2(builder_, level_ + 1, param);
    exit_section_(builder_, marker_, LIST_OF_LISTS, result_);
    return result_;
  }

  // (<<comma_list_tail <<comma_list <<param>>>>>>) *
  private static boolean list_of_lists_2(PsiBuilder builder_, int level_, Parser param) {
    if (!recursion_guard_(builder_, level_, "list_of_lists_2")) return false;
    while (true) {
      int pos_ = current_position_(builder_);
      if (!list_of_lists_2_0(builder_, level_ + 1, param)) break;
      if (!empty_element_parsed_guard_(builder_, "list_of_lists_2", pos_)) break;
    }
    return true;
  }

  // <<comma_list_tail <<comma_list <<param>>>>>>
  private static boolean list_of_lists_2_0(PsiBuilder builder_, int level_, Parser param) {
    return comma_list_tail(builder_, level_ + 1, comma_list_$(param));
  }

  /* ********************************************************** */
  static Parser main_class_meta_$(Parser p) {
    return (builder_, level_) -> main_class_meta(builder_, level_ + 1, p);
  }

  // <<p>>
  static boolean main_class_meta(PsiBuilder builder_, int level_, Parser p) {
    return p.parse(builder_, level_);
  }

  /* ********************************************************** */
  // <<listOf "1+2" '1+2' <<param>>>>
  static boolean meta_mixed(PsiBuilder builder_, int level_, Parser param) {
    return listOf(builder_, level_ + 1, "1+2", 1+2, param);
  }

  /* ********************************************************** */
  // <<meta_mixed <<comma_list one>>>>
  static boolean meta_mixed_list(PsiBuilder builder_, int level_) {
    return meta_mixed(builder_, level_ + 1, meta_mixed_list_0_0_parser_);
  }

  /* ********************************************************** */
  // <<meta_mixed (<<comma_list one>>)>>
  static boolean meta_mixed_list_paren(PsiBuilder builder_, int level_) {
    return meta_mixed(builder_, level_ + 1, ExternalRules::meta_mixed_list_paren_0_0);
  }

  // <<comma_list one>>
  private static boolean meta_mixed_list_paren_0_0(PsiBuilder builder_, int level_) {
    return comma_list(builder_, level_ + 1, ExternalRules::one);
  }

  /* ********************************************************** */
  // <<meta_mixed statement>>
  static boolean meta_mixed_simple(PsiBuilder builder_, int level_) {
    return meta_mixed(builder_, level_ + 1, ExternalRules::statement);
  }

  /* ********************************************************** */
  // <<comma_list <<comma_list <<comma_list <<comma_list <<comma_list <<param>>>>>>>>>>>>
  public static boolean meta_multi_level(PsiBuilder builder_, int level_, Parser param) {
    if (!recursion_guard_(builder_, level_, "meta_multi_level")) return false;
    boolean result_;
    Marker marker_ = enter_section_(builder_);
    result_ = comma_list(builder_, level_ + 1, comma_list_$(comma_list_$(comma_list_$(comma_list_$(param)))));
    exit_section_(builder_, marker_, META_MULTI_LEVEL, result_);
    return result_;
  }

  /* ********************************************************** */
  // <<comma_list <<comma_list <<comma_list some>>>>>>
  static boolean meta_multi_level_no_closure(PsiBuilder builder_, int level_) {
    return comma_list(builder_, level_ + 1, meta_multi_level_no_closure_0_0_parser_);
  }

  /* ********************************************************** */
  // <<comma_list <<comma_list_pinned <<head>> <<comma_list <<comma_list <<comma_list <<param>>>>>>>>>>>>
  public static boolean meta_multi_level_pinned(PsiBuilder builder_, int level_, Parser head, Parser param) {
    if (!recursion_guard_(builder_, level_, "meta_multi_level_pinned")) return false;
    boolean result_;
    Marker marker_ = enter_section_(builder_);
    result_ = comma_list(builder_, level_ + 1, comma_list_pinned_$(head, comma_list_$(comma_list_$(comma_list_$(param)))));
    exit_section_(builder_, marker_, META_MULTI_LEVEL_PINNED, result_);
    return result_;
  }

  /* ********************************************************** */
  // <<comma_list <<comma_list_pinned <<head>> (<<comma_list <<comma_list <<comma_list <<param>>>>>>>>)>>>>
  public static boolean meta_multi_level_pinned_paren(PsiBuilder builder_, int level_, Parser head, Parser param) {
    if (!recursion_guard_(builder_, level_, "meta_multi_level_pinned_paren")) return false;
    boolean result_;
    Marker marker_ = enter_section_(builder_);
    result_ = comma_list(builder_, level_ + 1, comma_list_pinned_$(head, meta_multi_level_pinned_paren_0_0_1_$(param)));
    exit_section_(builder_, marker_, META_MULTI_LEVEL_PINNED_PAREN, result_);
    return result_;
  }

  private static Parser meta_multi_level_pinned_paren_0_0_1_$(Parser param) {
    return (builder_, level_) -> meta_multi_level_pinned_paren_0_0_1(builder_, level_ + 1, param);
  }

  // <<comma_list <<comma_list <<comma_list <<param>>>>>>>>
  private static boolean meta_multi_level_pinned_paren_0_0_1(PsiBuilder builder_, int level_, Parser param) {
    return comma_list(builder_, level_ + 1, comma_list_$(comma_list_$(param)));
  }

  /* ********************************************************** */
  // <<comma_list_pinned one (one | two)>>
  static boolean meta_seq(PsiBuilder builder_, int level_) {
    return comma_list_pinned(builder_, level_ + 1, ExternalRules::one, ExternalRules::meta_seq_0_1);
  }

  // one | two
  private static boolean meta_seq_0_1(PsiBuilder builder_, int level_) {
    if (!recursion_guard_(builder_, level_, "meta_seq_0_1")) return false;
    boolean result_;
    result_ = one(builder_, level_ + 1);
    if (!result_) result_ = two(builder_, level_ + 1);
    return result_;
  }

  /* ********************************************************** */
  // <<list_of_lists one (one | two)>>
  static boolean meta_seq_of_lists(PsiBuilder builder_, int level_) {
    return list_of_lists(builder_, level_ + 1, ExternalRules::one, ExternalRules::meta_seq_of_lists_0_1);
  }

  // one | two
  private static boolean meta_seq_of_lists_0_1(PsiBuilder builder_, int level_) {
    if (!recursion_guard_(builder_, level_, "meta_seq_of_lists_0_1")) return false;
    boolean result_;
    result_ = one(builder_, level_ + 1);
    if (!result_) result_ = two(builder_, level_ + 1);
    return result_;
  }

  /* ********************************************************** */
  // (<<list_of_lists one (one | two)>>)?
  static boolean meta_seq_of_lists_opt(PsiBuilder builder_, int level_) {
    if (!recursion_guard_(builder_, level_, "meta_seq_of_lists_opt")) return false;
    meta_seq_of_lists_opt_0(builder_, level_ + 1);
    return true;
  }

  // <<list_of_lists one (one | two)>>
  private static boolean meta_seq_of_lists_opt_0(PsiBuilder builder_, int level_) {
    return list_of_lists(builder_, level_ + 1, ExternalRules::one, ExternalRules::meta_seq_of_lists_opt_0_0_1);
  }

  // one | two
  private static boolean meta_seq_of_lists_opt_0_0_1(PsiBuilder builder_, int level_) {
    if (!recursion_guard_(builder_, level_, "meta_seq_of_lists_opt_0_0_1")) return false;
    boolean result_;
    result_ = one(builder_, level_ + 1);
    if (!result_) result_ = two(builder_, level_ + 1);
    return result_;
  }

  /* ********************************************************** */
  // <<comma_list one>>
  static boolean meta_simple(PsiBuilder builder_, int level_) {
    return comma_list(builder_, level_ + 1, ExternalRules::one);
  }

  /* ********************************************************** */
  // <<comma_list (<<param>> | some)>>
  public static boolean meta_with_in_place(PsiBuilder builder_, int level_, Parser param) {
    if (!recursion_guard_(builder_, level_, "meta_with_in_place")) return false;
    boolean result_;
    Marker marker_ = enter_section_(builder_);
    result_ = comma_list(builder_, level_ + 1, meta_with_in_place_0_0_$(param));
    exit_section_(builder_, marker_, META_WITH_IN_PLACE, result_);
    return result_;
  }

  private static Parser meta_with_in_place_0_0_$(Parser param) {
    return (builder_, level_) -> meta_with_in_place_0_0(builder_, level_ + 1, param);
  }

  // <<param>> | some
  private static boolean meta_with_in_place_0_0(PsiBuilder builder_, int level_, Parser param) {
    if (!recursion_guard_(builder_, level_, "meta_with_in_place_0_0")) return false;
    boolean result_;
    Marker marker_ = enter_section_(builder_);
    result_ = param.parse(builder_, level_);
    if (!result_) result_ = consumeToken(builder_, SOME);
    exit_section_(builder_, marker_, null, result_);
    return result_;
  }

  /* ********************************************************** */
  // <<meta_multi_level one>>
  static boolean multi_level(PsiBuilder builder_, int level_) {
    return meta_multi_level(builder_, level_ + 1, ExternalRules::one);
  }

  /* ********************************************************** */
  // <<two_params_meta <<nested1>> <<two_params_meta <<nested2>> <<nested3>>>>>>
  static boolean nested_meta(PsiBuilder builder_, int level_, Parser nested1, Parser nested2, Parser nested3) {
    return two_params_meta(builder_, level_ + 1, nested1, two_params_meta_$(nested2, nested3));
  }

  /* ********************************************************** */
  // <<two_params_meta (<<two_params_meta '%' <<c>>>>) perc_re>>
  static boolean nested_mixed(PsiBuilder builder_, int level_, Parser c) {
    return two_params_meta(builder_, level_ + 1, nested_mixed_0_0_$(c), PERC_RE_parser_);
  }

  private static Parser nested_mixed_0_0_$(Parser c) {
    return (builder_, level_) -> nested_mixed_0_0(builder_, level_ + 1, c);
  }

  // <<two_params_meta '%' <<c>>>>
  private static boolean nested_mixed_0_0(PsiBuilder builder_, int level_, Parser c) {
    return two_params_meta(builder_, level_ + 1, perc_parser_, c);
  }

  /* ********************************************************** */
  // 'one'
  public static boolean one(PsiBuilder builder_, int level_) {
    if (!recursion_guard_(builder_, level_, "one")) return false;
    boolean result_;
    Marker marker_ = enter_section_(builder_, level_, _NONE_, ONE, "<one>");
    result_ = consumeToken(builder_, "one");
    exit_section_(builder_, level_, marker_, result_, false, null);
    return result_;
  }

  /* ********************************************************** */
  // '{' <<uniqueListOf (one | two | 10 | some)>> '}'
  static boolean param_choice(PsiBuilder builder_, int level_) {
    if (!recursion_guard_(builder_, level_, "param_choice")) return false;
    boolean result_;
    Marker marker_ = enter_section_(builder_);
    result_ = consumeToken(builder_, "{");
    result_ = result_ && uniqueListOf(builder_, level_ + 1, ExternalRules::param_choice_1_0);
    result_ = result_ && consumeToken(builder_, "}");
    exit_section_(builder_, marker_, null, result_);
    return result_;
  }

  // one | two | 10 | some
  private static boolean param_choice_1_0(PsiBuilder builder_, int level_) {
    if (!recursion_guard_(builder_, level_, "param_choice_1_0")) return false;
    boolean result_;
    Marker marker_ = enter_section_(builder_);
    result_ = one(builder_, level_ + 1);
    if (!result_) result_ = two(builder_, level_ + 1);
    if (!result_) result_ = consumeToken(builder_, "10");
    if (!result_) result_ = consumeToken(builder_, SOME);
    exit_section_(builder_, marker_, null, result_);
    return result_;
  }

  /* ********************************************************** */
  // '{' <<uniqueListOf {one | two | 10 | some}>> '}'
  static boolean param_choice_alt(PsiBuilder builder_, int level_) {
    if (!recursion_guard_(builder_, level_, "param_choice_alt")) return false;
    boolean result_;
    Marker marker_ = enter_section_(builder_);
    result_ = consumeToken(builder_, "{");
    result_ = result_ && uniqueListOf(builder_, level_ + 1, ExternalRules::param_choice_alt_1_0);
    result_ = result_ && consumeToken(builder_, "}");
    exit_section_(builder_, marker_, null, result_);
    return result_;
  }

  // one | two | 10 | some
  private static boolean param_choice_alt_1_0(PsiBuilder builder_, int level_) {
    if (!recursion_guard_(builder_, level_, "param_choice_alt_1_0")) return false;
    boolean result_;
    Marker marker_ = enter_section_(builder_);
    result_ = one(builder_, level_ + 1);
    if (!result_) result_ = two(builder_, level_ + 1);
    if (!result_) result_ = consumeToken(builder_, "10");
    if (!result_) result_ = consumeToken(builder_, SOME);
    exit_section_(builder_, marker_, null, result_);
    return result_;
  }

  /* ********************************************************** */
  // '{' <<uniqueListOf [one | two | 10 | some]>> '}'
  static boolean param_opt(PsiBuilder builder_, int level_) {
    if (!recursion_guard_(builder_, level_, "param_opt")) return false;
    boolean result_;
    Marker marker_ = enter_section_(builder_);
    result_ = consumeToken(builder_, "{");
    result_ = result_ && uniqueListOf(builder_, level_ + 1, ExternalRules::param_opt_1_0);
    result_ = result_ && consumeToken(builder_, "}");
    exit_section_(builder_, marker_, null, result_);
    return result_;
  }

  // [one | two | 10 | some]
  private static boolean param_opt_1_0(PsiBuilder builder_, int level_) {
    if (!recursion_guard_(builder_, level_, "param_opt_1_0")) return false;
    param_opt_1_0_0(builder_, level_ + 1);
    return true;
  }

  // one | two | 10 | some
  private static boolean param_opt_1_0_0(PsiBuilder builder_, int level_) {
    if (!recursion_guard_(builder_, level_, "param_opt_1_0_0")) return false;
    boolean result_;
    Marker marker_ = enter_section_(builder_);
    result_ = one(builder_, level_ + 1);
    if (!result_) result_ = two(builder_, level_ + 1);
    if (!result_) result_ = consumeToken(builder_, "10");
    if (!result_) result_ = consumeToken(builder_, SOME);
    exit_section_(builder_, marker_, null, result_);
    return result_;
  }

  /* ********************************************************** */
  // '{' <<uniqueListOf "1+1" '1+1' one two 10 some>> '}'
  static boolean param_seq(PsiBuilder builder_, int level_) {
    if (!recursion_guard_(builder_, level_, "param_seq")) return false;
    boolean result_;
    Marker marker_ = enter_section_(builder_);
    result_ = consumeToken(builder_, "{");
    result_ = result_ && uniqueListOf(builder_, level_ + 1, "1+1", 1+1, ExternalRules::one, ExternalRules::two, 10, SOME_parser_);
    result_ = result_ && consumeToken(builder_, "}");
    exit_section_(builder_, marker_, null, result_);
    return result_;
  }

  /* ********************************************************** */
  // '{' <<uniqueListOf {one | two} [10 | some]>> '}'
  static boolean param_seq_alt(PsiBuilder builder_, int level_) {
    if (!recursion_guard_(builder_, level_, "param_seq_alt")) return false;
    boolean result_;
    Marker marker_ = enter_section_(builder_);
    result_ = consumeToken(builder_, "{");
    result_ = result_ && uniqueListOf(builder_, level_ + 1, ExternalRules::param_seq_alt_1_0, ExternalRules::param_seq_alt_1_1);
    result_ = result_ && consumeToken(builder_, "}");
    exit_section_(builder_, marker_, null, result_);
    return result_;
  }

  // one | two
  private static boolean param_seq_alt_1_0(PsiBuilder builder_, int level_) {
    if (!recursion_guard_(builder_, level_, "param_seq_alt_1_0")) return false;
    boolean result_;
    result_ = one(builder_, level_ + 1);
    if (!result_) result_ = two(builder_, level_ + 1);
    return result_;
  }

  // [10 | some]
  private static boolean param_seq_alt_1_1(PsiBuilder builder_, int level_) {
    if (!recursion_guard_(builder_, level_, "param_seq_alt_1_1")) return false;
    param_seq_alt_1_1_0(builder_, level_ + 1);
    return true;
  }

  // 10 | some
  private static boolean param_seq_alt_1_1_0(PsiBuilder builder_, int level_) {
    if (!recursion_guard_(builder_, level_, "param_seq_alt_1_1_0")) return false;
    boolean result_;
    Marker marker_ = enter_section_(builder_);
    result_ = consumeToken(builder_, "10");
    if (!result_) result_ = consumeToken(builder_, SOME);
    exit_section_(builder_, marker_, null, result_);
    return result_;
  }

  /* ********************************************************** */
  // '{' <<unique_list_of one two>> '}'
  static boolean param_seq_alt_ext(PsiBuilder builder_, int level_) {
    if (!recursion_guard_(builder_, level_, "param_seq_alt_ext")) return false;
    boolean result_;
    Marker marker_ = enter_section_(builder_);
    result_ = consumeToken(builder_, "{");
    result_ = result_ && uniqueListOf(builder_, level_ + 1, ExternalRules::one, ExternalRules::two);
    result_ = result_ && consumeToken(builder_, "}");
    exit_section_(builder_, marker_, null, result_);
    return result_;
  }

  /* ********************************************************** */
  // '{' <<unique_list_of_params one !two>> '}'
  static boolean param_seq_alt_params_ext(PsiBuilder builder_, int level_) {
    if (!recursion_guard_(builder_, level_, "param_seq_alt_params_ext")) return false;
    boolean result_;
    Marker marker_ = enter_section_(builder_);
    result_ = consumeToken(builder_, "{");
    result_ = result_ && uniqueListOf(builder_, level_ + 1, ExternalRules::one, "1+1", ExternalRules::param_seq_alt_params_ext_1_1, 1+1);
    result_ = result_ && consumeToken(builder_, "}");
    exit_section_(builder_, marker_, null, result_);
    return result_;
  }

  // !two
  private static boolean param_seq_alt_params_ext_1_1(PsiBuilder builder_, int level_) {
    if (!recursion_guard_(builder_, level_, "param_seq_alt_params_ext_1_1")) return false;
    boolean result_;
    Marker marker_ = enter_section_(builder_, level_, _NOT_);
    result_ = !two(builder_, level_ + 1);
    exit_section_(builder_, level_, marker_, result_, false, null);
    return result_;
  }

  /* ********************************************************** */
  // <<listOf '%'>>
  static boolean perc_list(PsiBuilder builder_, int level_) {
    return listOf(builder_, level_ + 1, perc_parser_);
  }

  /* ********************************************************** */
  // <<listOf perc_re>>
  static boolean perc_re_list1(PsiBuilder builder_, int level_) {
    return listOf(builder_, level_ + 1, PERC_RE_parser_);
  }

  /* ********************************************************** */
  // <<listOf (perc_re)>>
  static boolean perc_re_list2(PsiBuilder builder_, int level_) {
    return listOf(builder_, level_ + 1, perc_re_list2_0_0_parser_);
  }

  /* ********************************************************** */
  // <<comma_paren_list (ref | '(' one ')')>>
  public static boolean public_paren_list(PsiBuilder builder_, int level_) {
    if (!recursion_guard_(builder_, level_, "public_paren_list")) return false;
    if (!nextTokenIs(builder_, PAREN1)) return false;
    boolean result_;
    Marker marker_ = enter_section_(builder_);
    result_ = comma_paren_list(builder_, level_ + 1, ExternalRules::public_paren_list_0_0);
    exit_section_(builder_, marker_, PUBLIC_PAREN_LIST, result_);
    return result_;
  }

  // ref | '(' one ')'
  private static boolean public_paren_list_0_0(PsiBuilder builder_, int level_) {
    if (!recursion_guard_(builder_, level_, "public_paren_list_0_0")) return false;
    boolean result_;
    Marker marker_ = enter_section_(builder_);
    result_ = parseRef(builder_, level_ + 1);
    if (!result_) result_ = public_paren_list_0_0_1(builder_, level_ + 1);
    exit_section_(builder_, marker_, null, result_);
    return result_;
  }

  // '(' one ')'
  private static boolean public_paren_list_0_0_1(PsiBuilder builder_, int level_) {
    if (!recursion_guard_(builder_, level_, "public_paren_list_0_0_1")) return false;
    boolean result_;
    Marker marker_ = enter_section_(builder_);
    result_ = consumeToken(builder_, PAREN1);
    result_ = result_ && one(builder_, level_ + 1);
    result_ = result_ && consumeToken(builder_, PAREN2);
    exit_section_(builder_, marker_, null, result_);
    return result_;
  }

  /* ********************************************************** */
  public static boolean public_paren_list2(PsiBuilder builder_, int level_) {
    Marker marker_ = enter_section_(builder_);
    exit_section_(builder_, marker_, PUBLIC_PAREN_LIST, true);
    return true;
  }

  /* ********************************************************** */
  // <<param>>
  static boolean recoverable_item(PsiBuilder builder_, int level_, Parser param) {
    if (!recursion_guard_(builder_, level_, "recoverable_item")) return false;
    boolean result_;
    Marker marker_ = enter_section_(builder_, level_, _NONE_);
    result_ = param.parse(builder_, level_);
    exit_section_(builder_, level_, marker_, result_, false, ExternalRules::item_recover);
    return result_;
  }

  /* ********************************************************** */
  // <<param>>
  static boolean recoverable_item2(PsiBuilder builder_, int level_, Parser param, Parser recover_arg) {
    if (!recursion_guard_(builder_, level_, "recoverable_item2")) return false;
    boolean result_;
    Marker marker_ = enter_section_(builder_, level_, _NONE_);
    result_ = param.parse(builder_, level_);
    exit_section_(builder_, level_, marker_, result_, false, recover_arg);
    return result_;
  }

  /* ********************************************************** */
  // <<recover_arg>> <<param>>
  static boolean recoverable_item3(PsiBuilder builder_, int level_, Parser recover_arg, Parser param) {
    if (!recursion_guard_(builder_, level_, "recoverable_item3")) return false;
    boolean result_, pinned_;
    Marker marker_ = enter_section_(builder_, level_, _NONE_);
    result_ = recover_arg.parse(builder_, level_);
    pinned_ = result_; // pin = 1
    result_ = result_ && param.parse(builder_, level_);
    exit_section_(builder_, level_, marker_, result_, pinned_, recover_arg);
    return result_ || pinned_;
  }

  /* ********************************************************** */
  // <<listOf statement>>
  static boolean root(PsiBuilder builder_, int level_) {
    return listOf(builder_, level_ + 1, ExternalRules::statement);
  }

  /* ********************************************************** */
  // <<comma_list <<second_class_meta some>>>>
  static boolean second_class_meta_usage_from_main(PsiBuilder builder_, int level_) {
    return comma_list(builder_, level_ + 1, second_class_meta_usage_from_main_0_0_parser_);
  }

  /* ********************************************************** */
  // one | two
  public static boolean statement(PsiBuilder builder_, int level_) {
    if (!recursion_guard_(builder_, level_, "statement")) return false;
    boolean result_;
    Marker marker_ = enter_section_(builder_, level_, _NONE_, STATEMENT, "<statement>");
    result_ = one(builder_, level_ + 1);
    if (!result_) result_ = two(builder_, level_ + 1);
    exit_section_(builder_, level_, marker_, result_, false, null);
    return result_;
  }

  /* ********************************************************** */
  // 'two'
  public static boolean two(PsiBuilder builder_, int level_) {
    if (!recursion_guard_(builder_, level_, "two")) return false;
    boolean result_;
    Marker marker_ = enter_section_(builder_, level_, _NONE_, TWO, "<two>");
    result_ = consumeToken(builder_, "two");
    exit_section_(builder_, level_, marker_, result_, false, null);
    return result_;
  }

  /* ********************************************************** */
  static Parser two_params_meta_$(Parser a, Parser b) {
    return (builder_, level_) -> two_params_meta(builder_, level_ + 1, a, b);
  }

  // <<a>> <<b>>
  public static boolean two_params_meta(PsiBuilder builder_, int level_, Parser a, Parser b) {
    if (!recursion_guard_(builder_, level_, "two_params_meta")) return false;
    boolean result_;
    Marker marker_ = enter_section_(builder_);
    result_ = a.parse(builder_, level_);
    result_ = result_ && b.parse(builder_, level_);
    exit_section_(builder_, marker_, TWO_PARAMS_META, result_);
    return result_;
  }

  static final Parser PERC_RE_parser_ = (builder_, level_) -> consumeToken(builder_, PERC_RE);
  static final Parser SOME_parser_ = (builder_, level_) -> consumeToken(builder_, SOME);
  static final Parser perc_parser_ = (builder_, level_) -> consumeToken(builder_, PERC);
  static final Parser perc_re_list2_0_0_parser_ = PERC_RE_parser_;

  private static final Parser meta_mixed_list_0_0_parser_ = comma_list_$(ExternalRules::one);
  private static final Parser meta_multi_level_no_closure_0_0_0_parser_ = comma_list_$(SOME_parser_);
  private static final Parser meta_multi_level_no_closure_0_0_parser_ = comma_list_$(meta_multi_level_no_closure_0_0_0_parser_);
  private static final Parser second_class_meta_usage_from_main_0_0_parser_ = ExternalRules2.second_class_meta_$(SOME_parser_);
}
// ---- ExternalRules2.java -----------------
// This is a generated file. Not intended for manual editing.
package ;

import com.intellij.lang.PsiBuilder;
import com.intellij.lang.PsiBuilder.Marker;
import static generated.GeneratedTypes.*;
import static org.intellij.grammar.test.ParserUtil.*;
import static ExternalRules.*;

@SuppressWarnings({"SimplifiableIfStatement", "UnusedAssignment"})
public class ExternalRules2 {

  /* ********************************************************** */
  public static boolean extra_root(PsiBuilder builder_, int level_) {
    Marker marker_ = enter_section_(builder_);
    exit_section_(builder_, marker_, EXTRA_ROOT, true);
    return true;
  }

  /* ********************************************************** */
  // <<comma_list <<main_class_meta some>>>>
  static boolean main_class_meta_usage_from_second(PsiBuilder builder_, int level_) {
    return comma_list(builder_, level_ + 1, main_class_meta_usage_from_second_0_0_parser_);
  }

  /* ********************************************************** */
  // <<listOf one>>
  static boolean one_list(PsiBuilder builder_, int level_) {
    return listOf(builder_, level_ + 1, ExternalRules::one);
  }

  /* ********************************************************** */
  // <<listOf (one)>>
  static boolean one_list_par(PsiBuilder builder_, int level_) {
    return listOf(builder_, level_ + 1, ExternalRules2::one_list_par_0_0);
  }

  // (one)
  private static boolean one_list_par_0_0(PsiBuilder builder_, int level_) {
    if (!recursion_guard_(builder_, level_, "one_list_par_0_0")) return false;
    boolean result_;
    Marker marker_ = enter_section_(builder_);
    result_ = one(builder_, level_ + 1);
    exit_section_(builder_, marker_, null, result_);
    return result_;
  }

  /* ********************************************************** */
  static Parser second_class_meta_$(Parser bmp) {
    return (builder_, level_) -> second_class_meta(builder_, level_ + 1, bmp);
  }

  // <<bmp>>
  static boolean second_class_meta(PsiBuilder builder_, int level_, Parser bmp) {
    return bmp.parse(builder_, level_);
  }

  /* ********************************************************** */
  // <<comma_list <<third_class_meta some>>>>
  static boolean third_class_meta_usage_from_second(PsiBuilder builder_, int level_) {
    return comma_list(builder_, level_ + 1, third_class_meta_usage_from_second_0_0_parser_);
  }

  private static final Parser main_class_meta_usage_from_second_0_0_parser_ = main_class_meta_$(ExternalRules.SOME_parser_);
  private static final Parser third_class_meta_usage_from_second_0_0_parser_ = ExternalRules3.third_class_meta_$(ExternalRules.SOME_parser_);
}
// ---- ExternalRules3.java -----------------
// This is a generated file. Not intended for manual editing.
package ;

import com.intellij.lang.PsiBuilder;
import com.intellij.lang.PsiBuilder.Marker;
import static generated.GeneratedTypes.*;
import static org.intellij.grammar.test.ParserUtil.*;
import static ExternalRules.*;

@SuppressWarnings({"SimplifiableIfStatement", "UnusedAssignment"})
public class ExternalRules3 {

  /* ********************************************************** */
  // <<comma_list <<second_class_meta some>>>>
  static boolean second_class_meta_usage_from_third(PsiBuilder builder_, int level_) {
    return comma_list(builder_, level_ + 1, second_class_meta_usage_from_third_0_0_parser_);
  }

  /* ********************************************************** */
  static Parser third_class_meta_$(Parser fmp) {
    return (builder_, level_) -> third_class_meta(builder_, level_ + 1, fmp);
  }

  // <<fmp>>
  static boolean third_class_meta(PsiBuilder builder_, int level_, Parser fmp) {
    return fmp.parse(builder_, level_);
  }

  private static final Parser second_class_meta_usage_from_third_0_0_parser_ = ExternalRules2.second_class_meta_$(ExternalRules.SOME_parser_);
}