17db96d56Sopenharmony_ci# PEG grammar for Python
27db96d56Sopenharmony_ci
37db96d56Sopenharmony_ci@trailer '''
47db96d56Sopenharmony_civoid *
57db96d56Sopenharmony_ci_PyPegen_parse(Parser *p)
67db96d56Sopenharmony_ci{
77db96d56Sopenharmony_ci    // Initialize keywords
87db96d56Sopenharmony_ci    p->keywords = reserved_keywords;
97db96d56Sopenharmony_ci    p->n_keyword_lists = n_keyword_lists;
107db96d56Sopenharmony_ci    p->soft_keywords = soft_keywords;
117db96d56Sopenharmony_ci
127db96d56Sopenharmony_ci    // Run parser
137db96d56Sopenharmony_ci    void *result = NULL;
147db96d56Sopenharmony_ci    if (p->start_rule == Py_file_input) {
157db96d56Sopenharmony_ci        result = file_rule(p);
167db96d56Sopenharmony_ci    } else if (p->start_rule == Py_single_input) {
177db96d56Sopenharmony_ci        result = interactive_rule(p);
187db96d56Sopenharmony_ci    } else if (p->start_rule == Py_eval_input) {
197db96d56Sopenharmony_ci        result = eval_rule(p);
207db96d56Sopenharmony_ci    } else if (p->start_rule == Py_func_type_input) {
217db96d56Sopenharmony_ci        result = func_type_rule(p);
227db96d56Sopenharmony_ci    } else if (p->start_rule == Py_fstring_input) {
237db96d56Sopenharmony_ci        result = fstring_rule(p);
247db96d56Sopenharmony_ci    }
257db96d56Sopenharmony_ci
267db96d56Sopenharmony_ci    return result;
277db96d56Sopenharmony_ci}
287db96d56Sopenharmony_ci'''
297db96d56Sopenharmony_ci
307db96d56Sopenharmony_ci# ========================= START OF THE GRAMMAR =========================
317db96d56Sopenharmony_ci
327db96d56Sopenharmony_ci# General grammatical elements and rules:
337db96d56Sopenharmony_ci#
347db96d56Sopenharmony_ci# * Strings with double quotes (") denote SOFT KEYWORDS
357db96d56Sopenharmony_ci# * Strings with single quotes (') denote KEYWORDS
367db96d56Sopenharmony_ci# * Upper case names (NAME) denote tokens in the Grammar/Tokens file
377db96d56Sopenharmony_ci# * Rule names starting with "invalid_" are used for specialized syntax errors
387db96d56Sopenharmony_ci#     - These rules are NOT used in the first pass of the parser.
397db96d56Sopenharmony_ci#     - Only if the first pass fails to parse, a second pass including the invalid
407db96d56Sopenharmony_ci#       rules will be executed.
417db96d56Sopenharmony_ci#     - If the parser fails in the second phase with a generic syntax error, the
427db96d56Sopenharmony_ci#       location of the generic failure of the first pass will be used (this avoids
437db96d56Sopenharmony_ci#       reporting incorrect locations due to the invalid rules).
447db96d56Sopenharmony_ci#     - The order of the alternatives involving invalid rules matter
457db96d56Sopenharmony_ci#       (like any rule in PEG).
467db96d56Sopenharmony_ci#
477db96d56Sopenharmony_ci# Grammar Syntax (see PEP 617 for more information):
487db96d56Sopenharmony_ci#
497db96d56Sopenharmony_ci# rule_name: expression
507db96d56Sopenharmony_ci#   Optionally, a type can be included right after the rule name, which
517db96d56Sopenharmony_ci#   specifies the return type of the C or Python function corresponding to the
527db96d56Sopenharmony_ci#   rule:
537db96d56Sopenharmony_ci# rule_name[return_type]: expression
547db96d56Sopenharmony_ci#   If the return type is omitted, then a void * is returned in C and an Any in
557db96d56Sopenharmony_ci#   Python.
567db96d56Sopenharmony_ci# e1 e2
577db96d56Sopenharmony_ci#   Match e1, then match e2.
587db96d56Sopenharmony_ci# e1 | e2
597db96d56Sopenharmony_ci#   Match e1 or e2.
607db96d56Sopenharmony_ci#   The first alternative can also appear on the line after the rule name for
617db96d56Sopenharmony_ci#   formatting purposes. In that case, a | must be used before the first
627db96d56Sopenharmony_ci#   alternative, like so:
637db96d56Sopenharmony_ci#       rule_name[return_type]:
647db96d56Sopenharmony_ci#            | first_alt
657db96d56Sopenharmony_ci#            | second_alt
667db96d56Sopenharmony_ci# ( e )
677db96d56Sopenharmony_ci#   Match e (allows also to use other operators in the group like '(e)*')
687db96d56Sopenharmony_ci# [ e ] or e?
697db96d56Sopenharmony_ci#   Optionally match e.
707db96d56Sopenharmony_ci# e*
717db96d56Sopenharmony_ci#   Match zero or more occurrences of e.
727db96d56Sopenharmony_ci# e+
737db96d56Sopenharmony_ci#   Match one or more occurrences of e.
747db96d56Sopenharmony_ci# s.e+
757db96d56Sopenharmony_ci#   Match one or more occurrences of e, separated by s. The generated parse tree
767db96d56Sopenharmony_ci#   does not include the separator. This is otherwise identical to (e (s e)*).
777db96d56Sopenharmony_ci# &e
787db96d56Sopenharmony_ci#   Succeed if e can be parsed, without consuming any input.
797db96d56Sopenharmony_ci# !e
807db96d56Sopenharmony_ci#   Fail if e can be parsed, without consuming any input.
817db96d56Sopenharmony_ci# ~
827db96d56Sopenharmony_ci#   Commit to the current alternative, even if it fails to parse.
837db96d56Sopenharmony_ci#
847db96d56Sopenharmony_ci
857db96d56Sopenharmony_ci# STARTING RULES
867db96d56Sopenharmony_ci# ==============
877db96d56Sopenharmony_ci
887db96d56Sopenharmony_cifile[mod_ty]: a=[statements] ENDMARKER { _PyPegen_make_module(p, a) }
897db96d56Sopenharmony_ciinteractive[mod_ty]: a=statement_newline { _PyAST_Interactive(a, p->arena) }
907db96d56Sopenharmony_cieval[mod_ty]: a=expressions NEWLINE* ENDMARKER { _PyAST_Expression(a, p->arena) }
917db96d56Sopenharmony_cifunc_type[mod_ty]: '(' a=[type_expressions] ')' '->' b=expression NEWLINE* ENDMARKER { _PyAST_FunctionType(a, b, p->arena) }
927db96d56Sopenharmony_cifstring[expr_ty]: star_expressions
937db96d56Sopenharmony_ci
947db96d56Sopenharmony_ci# GENERAL STATEMENTS
957db96d56Sopenharmony_ci# ==================
967db96d56Sopenharmony_ci
977db96d56Sopenharmony_cistatements[asdl_stmt_seq*]: a=statement+ { (asdl_stmt_seq*)_PyPegen_seq_flatten(p, a) }
987db96d56Sopenharmony_ci
997db96d56Sopenharmony_cistatement[asdl_stmt_seq*]: a=compound_stmt { (asdl_stmt_seq*)_PyPegen_singleton_seq(p, a) } | a[asdl_stmt_seq*]=simple_stmts { a }
1007db96d56Sopenharmony_ci
1017db96d56Sopenharmony_cistatement_newline[asdl_stmt_seq*]:
1027db96d56Sopenharmony_ci    | a=compound_stmt NEWLINE { (asdl_stmt_seq*)_PyPegen_singleton_seq(p, a) }
1037db96d56Sopenharmony_ci    | simple_stmts
1047db96d56Sopenharmony_ci    | NEWLINE { (asdl_stmt_seq*)_PyPegen_singleton_seq(p, CHECK(stmt_ty, _PyAST_Pass(EXTRA))) }
1057db96d56Sopenharmony_ci    | ENDMARKER { _PyPegen_interactive_exit(p) }
1067db96d56Sopenharmony_ci
1077db96d56Sopenharmony_cisimple_stmts[asdl_stmt_seq*]:
1087db96d56Sopenharmony_ci    | a=simple_stmt !';' NEWLINE { (asdl_stmt_seq*)_PyPegen_singleton_seq(p, a) } # Not needed, there for speedup
1097db96d56Sopenharmony_ci    | a[asdl_stmt_seq*]=';'.simple_stmt+ [';'] NEWLINE { a }
1107db96d56Sopenharmony_ci
1117db96d56Sopenharmony_ci# NOTE: assignment MUST precede expression, else parsing a simple assignment
1127db96d56Sopenharmony_ci# will throw a SyntaxError.
1137db96d56Sopenharmony_cisimple_stmt[stmt_ty] (memo):
1147db96d56Sopenharmony_ci    | assignment
1157db96d56Sopenharmony_ci    | e=star_expressions { _PyAST_Expr(e, EXTRA) }
1167db96d56Sopenharmony_ci    | &'return' return_stmt
1177db96d56Sopenharmony_ci    | &('import' | 'from') import_stmt
1187db96d56Sopenharmony_ci    | &'raise' raise_stmt
1197db96d56Sopenharmony_ci    | 'pass' { _PyAST_Pass(EXTRA) }
1207db96d56Sopenharmony_ci    | &'del' del_stmt
1217db96d56Sopenharmony_ci    | &'yield' yield_stmt
1227db96d56Sopenharmony_ci    | &'assert' assert_stmt
1237db96d56Sopenharmony_ci    | 'break' { _PyAST_Break(EXTRA) }
1247db96d56Sopenharmony_ci    | 'continue' { _PyAST_Continue(EXTRA) }
1257db96d56Sopenharmony_ci    | &'global' global_stmt
1267db96d56Sopenharmony_ci    | &'nonlocal' nonlocal_stmt
1277db96d56Sopenharmony_ci
1287db96d56Sopenharmony_cicompound_stmt[stmt_ty]:
1297db96d56Sopenharmony_ci    | &('def' | '@' | ASYNC) function_def
1307db96d56Sopenharmony_ci    | &'if' if_stmt
1317db96d56Sopenharmony_ci    | &('class' | '@') class_def
1327db96d56Sopenharmony_ci    | &('with' | ASYNC) with_stmt
1337db96d56Sopenharmony_ci    | &('for' | ASYNC) for_stmt
1347db96d56Sopenharmony_ci    | &'try' try_stmt
1357db96d56Sopenharmony_ci    | &'while' while_stmt
1367db96d56Sopenharmony_ci    | match_stmt
1377db96d56Sopenharmony_ci
1387db96d56Sopenharmony_ci# SIMPLE STATEMENTS
1397db96d56Sopenharmony_ci# =================
1407db96d56Sopenharmony_ci
1417db96d56Sopenharmony_ci# NOTE: annotated_rhs may start with 'yield'; yield_expr must start with 'yield'
1427db96d56Sopenharmony_ciassignment[stmt_ty]:
1437db96d56Sopenharmony_ci    | a=NAME ':' b=expression c=['=' d=annotated_rhs { d }] {
1447db96d56Sopenharmony_ci        CHECK_VERSION(
1457db96d56Sopenharmony_ci            stmt_ty,
1467db96d56Sopenharmony_ci            6,
1477db96d56Sopenharmony_ci            "Variable annotation syntax is",
1487db96d56Sopenharmony_ci            _PyAST_AnnAssign(CHECK(expr_ty, _PyPegen_set_expr_context(p, a, Store)), b, c, 1, EXTRA)
1497db96d56Sopenharmony_ci        ) }
1507db96d56Sopenharmony_ci    | a=('(' b=single_target ')' { b }
1517db96d56Sopenharmony_ci         | single_subscript_attribute_target) ':' b=expression c=['=' d=annotated_rhs { d }] {
1527db96d56Sopenharmony_ci        CHECK_VERSION(stmt_ty, 6, "Variable annotations syntax is", _PyAST_AnnAssign(a, b, c, 0, EXTRA)) }
1537db96d56Sopenharmony_ci    | a[asdl_expr_seq*]=(z=star_targets '=' { z })+ b=(yield_expr | star_expressions) !'=' tc=[TYPE_COMMENT] {
1547db96d56Sopenharmony_ci         _PyAST_Assign(a, b, NEW_TYPE_COMMENT(p, tc), EXTRA) }
1557db96d56Sopenharmony_ci    | a=single_target b=augassign ~ c=(yield_expr | star_expressions) {
1567db96d56Sopenharmony_ci         _PyAST_AugAssign(a, b->kind, c, EXTRA) }
1577db96d56Sopenharmony_ci    | invalid_assignment
1587db96d56Sopenharmony_ci
1597db96d56Sopenharmony_ciannotated_rhs[expr_ty]: yield_expr | star_expressions
1607db96d56Sopenharmony_ci
1617db96d56Sopenharmony_ciaugassign[AugOperator*]:
1627db96d56Sopenharmony_ci    | '+=' { _PyPegen_augoperator(p, Add) }
1637db96d56Sopenharmony_ci    | '-=' { _PyPegen_augoperator(p, Sub) }
1647db96d56Sopenharmony_ci    | '*=' { _PyPegen_augoperator(p, Mult) }
1657db96d56Sopenharmony_ci    | '@=' { CHECK_VERSION(AugOperator*, 5, "The '@' operator is", _PyPegen_augoperator(p, MatMult)) }
1667db96d56Sopenharmony_ci    | '/=' { _PyPegen_augoperator(p, Div) }
1677db96d56Sopenharmony_ci    | '%=' { _PyPegen_augoperator(p, Mod) }
1687db96d56Sopenharmony_ci    | '&=' { _PyPegen_augoperator(p, BitAnd) }
1697db96d56Sopenharmony_ci    | '|=' { _PyPegen_augoperator(p, BitOr) }
1707db96d56Sopenharmony_ci    | '^=' { _PyPegen_augoperator(p, BitXor) }
1717db96d56Sopenharmony_ci    | '<<=' { _PyPegen_augoperator(p, LShift) }
1727db96d56Sopenharmony_ci    | '>>=' { _PyPegen_augoperator(p, RShift) }
1737db96d56Sopenharmony_ci    | '**=' { _PyPegen_augoperator(p, Pow) }
1747db96d56Sopenharmony_ci    | '//=' { _PyPegen_augoperator(p, FloorDiv) }
1757db96d56Sopenharmony_ci
1767db96d56Sopenharmony_cireturn_stmt[stmt_ty]:
1777db96d56Sopenharmony_ci    | 'return' a=[star_expressions] { _PyAST_Return(a, EXTRA) }
1787db96d56Sopenharmony_ci
1797db96d56Sopenharmony_ciraise_stmt[stmt_ty]:
1807db96d56Sopenharmony_ci    | 'raise' a=expression b=['from' z=expression { z }] { _PyAST_Raise(a, b, EXTRA) }
1817db96d56Sopenharmony_ci    | 'raise' { _PyAST_Raise(NULL, NULL, EXTRA) }
1827db96d56Sopenharmony_ci
1837db96d56Sopenharmony_ciglobal_stmt[stmt_ty]: 'global' a[asdl_expr_seq*]=','.NAME+ {
1847db96d56Sopenharmony_ci    _PyAST_Global(CHECK(asdl_identifier_seq*, _PyPegen_map_names_to_ids(p, a)), EXTRA) }
1857db96d56Sopenharmony_ci
1867db96d56Sopenharmony_cinonlocal_stmt[stmt_ty]: 'nonlocal' a[asdl_expr_seq*]=','.NAME+ {
1877db96d56Sopenharmony_ci    _PyAST_Nonlocal(CHECK(asdl_identifier_seq*, _PyPegen_map_names_to_ids(p, a)), EXTRA) }
1887db96d56Sopenharmony_ci
1897db96d56Sopenharmony_cidel_stmt[stmt_ty]:
1907db96d56Sopenharmony_ci    | 'del' a=del_targets &(';' | NEWLINE) { _PyAST_Delete(a, EXTRA) }
1917db96d56Sopenharmony_ci    | invalid_del_stmt
1927db96d56Sopenharmony_ci
1937db96d56Sopenharmony_ciyield_stmt[stmt_ty]: y=yield_expr { _PyAST_Expr(y, EXTRA) }
1947db96d56Sopenharmony_ci
1957db96d56Sopenharmony_ciassert_stmt[stmt_ty]: 'assert' a=expression b=[',' z=expression { z }] { _PyAST_Assert(a, b, EXTRA) }
1967db96d56Sopenharmony_ci
1977db96d56Sopenharmony_ciimport_stmt[stmt_ty]: import_name | import_from
1987db96d56Sopenharmony_ci
1997db96d56Sopenharmony_ci# Import statements
2007db96d56Sopenharmony_ci# -----------------
2017db96d56Sopenharmony_ci
2027db96d56Sopenharmony_ciimport_name[stmt_ty]: 'import' a=dotted_as_names { _PyAST_Import(a, EXTRA) }
2037db96d56Sopenharmony_ci# note below: the ('.' | '...') is necessary because '...' is tokenized as ELLIPSIS
2047db96d56Sopenharmony_ciimport_from[stmt_ty]:
2057db96d56Sopenharmony_ci    | 'from' a=('.' | '...')* b=dotted_name 'import' c=import_from_targets {
2067db96d56Sopenharmony_ci        _PyAST_ImportFrom(b->v.Name.id, c, _PyPegen_seq_count_dots(a), EXTRA) }
2077db96d56Sopenharmony_ci    | 'from' a=('.' | '...')+ 'import' b=import_from_targets {
2087db96d56Sopenharmony_ci        _PyAST_ImportFrom(NULL, b, _PyPegen_seq_count_dots(a), EXTRA) }
2097db96d56Sopenharmony_ciimport_from_targets[asdl_alias_seq*]:
2107db96d56Sopenharmony_ci    | '(' a=import_from_as_names [','] ')' { a }
2117db96d56Sopenharmony_ci    | import_from_as_names !','
2127db96d56Sopenharmony_ci    | '*' { (asdl_alias_seq*)_PyPegen_singleton_seq(p, CHECK(alias_ty, _PyPegen_alias_for_star(p, EXTRA))) }
2137db96d56Sopenharmony_ci    | invalid_import_from_targets
2147db96d56Sopenharmony_ciimport_from_as_names[asdl_alias_seq*]:
2157db96d56Sopenharmony_ci    | a[asdl_alias_seq*]=','.import_from_as_name+ { a }
2167db96d56Sopenharmony_ciimport_from_as_name[alias_ty]:
2177db96d56Sopenharmony_ci    | a=NAME b=['as' z=NAME { z }] { _PyAST_alias(a->v.Name.id,
2187db96d56Sopenharmony_ci                                               (b) ? ((expr_ty) b)->v.Name.id : NULL,
2197db96d56Sopenharmony_ci                                               EXTRA) }
2207db96d56Sopenharmony_cidotted_as_names[asdl_alias_seq*]:
2217db96d56Sopenharmony_ci    | a[asdl_alias_seq*]=','.dotted_as_name+ { a }
2227db96d56Sopenharmony_cidotted_as_name[alias_ty]:
2237db96d56Sopenharmony_ci    | a=dotted_name b=['as' z=NAME { z }] { _PyAST_alias(a->v.Name.id,
2247db96d56Sopenharmony_ci                                                      (b) ? ((expr_ty) b)->v.Name.id : NULL,
2257db96d56Sopenharmony_ci                                                      EXTRA) }
2267db96d56Sopenharmony_cidotted_name[expr_ty]:
2277db96d56Sopenharmony_ci    | a=dotted_name '.' b=NAME { _PyPegen_join_names_with_dot(p, a, b) }
2287db96d56Sopenharmony_ci    | NAME
2297db96d56Sopenharmony_ci
2307db96d56Sopenharmony_ci# COMPOUND STATEMENTS
2317db96d56Sopenharmony_ci# ===================
2327db96d56Sopenharmony_ci
2337db96d56Sopenharmony_ci# Common elements
2347db96d56Sopenharmony_ci# ---------------
2357db96d56Sopenharmony_ci
2367db96d56Sopenharmony_ciblock[asdl_stmt_seq*] (memo):
2377db96d56Sopenharmony_ci    | NEWLINE INDENT a=statements DEDENT { a }
2387db96d56Sopenharmony_ci    | simple_stmts
2397db96d56Sopenharmony_ci    | invalid_block
2407db96d56Sopenharmony_ci
2417db96d56Sopenharmony_cidecorators[asdl_expr_seq*]: a[asdl_expr_seq*]=('@' f=named_expression NEWLINE { f })+ { a }
2427db96d56Sopenharmony_ci
2437db96d56Sopenharmony_ci# Class definitions
2447db96d56Sopenharmony_ci# -----------------
2457db96d56Sopenharmony_ci
2467db96d56Sopenharmony_ciclass_def[stmt_ty]:
2477db96d56Sopenharmony_ci    | a=decorators b=class_def_raw { _PyPegen_class_def_decorators(p, a, b) }
2487db96d56Sopenharmony_ci    | class_def_raw
2497db96d56Sopenharmony_ci
2507db96d56Sopenharmony_ciclass_def_raw[stmt_ty]:
2517db96d56Sopenharmony_ci    | invalid_class_def_raw
2527db96d56Sopenharmony_ci    | 'class' a=NAME b=['(' z=[arguments] ')' { z }] ':' c=block {
2537db96d56Sopenharmony_ci        _PyAST_ClassDef(a->v.Name.id,
2547db96d56Sopenharmony_ci                     (b) ? ((expr_ty) b)->v.Call.args : NULL,
2557db96d56Sopenharmony_ci                     (b) ? ((expr_ty) b)->v.Call.keywords : NULL,
2567db96d56Sopenharmony_ci                     c, NULL, EXTRA) }
2577db96d56Sopenharmony_ci
2587db96d56Sopenharmony_ci# Function definitions
2597db96d56Sopenharmony_ci# --------------------
2607db96d56Sopenharmony_ci
2617db96d56Sopenharmony_cifunction_def[stmt_ty]:
2627db96d56Sopenharmony_ci    | d=decorators f=function_def_raw { _PyPegen_function_def_decorators(p, d, f) }
2637db96d56Sopenharmony_ci    | function_def_raw
2647db96d56Sopenharmony_ci
2657db96d56Sopenharmony_cifunction_def_raw[stmt_ty]:
2667db96d56Sopenharmony_ci    | invalid_def_raw
2677db96d56Sopenharmony_ci    | 'def' n=NAME &&'(' params=[params] ')' a=['->' z=expression { z }] &&':' tc=[func_type_comment] b=block {
2687db96d56Sopenharmony_ci        _PyAST_FunctionDef(n->v.Name.id,
2697db96d56Sopenharmony_ci                        (params) ? params : CHECK(arguments_ty, _PyPegen_empty_arguments(p)),
2707db96d56Sopenharmony_ci                        b, NULL, a, NEW_TYPE_COMMENT(p, tc), EXTRA) }
2717db96d56Sopenharmony_ci    | ASYNC 'def' n=NAME &&'(' params=[params] ')' a=['->' z=expression { z }] &&':' tc=[func_type_comment] b=block {
2727db96d56Sopenharmony_ci        CHECK_VERSION(
2737db96d56Sopenharmony_ci            stmt_ty,
2747db96d56Sopenharmony_ci            5,
2757db96d56Sopenharmony_ci            "Async functions are",
2767db96d56Sopenharmony_ci            _PyAST_AsyncFunctionDef(n->v.Name.id,
2777db96d56Sopenharmony_ci                            (params) ? params : CHECK(arguments_ty, _PyPegen_empty_arguments(p)),
2787db96d56Sopenharmony_ci                            b, NULL, a, NEW_TYPE_COMMENT(p, tc), EXTRA)
2797db96d56Sopenharmony_ci        ) }
2807db96d56Sopenharmony_ci
2817db96d56Sopenharmony_ci# Function parameters
2827db96d56Sopenharmony_ci# -------------------
2837db96d56Sopenharmony_ci
2847db96d56Sopenharmony_ciparams[arguments_ty]:
2857db96d56Sopenharmony_ci    | invalid_parameters
2867db96d56Sopenharmony_ci    | parameters
2877db96d56Sopenharmony_ci
2887db96d56Sopenharmony_ciparameters[arguments_ty]:
2897db96d56Sopenharmony_ci    | a=slash_no_default b[asdl_arg_seq*]=param_no_default* c=param_with_default* d=[star_etc] {
2907db96d56Sopenharmony_ci        CHECK_VERSION(arguments_ty, 8, "Positional-only parameters are", _PyPegen_make_arguments(p, a, NULL, b, c, d)) }
2917db96d56Sopenharmony_ci    | a=slash_with_default b=param_with_default* c=[star_etc] {
2927db96d56Sopenharmony_ci        CHECK_VERSION(arguments_ty, 8, "Positional-only parameters are", _PyPegen_make_arguments(p, NULL, a, NULL, b, c)) }
2937db96d56Sopenharmony_ci    | a[asdl_arg_seq*]=param_no_default+ b=param_with_default* c=[star_etc] {
2947db96d56Sopenharmony_ci        _PyPegen_make_arguments(p, NULL, NULL, a, b, c) }
2957db96d56Sopenharmony_ci    | a=param_with_default+ b=[star_etc] { _PyPegen_make_arguments(p, NULL, NULL, NULL, a, b)}
2967db96d56Sopenharmony_ci    | a=star_etc { _PyPegen_make_arguments(p, NULL, NULL, NULL, NULL, a) }
2977db96d56Sopenharmony_ci
2987db96d56Sopenharmony_ci# Some duplication here because we can't write (',' | &')'),
2997db96d56Sopenharmony_ci# which is because we don't support empty alternatives (yet).
3007db96d56Sopenharmony_ci
3017db96d56Sopenharmony_cislash_no_default[asdl_arg_seq*]:
3027db96d56Sopenharmony_ci    | a[asdl_arg_seq*]=param_no_default+ '/' ',' { a }
3037db96d56Sopenharmony_ci    | a[asdl_arg_seq*]=param_no_default+ '/' &')' { a }
3047db96d56Sopenharmony_cislash_with_default[SlashWithDefault*]:
3057db96d56Sopenharmony_ci    | a=param_no_default* b=param_with_default+ '/' ',' { _PyPegen_slash_with_default(p, (asdl_arg_seq *)a, b) }
3067db96d56Sopenharmony_ci    | a=param_no_default* b=param_with_default+ '/' &')' { _PyPegen_slash_with_default(p, (asdl_arg_seq *)a, b) }
3077db96d56Sopenharmony_ci
3087db96d56Sopenharmony_cistar_etc[StarEtc*]:
3097db96d56Sopenharmony_ci    | invalid_star_etc
3107db96d56Sopenharmony_ci    | '*' a=param_no_default b=param_maybe_default* c=[kwds] {
3117db96d56Sopenharmony_ci        _PyPegen_star_etc(p, a, b, c) }
3127db96d56Sopenharmony_ci    | '*' a=param_no_default_star_annotation b=param_maybe_default* c=[kwds] {
3137db96d56Sopenharmony_ci        _PyPegen_star_etc(p, a, b, c) }
3147db96d56Sopenharmony_ci    | '*' ',' b=param_maybe_default+ c=[kwds] {
3157db96d56Sopenharmony_ci        _PyPegen_star_etc(p, NULL, b, c) }
3167db96d56Sopenharmony_ci    | a=kwds { _PyPegen_star_etc(p, NULL, NULL, a) }
3177db96d56Sopenharmony_ci
3187db96d56Sopenharmony_cikwds[arg_ty]:
3197db96d56Sopenharmony_ci    | invalid_kwds
3207db96d56Sopenharmony_ci    | '**' a=param_no_default { a }
3217db96d56Sopenharmony_ci
3227db96d56Sopenharmony_ci# One parameter.  This *includes* a following comma and type comment.
3237db96d56Sopenharmony_ci#
3247db96d56Sopenharmony_ci# There are three styles:
3257db96d56Sopenharmony_ci# - No default
3267db96d56Sopenharmony_ci# - With default
3277db96d56Sopenharmony_ci# - Maybe with default
3287db96d56Sopenharmony_ci#
3297db96d56Sopenharmony_ci# There are two alternative forms of each, to deal with type comments:
3307db96d56Sopenharmony_ci# - Ends in a comma followed by an optional type comment
3317db96d56Sopenharmony_ci# - No comma, optional type comment, must be followed by close paren
3327db96d56Sopenharmony_ci# The latter form is for a final parameter without trailing comma.
3337db96d56Sopenharmony_ci#
3347db96d56Sopenharmony_ci
3357db96d56Sopenharmony_ciparam_no_default[arg_ty]:
3367db96d56Sopenharmony_ci    | a=param ',' tc=TYPE_COMMENT? { _PyPegen_add_type_comment_to_arg(p, a, tc) }
3377db96d56Sopenharmony_ci    | a=param tc=TYPE_COMMENT? &')' { _PyPegen_add_type_comment_to_arg(p, a, tc) }
3387db96d56Sopenharmony_ciparam_no_default_star_annotation[arg_ty]:
3397db96d56Sopenharmony_ci    | a=param_star_annotation ',' tc=TYPE_COMMENT? { _PyPegen_add_type_comment_to_arg(p, a, tc) }
3407db96d56Sopenharmony_ci    | a=param_star_annotation tc=TYPE_COMMENT? &')' { _PyPegen_add_type_comment_to_arg(p, a, tc) }
3417db96d56Sopenharmony_ciparam_with_default[NameDefaultPair*]:
3427db96d56Sopenharmony_ci    | a=param c=default ',' tc=TYPE_COMMENT? { _PyPegen_name_default_pair(p, a, c, tc) }
3437db96d56Sopenharmony_ci    | a=param c=default tc=TYPE_COMMENT? &')' { _PyPegen_name_default_pair(p, a, c, tc) }
3447db96d56Sopenharmony_ciparam_maybe_default[NameDefaultPair*]:
3457db96d56Sopenharmony_ci    | a=param c=default? ',' tc=TYPE_COMMENT? { _PyPegen_name_default_pair(p, a, c, tc) }
3467db96d56Sopenharmony_ci    | a=param c=default? tc=TYPE_COMMENT? &')' { _PyPegen_name_default_pair(p, a, c, tc) }
3477db96d56Sopenharmony_ciparam[arg_ty]: a=NAME b=annotation? { _PyAST_arg(a->v.Name.id, b, NULL, EXTRA) }
3487db96d56Sopenharmony_ciparam_star_annotation[arg_ty]: a=NAME b=star_annotation { _PyAST_arg(a->v.Name.id, b, NULL, EXTRA) }
3497db96d56Sopenharmony_ciannotation[expr_ty]: ':' a=expression { a }
3507db96d56Sopenharmony_cistar_annotation[expr_ty]: ':' a=star_expression { a }
3517db96d56Sopenharmony_cidefault[expr_ty]: '=' a=expression { a } | invalid_default
3527db96d56Sopenharmony_ci
3537db96d56Sopenharmony_ci# If statement
3547db96d56Sopenharmony_ci# ------------
3557db96d56Sopenharmony_ci
3567db96d56Sopenharmony_ciif_stmt[stmt_ty]:
3577db96d56Sopenharmony_ci    | invalid_if_stmt
3587db96d56Sopenharmony_ci    | 'if' a=named_expression ':' b=block c=elif_stmt {
3597db96d56Sopenharmony_ci        _PyAST_If(a, b, CHECK(asdl_stmt_seq*, _PyPegen_singleton_seq(p, c)), EXTRA) }
3607db96d56Sopenharmony_ci    | 'if' a=named_expression ':' b=block c=[else_block] { _PyAST_If(a, b, c, EXTRA) }
3617db96d56Sopenharmony_cielif_stmt[stmt_ty]:
3627db96d56Sopenharmony_ci    | invalid_elif_stmt
3637db96d56Sopenharmony_ci    | 'elif' a=named_expression ':' b=block c=elif_stmt {
3647db96d56Sopenharmony_ci        _PyAST_If(a, b, CHECK(asdl_stmt_seq*, _PyPegen_singleton_seq(p, c)), EXTRA) }
3657db96d56Sopenharmony_ci    | 'elif' a=named_expression ':' b=block c=[else_block] { _PyAST_If(a, b, c, EXTRA) }
3667db96d56Sopenharmony_cielse_block[asdl_stmt_seq*]:
3677db96d56Sopenharmony_ci    | invalid_else_stmt
3687db96d56Sopenharmony_ci    | 'else' &&':' b=block { b }
3697db96d56Sopenharmony_ci
3707db96d56Sopenharmony_ci# While statement
3717db96d56Sopenharmony_ci# ---------------
3727db96d56Sopenharmony_ci
3737db96d56Sopenharmony_ciwhile_stmt[stmt_ty]:
3747db96d56Sopenharmony_ci    | invalid_while_stmt
3757db96d56Sopenharmony_ci    | 'while' a=named_expression ':' b=block c=[else_block] { _PyAST_While(a, b, c, EXTRA) }
3767db96d56Sopenharmony_ci
3777db96d56Sopenharmony_ci# For statement
3787db96d56Sopenharmony_ci# -------------
3797db96d56Sopenharmony_ci
3807db96d56Sopenharmony_cifor_stmt[stmt_ty]:
3817db96d56Sopenharmony_ci    | invalid_for_stmt
3827db96d56Sopenharmony_ci    | 'for' t=star_targets 'in' ~ ex=star_expressions ':' tc=[TYPE_COMMENT] b=block el=[else_block] {
3837db96d56Sopenharmony_ci        _PyAST_For(t, ex, b, el, NEW_TYPE_COMMENT(p, tc), EXTRA) }
3847db96d56Sopenharmony_ci    | ASYNC 'for' t=star_targets 'in' ~ ex=star_expressions ':' tc=[TYPE_COMMENT] b=block el=[else_block] {
3857db96d56Sopenharmony_ci        CHECK_VERSION(stmt_ty, 5, "Async for loops are", _PyAST_AsyncFor(t, ex, b, el, NEW_TYPE_COMMENT(p, tc), EXTRA)) }
3867db96d56Sopenharmony_ci    | invalid_for_target
3877db96d56Sopenharmony_ci
3887db96d56Sopenharmony_ci# With statement
3897db96d56Sopenharmony_ci# --------------
3907db96d56Sopenharmony_ci
3917db96d56Sopenharmony_ciwith_stmt[stmt_ty]:
3927db96d56Sopenharmony_ci    | invalid_with_stmt_indent
3937db96d56Sopenharmony_ci    | 'with' '(' a[asdl_withitem_seq*]=','.with_item+ ','? ')' ':' b=block {
3947db96d56Sopenharmony_ci        CHECK_VERSION(stmt_ty, 9, "Parenthesized context managers are", _PyAST_With(a, b, NULL, EXTRA)) }
3957db96d56Sopenharmony_ci    | 'with' a[asdl_withitem_seq*]=','.with_item+ ':' tc=[TYPE_COMMENT] b=block {
3967db96d56Sopenharmony_ci        _PyAST_With(a, b, NEW_TYPE_COMMENT(p, tc), EXTRA) }
3977db96d56Sopenharmony_ci    | ASYNC 'with' '(' a[asdl_withitem_seq*]=','.with_item+ ','? ')' ':' b=block {
3987db96d56Sopenharmony_ci       CHECK_VERSION(stmt_ty, 5, "Async with statements are", _PyAST_AsyncWith(a, b, NULL, EXTRA)) }
3997db96d56Sopenharmony_ci    | ASYNC 'with' a[asdl_withitem_seq*]=','.with_item+ ':' tc=[TYPE_COMMENT] b=block {
4007db96d56Sopenharmony_ci       CHECK_VERSION(stmt_ty, 5, "Async with statements are", _PyAST_AsyncWith(a, b, NEW_TYPE_COMMENT(p, tc), EXTRA)) }
4017db96d56Sopenharmony_ci    | invalid_with_stmt
4027db96d56Sopenharmony_ci
4037db96d56Sopenharmony_ciwith_item[withitem_ty]:
4047db96d56Sopenharmony_ci    | e=expression 'as' t=star_target &(',' | ')' | ':') { _PyAST_withitem(e, t, p->arena) }
4057db96d56Sopenharmony_ci    | invalid_with_item
4067db96d56Sopenharmony_ci    | e=expression { _PyAST_withitem(e, NULL, p->arena) }
4077db96d56Sopenharmony_ci
4087db96d56Sopenharmony_ci# Try statement
4097db96d56Sopenharmony_ci# -------------
4107db96d56Sopenharmony_ci
4117db96d56Sopenharmony_citry_stmt[stmt_ty]:
4127db96d56Sopenharmony_ci    | invalid_try_stmt
4137db96d56Sopenharmony_ci    | 'try' &&':' b=block f=finally_block { _PyAST_Try(b, NULL, NULL, f, EXTRA) }
4147db96d56Sopenharmony_ci    | 'try' &&':' b=block ex[asdl_excepthandler_seq*]=except_block+ el=[else_block] f=[finally_block] { _PyAST_Try(b, ex, el, f, EXTRA) }
4157db96d56Sopenharmony_ci    | 'try' &&':' b=block ex[asdl_excepthandler_seq*]=except_star_block+ el=[else_block] f=[finally_block] { 
4167db96d56Sopenharmony_ci        CHECK_VERSION(stmt_ty, 11, "Exception groups are", 
4177db96d56Sopenharmony_ci                      _PyAST_TryStar(b, ex, el, f, EXTRA)) }
4187db96d56Sopenharmony_ci
4197db96d56Sopenharmony_ci
4207db96d56Sopenharmony_ci# Except statement
4217db96d56Sopenharmony_ci# ----------------
4227db96d56Sopenharmony_ci
4237db96d56Sopenharmony_ciexcept_block[excepthandler_ty]:
4247db96d56Sopenharmony_ci    | invalid_except_stmt_indent
4257db96d56Sopenharmony_ci    | 'except' e=expression t=['as' z=NAME { z }] ':' b=block {
4267db96d56Sopenharmony_ci        _PyAST_ExceptHandler(e, (t) ? ((expr_ty) t)->v.Name.id : NULL, b, EXTRA) }
4277db96d56Sopenharmony_ci    | 'except' ':' b=block { _PyAST_ExceptHandler(NULL, NULL, b, EXTRA) }
4287db96d56Sopenharmony_ci    | invalid_except_stmt
4297db96d56Sopenharmony_ciexcept_star_block[excepthandler_ty]:
4307db96d56Sopenharmony_ci    | invalid_except_star_stmt_indent
4317db96d56Sopenharmony_ci    | 'except' '*' e=expression t=['as' z=NAME { z }] ':' b=block {
4327db96d56Sopenharmony_ci        _PyAST_ExceptHandler(e, (t) ? ((expr_ty) t)->v.Name.id : NULL, b, EXTRA) }
4337db96d56Sopenharmony_ci    | invalid_except_stmt
4347db96d56Sopenharmony_cifinally_block[asdl_stmt_seq*]:
4357db96d56Sopenharmony_ci    | invalid_finally_stmt
4367db96d56Sopenharmony_ci    | 'finally' &&':' a=block { a }
4377db96d56Sopenharmony_ci
4387db96d56Sopenharmony_ci# Match statement
4397db96d56Sopenharmony_ci# ---------------
4407db96d56Sopenharmony_ci
4417db96d56Sopenharmony_cimatch_stmt[stmt_ty]:
4427db96d56Sopenharmony_ci    | "match" subject=subject_expr ':' NEWLINE INDENT cases[asdl_match_case_seq*]=case_block+ DEDENT {
4437db96d56Sopenharmony_ci        CHECK_VERSION(stmt_ty, 10, "Pattern matching is", _PyAST_Match(subject, cases, EXTRA)) }
4447db96d56Sopenharmony_ci    | invalid_match_stmt
4457db96d56Sopenharmony_ci
4467db96d56Sopenharmony_cisubject_expr[expr_ty]:
4477db96d56Sopenharmony_ci    | value=star_named_expression ',' values=star_named_expressions? {
4487db96d56Sopenharmony_ci        _PyAST_Tuple(CHECK(asdl_expr_seq*, _PyPegen_seq_insert_in_front(p, value, values)), Load, EXTRA) }
4497db96d56Sopenharmony_ci    | named_expression
4507db96d56Sopenharmony_ci
4517db96d56Sopenharmony_cicase_block[match_case_ty]:
4527db96d56Sopenharmony_ci    | invalid_case_block
4537db96d56Sopenharmony_ci    | "case" pattern=patterns guard=guard? ':' body=block {
4547db96d56Sopenharmony_ci        _PyAST_match_case(pattern, guard, body, p->arena) }
4557db96d56Sopenharmony_ci
4567db96d56Sopenharmony_ciguard[expr_ty]: 'if' guard=named_expression { guard }
4577db96d56Sopenharmony_ci
4587db96d56Sopenharmony_cipatterns[pattern_ty]:
4597db96d56Sopenharmony_ci    | patterns[asdl_pattern_seq*]=open_sequence_pattern {
4607db96d56Sopenharmony_ci        _PyAST_MatchSequence(patterns, EXTRA) }
4617db96d56Sopenharmony_ci    | pattern
4627db96d56Sopenharmony_ci
4637db96d56Sopenharmony_cipattern[pattern_ty]:
4647db96d56Sopenharmony_ci    | as_pattern
4657db96d56Sopenharmony_ci    | or_pattern
4667db96d56Sopenharmony_ci
4677db96d56Sopenharmony_cias_pattern[pattern_ty]:
4687db96d56Sopenharmony_ci    | pattern=or_pattern 'as' target=pattern_capture_target {
4697db96d56Sopenharmony_ci        _PyAST_MatchAs(pattern, target->v.Name.id, EXTRA) }
4707db96d56Sopenharmony_ci    | invalid_as_pattern
4717db96d56Sopenharmony_ci
4727db96d56Sopenharmony_cior_pattern[pattern_ty]:
4737db96d56Sopenharmony_ci    | patterns[asdl_pattern_seq*]='|'.closed_pattern+ {
4747db96d56Sopenharmony_ci        asdl_seq_LEN(patterns) == 1 ? asdl_seq_GET(patterns, 0) : _PyAST_MatchOr(patterns, EXTRA) }
4757db96d56Sopenharmony_ci
4767db96d56Sopenharmony_ciclosed_pattern[pattern_ty] (memo):
4777db96d56Sopenharmony_ci    | literal_pattern
4787db96d56Sopenharmony_ci    | capture_pattern
4797db96d56Sopenharmony_ci    | wildcard_pattern
4807db96d56Sopenharmony_ci    | value_pattern
4817db96d56Sopenharmony_ci    | group_pattern
4827db96d56Sopenharmony_ci    | sequence_pattern
4837db96d56Sopenharmony_ci    | mapping_pattern
4847db96d56Sopenharmony_ci    | class_pattern
4857db96d56Sopenharmony_ci
4867db96d56Sopenharmony_ci# Literal patterns are used for equality and identity constraints
4877db96d56Sopenharmony_ciliteral_pattern[pattern_ty]:
4887db96d56Sopenharmony_ci    | value=signed_number !('+' | '-') { _PyAST_MatchValue(value, EXTRA) }
4897db96d56Sopenharmony_ci    | value=complex_number { _PyAST_MatchValue(value, EXTRA) }
4907db96d56Sopenharmony_ci    | value=strings { _PyAST_MatchValue(value, EXTRA) }
4917db96d56Sopenharmony_ci    | 'None' { _PyAST_MatchSingleton(Py_None, EXTRA) }
4927db96d56Sopenharmony_ci    | 'True' { _PyAST_MatchSingleton(Py_True, EXTRA) }
4937db96d56Sopenharmony_ci    | 'False' { _PyAST_MatchSingleton(Py_False, EXTRA) }
4947db96d56Sopenharmony_ci
4957db96d56Sopenharmony_ci# Literal expressions are used to restrict permitted mapping pattern keys
4967db96d56Sopenharmony_ciliteral_expr[expr_ty]:
4977db96d56Sopenharmony_ci    | signed_number !('+' | '-')
4987db96d56Sopenharmony_ci    | complex_number
4997db96d56Sopenharmony_ci    | strings
5007db96d56Sopenharmony_ci    | 'None' { _PyAST_Constant(Py_None, NULL, EXTRA) }
5017db96d56Sopenharmony_ci    | 'True' { _PyAST_Constant(Py_True, NULL, EXTRA) }
5027db96d56Sopenharmony_ci    | 'False' { _PyAST_Constant(Py_False, NULL, EXTRA) }
5037db96d56Sopenharmony_ci
5047db96d56Sopenharmony_cicomplex_number[expr_ty]:
5057db96d56Sopenharmony_ci    | real=signed_real_number '+' imag=imaginary_number {
5067db96d56Sopenharmony_ci        _PyAST_BinOp(real, Add, imag, EXTRA) }
5077db96d56Sopenharmony_ci    | real=signed_real_number '-' imag=imaginary_number  {
5087db96d56Sopenharmony_ci        _PyAST_BinOp(real, Sub, imag, EXTRA) }
5097db96d56Sopenharmony_ci
5107db96d56Sopenharmony_cisigned_number[expr_ty]:
5117db96d56Sopenharmony_ci    | NUMBER
5127db96d56Sopenharmony_ci    | '-' number=NUMBER { _PyAST_UnaryOp(USub, number, EXTRA) }
5137db96d56Sopenharmony_ci
5147db96d56Sopenharmony_cisigned_real_number[expr_ty]:
5157db96d56Sopenharmony_ci    | real_number
5167db96d56Sopenharmony_ci    | '-' real=real_number { _PyAST_UnaryOp(USub, real, EXTRA) }
5177db96d56Sopenharmony_ci
5187db96d56Sopenharmony_cireal_number[expr_ty]:
5197db96d56Sopenharmony_ci    | real=NUMBER { _PyPegen_ensure_real(p, real) }
5207db96d56Sopenharmony_ci
5217db96d56Sopenharmony_ciimaginary_number[expr_ty]:
5227db96d56Sopenharmony_ci    | imag=NUMBER { _PyPegen_ensure_imaginary(p, imag) }
5237db96d56Sopenharmony_ci
5247db96d56Sopenharmony_cicapture_pattern[pattern_ty]:
5257db96d56Sopenharmony_ci    | target=pattern_capture_target { _PyAST_MatchAs(NULL, target->v.Name.id, EXTRA) }
5267db96d56Sopenharmony_ci
5277db96d56Sopenharmony_cipattern_capture_target[expr_ty]:
5287db96d56Sopenharmony_ci    | !"_" name=NAME !('.' | '(' | '=') {
5297db96d56Sopenharmony_ci        _PyPegen_set_expr_context(p, name, Store) }
5307db96d56Sopenharmony_ci
5317db96d56Sopenharmony_ciwildcard_pattern[pattern_ty]:
5327db96d56Sopenharmony_ci    | "_" { _PyAST_MatchAs(NULL, NULL, EXTRA) }
5337db96d56Sopenharmony_ci
5347db96d56Sopenharmony_civalue_pattern[pattern_ty]:
5357db96d56Sopenharmony_ci    | attr=attr !('.' | '(' | '=') { _PyAST_MatchValue(attr, EXTRA) }
5367db96d56Sopenharmony_ci
5377db96d56Sopenharmony_ciattr[expr_ty]:
5387db96d56Sopenharmony_ci    | value=name_or_attr '.' attr=NAME {
5397db96d56Sopenharmony_ci        _PyAST_Attribute(value, attr->v.Name.id, Load, EXTRA) }
5407db96d56Sopenharmony_ci
5417db96d56Sopenharmony_ciname_or_attr[expr_ty]:
5427db96d56Sopenharmony_ci    | attr
5437db96d56Sopenharmony_ci    | NAME
5447db96d56Sopenharmony_ci
5457db96d56Sopenharmony_cigroup_pattern[pattern_ty]:
5467db96d56Sopenharmony_ci    | '(' pattern=pattern ')' { pattern }
5477db96d56Sopenharmony_ci
5487db96d56Sopenharmony_cisequence_pattern[pattern_ty]:
5497db96d56Sopenharmony_ci    | '[' patterns=maybe_sequence_pattern? ']' { _PyAST_MatchSequence(patterns, EXTRA) }
5507db96d56Sopenharmony_ci    | '(' patterns=open_sequence_pattern? ')' { _PyAST_MatchSequence(patterns, EXTRA) }
5517db96d56Sopenharmony_ci
5527db96d56Sopenharmony_ciopen_sequence_pattern[asdl_seq*]:
5537db96d56Sopenharmony_ci    | pattern=maybe_star_pattern ',' patterns=maybe_sequence_pattern? {
5547db96d56Sopenharmony_ci        _PyPegen_seq_insert_in_front(p, pattern, patterns) }
5557db96d56Sopenharmony_ci
5567db96d56Sopenharmony_cimaybe_sequence_pattern[asdl_seq*]:
5577db96d56Sopenharmony_ci    | patterns=','.maybe_star_pattern+ ','? { patterns }
5587db96d56Sopenharmony_ci
5597db96d56Sopenharmony_cimaybe_star_pattern[pattern_ty]:
5607db96d56Sopenharmony_ci    | star_pattern
5617db96d56Sopenharmony_ci    | pattern
5627db96d56Sopenharmony_ci
5637db96d56Sopenharmony_cistar_pattern[pattern_ty] (memo):
5647db96d56Sopenharmony_ci    | '*' target=pattern_capture_target {
5657db96d56Sopenharmony_ci        _PyAST_MatchStar(target->v.Name.id, EXTRA) }
5667db96d56Sopenharmony_ci    | '*' wildcard_pattern {
5677db96d56Sopenharmony_ci        _PyAST_MatchStar(NULL, EXTRA) }
5687db96d56Sopenharmony_ci
5697db96d56Sopenharmony_cimapping_pattern[pattern_ty]:
5707db96d56Sopenharmony_ci    | '{' '}' {
5717db96d56Sopenharmony_ci        _PyAST_MatchMapping(NULL, NULL, NULL, EXTRA) }
5727db96d56Sopenharmony_ci    | '{' rest=double_star_pattern ','? '}' {
5737db96d56Sopenharmony_ci        _PyAST_MatchMapping(NULL, NULL, rest->v.Name.id, EXTRA) }
5747db96d56Sopenharmony_ci    | '{' items=items_pattern ',' rest=double_star_pattern ','? '}' {
5757db96d56Sopenharmony_ci        _PyAST_MatchMapping(
5767db96d56Sopenharmony_ci            CHECK(asdl_expr_seq*, _PyPegen_get_pattern_keys(p, items)),
5777db96d56Sopenharmony_ci            CHECK(asdl_pattern_seq*, _PyPegen_get_patterns(p, items)),
5787db96d56Sopenharmony_ci            rest->v.Name.id,
5797db96d56Sopenharmony_ci            EXTRA) }
5807db96d56Sopenharmony_ci    | '{' items=items_pattern ','? '}' {
5817db96d56Sopenharmony_ci        _PyAST_MatchMapping(
5827db96d56Sopenharmony_ci            CHECK(asdl_expr_seq*, _PyPegen_get_pattern_keys(p, items)),
5837db96d56Sopenharmony_ci            CHECK(asdl_pattern_seq*, _PyPegen_get_patterns(p, items)),
5847db96d56Sopenharmony_ci            NULL,
5857db96d56Sopenharmony_ci            EXTRA) }
5867db96d56Sopenharmony_ci
5877db96d56Sopenharmony_ciitems_pattern[asdl_seq*]:
5887db96d56Sopenharmony_ci    | ','.key_value_pattern+
5897db96d56Sopenharmony_ci
5907db96d56Sopenharmony_cikey_value_pattern[KeyPatternPair*]:
5917db96d56Sopenharmony_ci    | key=(literal_expr | attr) ':' pattern=pattern {
5927db96d56Sopenharmony_ci        _PyPegen_key_pattern_pair(p, key, pattern) }
5937db96d56Sopenharmony_ci
5947db96d56Sopenharmony_cidouble_star_pattern[expr_ty]:
5957db96d56Sopenharmony_ci    | '**' target=pattern_capture_target { target }
5967db96d56Sopenharmony_ci
5977db96d56Sopenharmony_ciclass_pattern[pattern_ty]:
5987db96d56Sopenharmony_ci    | cls=name_or_attr '(' ')' {
5997db96d56Sopenharmony_ci        _PyAST_MatchClass(cls, NULL, NULL, NULL, EXTRA) }
6007db96d56Sopenharmony_ci    | cls=name_or_attr '(' patterns=positional_patterns ','? ')' {
6017db96d56Sopenharmony_ci        _PyAST_MatchClass(cls, patterns, NULL, NULL, EXTRA) }
6027db96d56Sopenharmony_ci    | cls=name_or_attr '(' keywords=keyword_patterns ','? ')' {
6037db96d56Sopenharmony_ci        _PyAST_MatchClass(
6047db96d56Sopenharmony_ci            cls, NULL,
6057db96d56Sopenharmony_ci            CHECK(asdl_identifier_seq*, _PyPegen_map_names_to_ids(p,
6067db96d56Sopenharmony_ci                CHECK(asdl_expr_seq*, _PyPegen_get_pattern_keys(p, keywords)))),
6077db96d56Sopenharmony_ci            CHECK(asdl_pattern_seq*, _PyPegen_get_patterns(p, keywords)),
6087db96d56Sopenharmony_ci            EXTRA) }
6097db96d56Sopenharmony_ci    | cls=name_or_attr '(' patterns=positional_patterns ',' keywords=keyword_patterns ','? ')' {
6107db96d56Sopenharmony_ci        _PyAST_MatchClass(
6117db96d56Sopenharmony_ci            cls,
6127db96d56Sopenharmony_ci            patterns,
6137db96d56Sopenharmony_ci            CHECK(asdl_identifier_seq*, _PyPegen_map_names_to_ids(p,
6147db96d56Sopenharmony_ci                CHECK(asdl_expr_seq*, _PyPegen_get_pattern_keys(p, keywords)))),
6157db96d56Sopenharmony_ci            CHECK(asdl_pattern_seq*, _PyPegen_get_patterns(p, keywords)),
6167db96d56Sopenharmony_ci            EXTRA) }
6177db96d56Sopenharmony_ci    | invalid_class_pattern
6187db96d56Sopenharmony_ci
6197db96d56Sopenharmony_cipositional_patterns[asdl_pattern_seq*]:
6207db96d56Sopenharmony_ci    | args[asdl_pattern_seq*]=','.pattern+ { args }
6217db96d56Sopenharmony_ci
6227db96d56Sopenharmony_cikeyword_patterns[asdl_seq*]:
6237db96d56Sopenharmony_ci    | ','.keyword_pattern+
6247db96d56Sopenharmony_ci
6257db96d56Sopenharmony_cikeyword_pattern[KeyPatternPair*]:
6267db96d56Sopenharmony_ci    | arg=NAME '=' value=pattern { _PyPegen_key_pattern_pair(p, arg, value) }
6277db96d56Sopenharmony_ci
6287db96d56Sopenharmony_ci# EXPRESSIONS
6297db96d56Sopenharmony_ci# -----------
6307db96d56Sopenharmony_ci
6317db96d56Sopenharmony_ciexpressions[expr_ty]:
6327db96d56Sopenharmony_ci    | a=expression b=(',' c=expression { c })+ [','] {
6337db96d56Sopenharmony_ci        _PyAST_Tuple(CHECK(asdl_expr_seq*, _PyPegen_seq_insert_in_front(p, a, b)), Load, EXTRA) }
6347db96d56Sopenharmony_ci    | a=expression ',' { _PyAST_Tuple(CHECK(asdl_expr_seq*, _PyPegen_singleton_seq(p, a)), Load, EXTRA) }
6357db96d56Sopenharmony_ci    | expression
6367db96d56Sopenharmony_ci
6377db96d56Sopenharmony_ciexpression[expr_ty] (memo):
6387db96d56Sopenharmony_ci    | invalid_expression
6397db96d56Sopenharmony_ci    | invalid_legacy_expression
6407db96d56Sopenharmony_ci    | a=disjunction 'if' b=disjunction 'else' c=expression { _PyAST_IfExp(b, a, c, EXTRA) }
6417db96d56Sopenharmony_ci    | disjunction
6427db96d56Sopenharmony_ci    | lambdef
6437db96d56Sopenharmony_ci
6447db96d56Sopenharmony_ciyield_expr[expr_ty]:
6457db96d56Sopenharmony_ci    | 'yield' 'from' a=expression { _PyAST_YieldFrom(a, EXTRA) }
6467db96d56Sopenharmony_ci    | 'yield' a=[star_expressions] { _PyAST_Yield(a, EXTRA) }
6477db96d56Sopenharmony_ci
6487db96d56Sopenharmony_cistar_expressions[expr_ty]:
6497db96d56Sopenharmony_ci    | a=star_expression b=(',' c=star_expression { c })+ [','] {
6507db96d56Sopenharmony_ci        _PyAST_Tuple(CHECK(asdl_expr_seq*, _PyPegen_seq_insert_in_front(p, a, b)), Load, EXTRA) }
6517db96d56Sopenharmony_ci    | a=star_expression ',' { _PyAST_Tuple(CHECK(asdl_expr_seq*, _PyPegen_singleton_seq(p, a)), Load, EXTRA) }
6527db96d56Sopenharmony_ci    | star_expression
6537db96d56Sopenharmony_ci
6547db96d56Sopenharmony_cistar_expression[expr_ty] (memo):
6557db96d56Sopenharmony_ci    | '*' a=bitwise_or { _PyAST_Starred(a, Load, EXTRA) }
6567db96d56Sopenharmony_ci    | expression
6577db96d56Sopenharmony_ci
6587db96d56Sopenharmony_cistar_named_expressions[asdl_expr_seq*]: a[asdl_expr_seq*]=','.star_named_expression+ [','] { a }
6597db96d56Sopenharmony_ci
6607db96d56Sopenharmony_cistar_named_expression[expr_ty]:
6617db96d56Sopenharmony_ci    | '*' a=bitwise_or { _PyAST_Starred(a, Load, EXTRA) }
6627db96d56Sopenharmony_ci    | named_expression
6637db96d56Sopenharmony_ci
6647db96d56Sopenharmony_ciassignment_expression[expr_ty]:
6657db96d56Sopenharmony_ci    | a=NAME ':=' ~ b=expression {
6667db96d56Sopenharmony_ci        CHECK_VERSION(expr_ty, 8, "Assignment expressions are",
6677db96d56Sopenharmony_ci        _PyAST_NamedExpr(CHECK(expr_ty, _PyPegen_set_expr_context(p, a, Store)), b, EXTRA)) }
6687db96d56Sopenharmony_ci
6697db96d56Sopenharmony_cinamed_expression[expr_ty]:
6707db96d56Sopenharmony_ci    | assignment_expression
6717db96d56Sopenharmony_ci    | invalid_named_expression
6727db96d56Sopenharmony_ci    | expression !':='
6737db96d56Sopenharmony_ci
6747db96d56Sopenharmony_cidisjunction[expr_ty] (memo):
6757db96d56Sopenharmony_ci    | a=conjunction b=('or' c=conjunction { c })+ { _PyAST_BoolOp(
6767db96d56Sopenharmony_ci        Or,
6777db96d56Sopenharmony_ci        CHECK(asdl_expr_seq*, _PyPegen_seq_insert_in_front(p, a, b)),
6787db96d56Sopenharmony_ci        EXTRA) }
6797db96d56Sopenharmony_ci    | conjunction
6807db96d56Sopenharmony_ci
6817db96d56Sopenharmony_ciconjunction[expr_ty] (memo):
6827db96d56Sopenharmony_ci    | a=inversion b=('and' c=inversion { c })+ { _PyAST_BoolOp(
6837db96d56Sopenharmony_ci        And,
6847db96d56Sopenharmony_ci        CHECK(asdl_expr_seq*, _PyPegen_seq_insert_in_front(p, a, b)),
6857db96d56Sopenharmony_ci        EXTRA) }
6867db96d56Sopenharmony_ci    | inversion
6877db96d56Sopenharmony_ci
6887db96d56Sopenharmony_ciinversion[expr_ty] (memo):
6897db96d56Sopenharmony_ci    | 'not' a=inversion { _PyAST_UnaryOp(Not, a, EXTRA) }
6907db96d56Sopenharmony_ci    | comparison
6917db96d56Sopenharmony_ci
6927db96d56Sopenharmony_ci# Comparison operators
6937db96d56Sopenharmony_ci# --------------------
6947db96d56Sopenharmony_ci
6957db96d56Sopenharmony_cicomparison[expr_ty]:
6967db96d56Sopenharmony_ci    | a=bitwise_or b=compare_op_bitwise_or_pair+ {
6977db96d56Sopenharmony_ci        _PyAST_Compare(
6987db96d56Sopenharmony_ci            a,
6997db96d56Sopenharmony_ci            CHECK(asdl_int_seq*, _PyPegen_get_cmpops(p, b)),
7007db96d56Sopenharmony_ci            CHECK(asdl_expr_seq*, _PyPegen_get_exprs(p, b)),
7017db96d56Sopenharmony_ci            EXTRA) }
7027db96d56Sopenharmony_ci    | bitwise_or
7037db96d56Sopenharmony_ci
7047db96d56Sopenharmony_cicompare_op_bitwise_or_pair[CmpopExprPair*]:
7057db96d56Sopenharmony_ci    | eq_bitwise_or
7067db96d56Sopenharmony_ci    | noteq_bitwise_or
7077db96d56Sopenharmony_ci    | lte_bitwise_or
7087db96d56Sopenharmony_ci    | lt_bitwise_or
7097db96d56Sopenharmony_ci    | gte_bitwise_or
7107db96d56Sopenharmony_ci    | gt_bitwise_or
7117db96d56Sopenharmony_ci    | notin_bitwise_or
7127db96d56Sopenharmony_ci    | in_bitwise_or
7137db96d56Sopenharmony_ci    | isnot_bitwise_or
7147db96d56Sopenharmony_ci    | is_bitwise_or
7157db96d56Sopenharmony_ci
7167db96d56Sopenharmony_cieq_bitwise_or[CmpopExprPair*]: '==' a=bitwise_or { _PyPegen_cmpop_expr_pair(p, Eq, a) }
7177db96d56Sopenharmony_cinoteq_bitwise_or[CmpopExprPair*]:
7187db96d56Sopenharmony_ci    | (tok='!=' { _PyPegen_check_barry_as_flufl(p, tok) ? NULL : tok}) a=bitwise_or {_PyPegen_cmpop_expr_pair(p, NotEq, a) }
7197db96d56Sopenharmony_cilte_bitwise_or[CmpopExprPair*]: '<=' a=bitwise_or { _PyPegen_cmpop_expr_pair(p, LtE, a) }
7207db96d56Sopenharmony_cilt_bitwise_or[CmpopExprPair*]: '<' a=bitwise_or { _PyPegen_cmpop_expr_pair(p, Lt, a) }
7217db96d56Sopenharmony_cigte_bitwise_or[CmpopExprPair*]: '>=' a=bitwise_or { _PyPegen_cmpop_expr_pair(p, GtE, a) }
7227db96d56Sopenharmony_cigt_bitwise_or[CmpopExprPair*]: '>' a=bitwise_or { _PyPegen_cmpop_expr_pair(p, Gt, a) }
7237db96d56Sopenharmony_cinotin_bitwise_or[CmpopExprPair*]: 'not' 'in' a=bitwise_or { _PyPegen_cmpop_expr_pair(p, NotIn, a) }
7247db96d56Sopenharmony_ciin_bitwise_or[CmpopExprPair*]: 'in' a=bitwise_or { _PyPegen_cmpop_expr_pair(p, In, a) }
7257db96d56Sopenharmony_ciisnot_bitwise_or[CmpopExprPair*]: 'is' 'not' a=bitwise_or { _PyPegen_cmpop_expr_pair(p, IsNot, a) }
7267db96d56Sopenharmony_ciis_bitwise_or[CmpopExprPair*]: 'is' a=bitwise_or { _PyPegen_cmpop_expr_pair(p, Is, a) }
7277db96d56Sopenharmony_ci
7287db96d56Sopenharmony_ci# Bitwise operators
7297db96d56Sopenharmony_ci# -----------------
7307db96d56Sopenharmony_ci
7317db96d56Sopenharmony_cibitwise_or[expr_ty]:
7327db96d56Sopenharmony_ci    | a=bitwise_or '|' b=bitwise_xor { _PyAST_BinOp(a, BitOr, b, EXTRA) }
7337db96d56Sopenharmony_ci    | bitwise_xor
7347db96d56Sopenharmony_ci
7357db96d56Sopenharmony_cibitwise_xor[expr_ty]:
7367db96d56Sopenharmony_ci    | a=bitwise_xor '^' b=bitwise_and { _PyAST_BinOp(a, BitXor, b, EXTRA) }
7377db96d56Sopenharmony_ci    | bitwise_and
7387db96d56Sopenharmony_ci
7397db96d56Sopenharmony_cibitwise_and[expr_ty]:
7407db96d56Sopenharmony_ci    | a=bitwise_and '&' b=shift_expr { _PyAST_BinOp(a, BitAnd, b, EXTRA) }
7417db96d56Sopenharmony_ci    | shift_expr
7427db96d56Sopenharmony_ci
7437db96d56Sopenharmony_cishift_expr[expr_ty]:
7447db96d56Sopenharmony_ci    | a=shift_expr '<<' b=sum { _PyAST_BinOp(a, LShift, b, EXTRA) }
7457db96d56Sopenharmony_ci    | a=shift_expr '>>' b=sum { _PyAST_BinOp(a, RShift, b, EXTRA) }
7467db96d56Sopenharmony_ci    | sum
7477db96d56Sopenharmony_ci
7487db96d56Sopenharmony_ci# Arithmetic operators
7497db96d56Sopenharmony_ci# --------------------
7507db96d56Sopenharmony_ci
7517db96d56Sopenharmony_cisum[expr_ty]:
7527db96d56Sopenharmony_ci    | a=sum '+' b=term { _PyAST_BinOp(a, Add, b, EXTRA) }
7537db96d56Sopenharmony_ci    | a=sum '-' b=term { _PyAST_BinOp(a, Sub, b, EXTRA) }
7547db96d56Sopenharmony_ci    | term
7557db96d56Sopenharmony_ci
7567db96d56Sopenharmony_citerm[expr_ty]:
7577db96d56Sopenharmony_ci    | a=term '*' b=factor { _PyAST_BinOp(a, Mult, b, EXTRA) }
7587db96d56Sopenharmony_ci    | a=term '/' b=factor { _PyAST_BinOp(a, Div, b, EXTRA) }
7597db96d56Sopenharmony_ci    | a=term '//' b=factor { _PyAST_BinOp(a, FloorDiv, b, EXTRA) }
7607db96d56Sopenharmony_ci    | a=term '%' b=factor { _PyAST_BinOp(a, Mod, b, EXTRA) }
7617db96d56Sopenharmony_ci    | a=term '@' b=factor { CHECK_VERSION(expr_ty, 5, "The '@' operator is", _PyAST_BinOp(a, MatMult, b, EXTRA)) }
7627db96d56Sopenharmony_ci    | factor
7637db96d56Sopenharmony_ci
7647db96d56Sopenharmony_cifactor[expr_ty] (memo):
7657db96d56Sopenharmony_ci    | '+' a=factor { _PyAST_UnaryOp(UAdd, a, EXTRA) }
7667db96d56Sopenharmony_ci    | '-' a=factor { _PyAST_UnaryOp(USub, a, EXTRA) }
7677db96d56Sopenharmony_ci    | '~' a=factor { _PyAST_UnaryOp(Invert, a, EXTRA) }
7687db96d56Sopenharmony_ci    | power
7697db96d56Sopenharmony_ci
7707db96d56Sopenharmony_cipower[expr_ty]:
7717db96d56Sopenharmony_ci    | a=await_primary '**' b=factor { _PyAST_BinOp(a, Pow, b, EXTRA) }
7727db96d56Sopenharmony_ci    | await_primary
7737db96d56Sopenharmony_ci
7747db96d56Sopenharmony_ci# Primary elements
7757db96d56Sopenharmony_ci# ----------------
7767db96d56Sopenharmony_ci
7777db96d56Sopenharmony_ci# Primary elements are things like "obj.something.something", "obj[something]", "obj(something)", "obj" ...
7787db96d56Sopenharmony_ci
7797db96d56Sopenharmony_ciawait_primary[expr_ty] (memo):
7807db96d56Sopenharmony_ci    | AWAIT a=primary { CHECK_VERSION(expr_ty, 5, "Await expressions are", _PyAST_Await(a, EXTRA)) }
7817db96d56Sopenharmony_ci    | primary
7827db96d56Sopenharmony_ci
7837db96d56Sopenharmony_ciprimary[expr_ty]:
7847db96d56Sopenharmony_ci    | a=primary '.' b=NAME { _PyAST_Attribute(a, b->v.Name.id, Load, EXTRA) }
7857db96d56Sopenharmony_ci    | a=primary b=genexp { _PyAST_Call(a, CHECK(asdl_expr_seq*, (asdl_expr_seq*)_PyPegen_singleton_seq(p, b)), NULL, EXTRA) }
7867db96d56Sopenharmony_ci    | a=primary '(' b=[arguments] ')' {
7877db96d56Sopenharmony_ci        _PyAST_Call(a,
7887db96d56Sopenharmony_ci                 (b) ? ((expr_ty) b)->v.Call.args : NULL,
7897db96d56Sopenharmony_ci                 (b) ? ((expr_ty) b)->v.Call.keywords : NULL,
7907db96d56Sopenharmony_ci                 EXTRA) }
7917db96d56Sopenharmony_ci    | a=primary '[' b=slices ']' { _PyAST_Subscript(a, b, Load, EXTRA) }
7927db96d56Sopenharmony_ci    | atom
7937db96d56Sopenharmony_ci
7947db96d56Sopenharmony_cislices[expr_ty]:
7957db96d56Sopenharmony_ci    | a=slice !',' { a }
7967db96d56Sopenharmony_ci    | a[asdl_expr_seq*]=','.(slice | starred_expression)+ [','] { _PyAST_Tuple(a, Load, EXTRA) }
7977db96d56Sopenharmony_ci
7987db96d56Sopenharmony_cislice[expr_ty]:
7997db96d56Sopenharmony_ci    | a=[expression] ':' b=[expression] c=[':' d=[expression] { d }] { _PyAST_Slice(a, b, c, EXTRA) }
8007db96d56Sopenharmony_ci    | a=named_expression { a }
8017db96d56Sopenharmony_ci
8027db96d56Sopenharmony_ciatom[expr_ty]:
8037db96d56Sopenharmony_ci    | NAME
8047db96d56Sopenharmony_ci    | 'True' { _PyAST_Constant(Py_True, NULL, EXTRA) }
8057db96d56Sopenharmony_ci    | 'False' { _PyAST_Constant(Py_False, NULL, EXTRA) }
8067db96d56Sopenharmony_ci    | 'None' { _PyAST_Constant(Py_None, NULL, EXTRA) }
8077db96d56Sopenharmony_ci    | &STRING strings
8087db96d56Sopenharmony_ci    | NUMBER
8097db96d56Sopenharmony_ci    | &'(' (tuple | group | genexp)
8107db96d56Sopenharmony_ci    | &'[' (list | listcomp)
8117db96d56Sopenharmony_ci    | &'{' (dict | set | dictcomp | setcomp)
8127db96d56Sopenharmony_ci    | '...' { _PyAST_Constant(Py_Ellipsis, NULL, EXTRA) }
8137db96d56Sopenharmony_ci
8147db96d56Sopenharmony_cigroup[expr_ty]:
8157db96d56Sopenharmony_ci    | '(' a=(yield_expr | named_expression) ')' { a }
8167db96d56Sopenharmony_ci    | invalid_group
8177db96d56Sopenharmony_ci
8187db96d56Sopenharmony_ci# Lambda functions
8197db96d56Sopenharmony_ci# ----------------
8207db96d56Sopenharmony_ci
8217db96d56Sopenharmony_cilambdef[expr_ty]:
8227db96d56Sopenharmony_ci    | 'lambda' a=[lambda_params] ':' b=expression {
8237db96d56Sopenharmony_ci        _PyAST_Lambda((a) ? a : CHECK(arguments_ty, _PyPegen_empty_arguments(p)), b, EXTRA) }
8247db96d56Sopenharmony_ci
8257db96d56Sopenharmony_cilambda_params[arguments_ty]:
8267db96d56Sopenharmony_ci    | invalid_lambda_parameters
8277db96d56Sopenharmony_ci    | lambda_parameters
8287db96d56Sopenharmony_ci
8297db96d56Sopenharmony_ci# lambda_parameters etc. duplicates parameters but without annotations
8307db96d56Sopenharmony_ci# or type comments, and if there's no comma after a parameter, we expect
8317db96d56Sopenharmony_ci# a colon, not a close parenthesis.  (For more, see parameters above.)
8327db96d56Sopenharmony_ci#
8337db96d56Sopenharmony_cilambda_parameters[arguments_ty]:
8347db96d56Sopenharmony_ci    | a=lambda_slash_no_default b[asdl_arg_seq*]=lambda_param_no_default* c=lambda_param_with_default* d=[lambda_star_etc] {
8357db96d56Sopenharmony_ci        CHECK_VERSION(arguments_ty, 8, "Positional-only parameters are", _PyPegen_make_arguments(p, a, NULL, b, c, d)) }
8367db96d56Sopenharmony_ci    | a=lambda_slash_with_default b=lambda_param_with_default* c=[lambda_star_etc] {
8377db96d56Sopenharmony_ci        CHECK_VERSION(arguments_ty, 8, "Positional-only parameters are", _PyPegen_make_arguments(p, NULL, a, NULL, b, c)) }
8387db96d56Sopenharmony_ci    | a[asdl_arg_seq*]=lambda_param_no_default+ b=lambda_param_with_default* c=[lambda_star_etc] {
8397db96d56Sopenharmony_ci        _PyPegen_make_arguments(p, NULL, NULL, a, b, c) }
8407db96d56Sopenharmony_ci    | a=lambda_param_with_default+ b=[lambda_star_etc] { _PyPegen_make_arguments(p, NULL, NULL, NULL, a, b)}
8417db96d56Sopenharmony_ci    | a=lambda_star_etc { _PyPegen_make_arguments(p, NULL, NULL, NULL, NULL, a) }
8427db96d56Sopenharmony_ci
8437db96d56Sopenharmony_cilambda_slash_no_default[asdl_arg_seq*]:
8447db96d56Sopenharmony_ci    | a[asdl_arg_seq*]=lambda_param_no_default+ '/' ',' { a }
8457db96d56Sopenharmony_ci    | a[asdl_arg_seq*]=lambda_param_no_default+ '/' &':' { a }
8467db96d56Sopenharmony_ci
8477db96d56Sopenharmony_cilambda_slash_with_default[SlashWithDefault*]:
8487db96d56Sopenharmony_ci    | a=lambda_param_no_default* b=lambda_param_with_default+ '/' ',' { _PyPegen_slash_with_default(p, (asdl_arg_seq *)a, b) }
8497db96d56Sopenharmony_ci    | a=lambda_param_no_default* b=lambda_param_with_default+ '/' &':' { _PyPegen_slash_with_default(p, (asdl_arg_seq *)a, b) }
8507db96d56Sopenharmony_ci
8517db96d56Sopenharmony_cilambda_star_etc[StarEtc*]:
8527db96d56Sopenharmony_ci    | invalid_lambda_star_etc
8537db96d56Sopenharmony_ci    | '*' a=lambda_param_no_default b=lambda_param_maybe_default* c=[lambda_kwds] {
8547db96d56Sopenharmony_ci        _PyPegen_star_etc(p, a, b, c) }
8557db96d56Sopenharmony_ci    | '*' ',' b=lambda_param_maybe_default+ c=[lambda_kwds] {
8567db96d56Sopenharmony_ci        _PyPegen_star_etc(p, NULL, b, c) }
8577db96d56Sopenharmony_ci    | a=lambda_kwds { _PyPegen_star_etc(p, NULL, NULL, a) }
8587db96d56Sopenharmony_ci
8597db96d56Sopenharmony_cilambda_kwds[arg_ty]:
8607db96d56Sopenharmony_ci    | invalid_lambda_kwds
8617db96d56Sopenharmony_ci    | '**' a=lambda_param_no_default { a }
8627db96d56Sopenharmony_ci
8637db96d56Sopenharmony_cilambda_param_no_default[arg_ty]:
8647db96d56Sopenharmony_ci    | a=lambda_param ',' { a }
8657db96d56Sopenharmony_ci    | a=lambda_param &':' { a }
8667db96d56Sopenharmony_cilambda_param_with_default[NameDefaultPair*]:
8677db96d56Sopenharmony_ci    | a=lambda_param c=default ',' { _PyPegen_name_default_pair(p, a, c, NULL) }
8687db96d56Sopenharmony_ci    | a=lambda_param c=default &':' { _PyPegen_name_default_pair(p, a, c, NULL) }
8697db96d56Sopenharmony_cilambda_param_maybe_default[NameDefaultPair*]:
8707db96d56Sopenharmony_ci    | a=lambda_param c=default? ',' { _PyPegen_name_default_pair(p, a, c, NULL) }
8717db96d56Sopenharmony_ci    | a=lambda_param c=default? &':' { _PyPegen_name_default_pair(p, a, c, NULL) }
8727db96d56Sopenharmony_cilambda_param[arg_ty]: a=NAME { _PyAST_arg(a->v.Name.id, NULL, NULL, EXTRA) }
8737db96d56Sopenharmony_ci
8747db96d56Sopenharmony_ci# LITERALS
8757db96d56Sopenharmony_ci# ========
8767db96d56Sopenharmony_ci
8777db96d56Sopenharmony_cistrings[expr_ty] (memo): a=STRING+ { _PyPegen_concatenate_strings(p, a) }
8787db96d56Sopenharmony_ci
8797db96d56Sopenharmony_cilist[expr_ty]:
8807db96d56Sopenharmony_ci    | '[' a=[star_named_expressions] ']' { _PyAST_List(a, Load, EXTRA) }
8817db96d56Sopenharmony_ci
8827db96d56Sopenharmony_cituple[expr_ty]:
8837db96d56Sopenharmony_ci    | '(' a=[y=star_named_expression ',' z=[star_named_expressions] { _PyPegen_seq_insert_in_front(p, y, z) } ] ')' {
8847db96d56Sopenharmony_ci        _PyAST_Tuple(a, Load, EXTRA) }
8857db96d56Sopenharmony_ci
8867db96d56Sopenharmony_ciset[expr_ty]: '{' a=star_named_expressions '}' { _PyAST_Set(a, EXTRA) }
8877db96d56Sopenharmony_ci
8887db96d56Sopenharmony_ci# Dicts
8897db96d56Sopenharmony_ci# -----
8907db96d56Sopenharmony_ci
8917db96d56Sopenharmony_cidict[expr_ty]:
8927db96d56Sopenharmony_ci    | '{' a=[double_starred_kvpairs] '}' {
8937db96d56Sopenharmony_ci        _PyAST_Dict(
8947db96d56Sopenharmony_ci            CHECK(asdl_expr_seq*, _PyPegen_get_keys(p, a)),
8957db96d56Sopenharmony_ci            CHECK(asdl_expr_seq*, _PyPegen_get_values(p, a)),
8967db96d56Sopenharmony_ci            EXTRA) }
8977db96d56Sopenharmony_ci    | '{' invalid_double_starred_kvpairs '}'
8987db96d56Sopenharmony_ci
8997db96d56Sopenharmony_cidouble_starred_kvpairs[asdl_seq*]: a=','.double_starred_kvpair+ [','] { a }
9007db96d56Sopenharmony_ci
9017db96d56Sopenharmony_cidouble_starred_kvpair[KeyValuePair*]:
9027db96d56Sopenharmony_ci    | '**' a=bitwise_or { _PyPegen_key_value_pair(p, NULL, a) }
9037db96d56Sopenharmony_ci    | kvpair
9047db96d56Sopenharmony_ci
9057db96d56Sopenharmony_cikvpair[KeyValuePair*]: a=expression ':' b=expression { _PyPegen_key_value_pair(p, a, b) }
9067db96d56Sopenharmony_ci
9077db96d56Sopenharmony_ci# Comprehensions & Generators
9087db96d56Sopenharmony_ci# ---------------------------
9097db96d56Sopenharmony_ci
9107db96d56Sopenharmony_cifor_if_clauses[asdl_comprehension_seq*]:
9117db96d56Sopenharmony_ci    | a[asdl_comprehension_seq*]=for_if_clause+ { a }
9127db96d56Sopenharmony_ci
9137db96d56Sopenharmony_cifor_if_clause[comprehension_ty]:
9147db96d56Sopenharmony_ci    | ASYNC 'for' a=star_targets 'in' ~ b=disjunction c[asdl_expr_seq*]=('if' z=disjunction { z })* {
9157db96d56Sopenharmony_ci        CHECK_VERSION(comprehension_ty, 6, "Async comprehensions are", _PyAST_comprehension(a, b, c, 1, p->arena)) }
9167db96d56Sopenharmony_ci    | 'for' a=star_targets 'in' ~ b=disjunction c[asdl_expr_seq*]=('if' z=disjunction { z })* {
9177db96d56Sopenharmony_ci        _PyAST_comprehension(a, b, c, 0, p->arena) }
9187db96d56Sopenharmony_ci    | invalid_for_target
9197db96d56Sopenharmony_ci
9207db96d56Sopenharmony_cilistcomp[expr_ty]:
9217db96d56Sopenharmony_ci    | '[' a=named_expression b=for_if_clauses ']' { _PyAST_ListComp(a, b, EXTRA) }
9227db96d56Sopenharmony_ci    | invalid_comprehension
9237db96d56Sopenharmony_ci
9247db96d56Sopenharmony_cisetcomp[expr_ty]:
9257db96d56Sopenharmony_ci    | '{' a=named_expression b=for_if_clauses '}' { _PyAST_SetComp(a, b, EXTRA) }
9267db96d56Sopenharmony_ci    | invalid_comprehension
9277db96d56Sopenharmony_ci
9287db96d56Sopenharmony_cigenexp[expr_ty]:
9297db96d56Sopenharmony_ci    | '(' a=( assignment_expression | expression !':=') b=for_if_clauses ')' { _PyAST_GeneratorExp(a, b, EXTRA) }
9307db96d56Sopenharmony_ci    | invalid_comprehension
9317db96d56Sopenharmony_ci
9327db96d56Sopenharmony_cidictcomp[expr_ty]:
9337db96d56Sopenharmony_ci    | '{' a=kvpair b=for_if_clauses '}' { _PyAST_DictComp(a->key, a->value, b, EXTRA) }
9347db96d56Sopenharmony_ci    | invalid_dict_comprehension
9357db96d56Sopenharmony_ci
9367db96d56Sopenharmony_ci# FUNCTION CALL ARGUMENTS
9377db96d56Sopenharmony_ci# =======================
9387db96d56Sopenharmony_ci
9397db96d56Sopenharmony_ciarguments[expr_ty] (memo):
9407db96d56Sopenharmony_ci    | a=args [','] &')' { a }
9417db96d56Sopenharmony_ci    | invalid_arguments
9427db96d56Sopenharmony_ci
9437db96d56Sopenharmony_ciargs[expr_ty]:
9447db96d56Sopenharmony_ci    | a[asdl_expr_seq*]=','.(starred_expression | ( assignment_expression | expression !':=') !'=')+ b=[',' k=kwargs {k}] {
9457db96d56Sopenharmony_ci        _PyPegen_collect_call_seqs(p, a, b, EXTRA) }
9467db96d56Sopenharmony_ci    | a=kwargs { _PyAST_Call(_PyPegen_dummy_name(p),
9477db96d56Sopenharmony_ci                          CHECK_NULL_ALLOWED(asdl_expr_seq*, _PyPegen_seq_extract_starred_exprs(p, a)),
9487db96d56Sopenharmony_ci                          CHECK_NULL_ALLOWED(asdl_keyword_seq*, _PyPegen_seq_delete_starred_exprs(p, a)),
9497db96d56Sopenharmony_ci                          EXTRA) }
9507db96d56Sopenharmony_ci
9517db96d56Sopenharmony_cikwargs[asdl_seq*]:
9527db96d56Sopenharmony_ci    | a=','.kwarg_or_starred+ ',' b=','.kwarg_or_double_starred+ { _PyPegen_join_sequences(p, a, b) }
9537db96d56Sopenharmony_ci    | ','.kwarg_or_starred+
9547db96d56Sopenharmony_ci    | ','.kwarg_or_double_starred+
9557db96d56Sopenharmony_ci
9567db96d56Sopenharmony_cistarred_expression[expr_ty]:
9577db96d56Sopenharmony_ci    | '*' a=expression { _PyAST_Starred(a, Load, EXTRA) }
9587db96d56Sopenharmony_ci
9597db96d56Sopenharmony_cikwarg_or_starred[KeywordOrStarred*]:
9607db96d56Sopenharmony_ci    | invalid_kwarg
9617db96d56Sopenharmony_ci    | a=NAME '=' b=expression {
9627db96d56Sopenharmony_ci        _PyPegen_keyword_or_starred(p, CHECK(keyword_ty, _PyAST_keyword(a->v.Name.id, b, EXTRA)), 1) }
9637db96d56Sopenharmony_ci    | a=starred_expression { _PyPegen_keyword_or_starred(p, a, 0) }
9647db96d56Sopenharmony_ci
9657db96d56Sopenharmony_cikwarg_or_double_starred[KeywordOrStarred*]:
9667db96d56Sopenharmony_ci    | invalid_kwarg
9677db96d56Sopenharmony_ci    | a=NAME '=' b=expression {
9687db96d56Sopenharmony_ci        _PyPegen_keyword_or_starred(p, CHECK(keyword_ty, _PyAST_keyword(a->v.Name.id, b, EXTRA)), 1) }
9697db96d56Sopenharmony_ci    | '**' a=expression { _PyPegen_keyword_or_starred(p, CHECK(keyword_ty, _PyAST_keyword(NULL, a, EXTRA)), 1) }
9707db96d56Sopenharmony_ci
9717db96d56Sopenharmony_ci# ASSIGNMENT TARGETS
9727db96d56Sopenharmony_ci# ==================
9737db96d56Sopenharmony_ci
9747db96d56Sopenharmony_ci# Generic targets
9757db96d56Sopenharmony_ci# ---------------
9767db96d56Sopenharmony_ci
9777db96d56Sopenharmony_ci# NOTE: star_targets may contain *bitwise_or, targets may not.
9787db96d56Sopenharmony_cistar_targets[expr_ty]:
9797db96d56Sopenharmony_ci    | a=star_target !',' { a }
9807db96d56Sopenharmony_ci    | a=star_target b=(',' c=star_target { c })* [','] {
9817db96d56Sopenharmony_ci        _PyAST_Tuple(CHECK(asdl_expr_seq*, _PyPegen_seq_insert_in_front(p, a, b)), Store, EXTRA) }
9827db96d56Sopenharmony_ci
9837db96d56Sopenharmony_cistar_targets_list_seq[asdl_expr_seq*]: a[asdl_expr_seq*]=','.star_target+ [','] { a }
9847db96d56Sopenharmony_ci
9857db96d56Sopenharmony_cistar_targets_tuple_seq[asdl_expr_seq*]:
9867db96d56Sopenharmony_ci    | a=star_target b=(',' c=star_target { c })+ [','] { (asdl_expr_seq*) _PyPegen_seq_insert_in_front(p, a, b) }
9877db96d56Sopenharmony_ci    | a=star_target ',' { (asdl_expr_seq*) _PyPegen_singleton_seq(p, a) }
9887db96d56Sopenharmony_ci
9897db96d56Sopenharmony_cistar_target[expr_ty] (memo):
9907db96d56Sopenharmony_ci    | '*' a=(!'*' star_target) {
9917db96d56Sopenharmony_ci        _PyAST_Starred(CHECK(expr_ty, _PyPegen_set_expr_context(p, a, Store)), Store, EXTRA) }
9927db96d56Sopenharmony_ci    | target_with_star_atom
9937db96d56Sopenharmony_ci
9947db96d56Sopenharmony_citarget_with_star_atom[expr_ty] (memo):
9957db96d56Sopenharmony_ci    | a=t_primary '.' b=NAME !t_lookahead { _PyAST_Attribute(a, b->v.Name.id, Store, EXTRA) }
9967db96d56Sopenharmony_ci    | a=t_primary '[' b=slices ']' !t_lookahead { _PyAST_Subscript(a, b, Store, EXTRA) }
9977db96d56Sopenharmony_ci    | star_atom
9987db96d56Sopenharmony_ci
9997db96d56Sopenharmony_cistar_atom[expr_ty]:
10007db96d56Sopenharmony_ci    | a=NAME { _PyPegen_set_expr_context(p, a, Store) }
10017db96d56Sopenharmony_ci    | '(' a=target_with_star_atom ')' { _PyPegen_set_expr_context(p, a, Store) }
10027db96d56Sopenharmony_ci    | '(' a=[star_targets_tuple_seq] ')' { _PyAST_Tuple(a, Store, EXTRA) }
10037db96d56Sopenharmony_ci    | '[' a=[star_targets_list_seq] ']' { _PyAST_List(a, Store, EXTRA) }
10047db96d56Sopenharmony_ci
10057db96d56Sopenharmony_cisingle_target[expr_ty]:
10067db96d56Sopenharmony_ci    | single_subscript_attribute_target
10077db96d56Sopenharmony_ci    | a=NAME { _PyPegen_set_expr_context(p, a, Store) }
10087db96d56Sopenharmony_ci    | '(' a=single_target ')' { a }
10097db96d56Sopenharmony_ci
10107db96d56Sopenharmony_cisingle_subscript_attribute_target[expr_ty]:
10117db96d56Sopenharmony_ci    | a=t_primary '.' b=NAME !t_lookahead { _PyAST_Attribute(a, b->v.Name.id, Store, EXTRA) }
10127db96d56Sopenharmony_ci    | a=t_primary '[' b=slices ']' !t_lookahead { _PyAST_Subscript(a, b, Store, EXTRA) }
10137db96d56Sopenharmony_ci
10147db96d56Sopenharmony_cit_primary[expr_ty]:
10157db96d56Sopenharmony_ci    | a=t_primary '.' b=NAME &t_lookahead { _PyAST_Attribute(a, b->v.Name.id, Load, EXTRA) }
10167db96d56Sopenharmony_ci    | a=t_primary '[' b=slices ']' &t_lookahead { _PyAST_Subscript(a, b, Load, EXTRA) }
10177db96d56Sopenharmony_ci    | a=t_primary b=genexp &t_lookahead {
10187db96d56Sopenharmony_ci        _PyAST_Call(a, CHECK(asdl_expr_seq*, (asdl_expr_seq*)_PyPegen_singleton_seq(p, b)), NULL, EXTRA) }
10197db96d56Sopenharmony_ci    | a=t_primary '(' b=[arguments] ')' &t_lookahead {
10207db96d56Sopenharmony_ci        _PyAST_Call(a,
10217db96d56Sopenharmony_ci                 (b) ? ((expr_ty) b)->v.Call.args : NULL,
10227db96d56Sopenharmony_ci                 (b) ? ((expr_ty) b)->v.Call.keywords : NULL,
10237db96d56Sopenharmony_ci                 EXTRA) }
10247db96d56Sopenharmony_ci    | a=atom &t_lookahead { a }
10257db96d56Sopenharmony_ci
10267db96d56Sopenharmony_cit_lookahead: '(' | '[' | '.'
10277db96d56Sopenharmony_ci
10287db96d56Sopenharmony_ci# Targets for del statements
10297db96d56Sopenharmony_ci# --------------------------
10307db96d56Sopenharmony_ci
10317db96d56Sopenharmony_cidel_targets[asdl_expr_seq*]: a[asdl_expr_seq*]=','.del_target+ [','] { a }
10327db96d56Sopenharmony_ci
10337db96d56Sopenharmony_cidel_target[expr_ty] (memo):
10347db96d56Sopenharmony_ci    | a=t_primary '.' b=NAME !t_lookahead { _PyAST_Attribute(a, b->v.Name.id, Del, EXTRA) }
10357db96d56Sopenharmony_ci    | a=t_primary '[' b=slices ']' !t_lookahead { _PyAST_Subscript(a, b, Del, EXTRA) }
10367db96d56Sopenharmony_ci    | del_t_atom
10377db96d56Sopenharmony_ci
10387db96d56Sopenharmony_cidel_t_atom[expr_ty]:
10397db96d56Sopenharmony_ci    | a=NAME { _PyPegen_set_expr_context(p, a, Del) }
10407db96d56Sopenharmony_ci    | '(' a=del_target ')' { _PyPegen_set_expr_context(p, a, Del) }
10417db96d56Sopenharmony_ci    | '(' a=[del_targets] ')' { _PyAST_Tuple(a, Del, EXTRA) }
10427db96d56Sopenharmony_ci    | '[' a=[del_targets] ']' { _PyAST_List(a, Del, EXTRA) }
10437db96d56Sopenharmony_ci
10447db96d56Sopenharmony_ci# TYPING ELEMENTS
10457db96d56Sopenharmony_ci# ---------------
10467db96d56Sopenharmony_ci
10477db96d56Sopenharmony_ci# type_expressions allow */** but ignore them
10487db96d56Sopenharmony_citype_expressions[asdl_expr_seq*]:
10497db96d56Sopenharmony_ci    | a=','.expression+ ',' '*' b=expression ',' '**' c=expression {
10507db96d56Sopenharmony_ci        (asdl_expr_seq*)_PyPegen_seq_append_to_end(
10517db96d56Sopenharmony_ci            p,
10527db96d56Sopenharmony_ci            CHECK(asdl_seq*, _PyPegen_seq_append_to_end(p, a, b)),
10537db96d56Sopenharmony_ci            c) }
10547db96d56Sopenharmony_ci    | a=','.expression+ ',' '*' b=expression { (asdl_expr_seq*)_PyPegen_seq_append_to_end(p, a, b) }
10557db96d56Sopenharmony_ci    | a=','.expression+ ',' '**' b=expression { (asdl_expr_seq*)_PyPegen_seq_append_to_end(p, a, b) }
10567db96d56Sopenharmony_ci    | '*' a=expression ',' '**' b=expression {
10577db96d56Sopenharmony_ci        (asdl_expr_seq*)_PyPegen_seq_append_to_end(
10587db96d56Sopenharmony_ci            p,
10597db96d56Sopenharmony_ci            CHECK(asdl_seq*, _PyPegen_singleton_seq(p, a)),
10607db96d56Sopenharmony_ci            b) }
10617db96d56Sopenharmony_ci    | '*' a=expression { (asdl_expr_seq*)_PyPegen_singleton_seq(p, a) }
10627db96d56Sopenharmony_ci    | '**' a=expression { (asdl_expr_seq*)_PyPegen_singleton_seq(p, a) }
10637db96d56Sopenharmony_ci    | a[asdl_expr_seq*]=','.expression+ {a}
10647db96d56Sopenharmony_ci
10657db96d56Sopenharmony_cifunc_type_comment[Token*]:
10667db96d56Sopenharmony_ci    | NEWLINE t=TYPE_COMMENT &(NEWLINE INDENT) { t }  # Must be followed by indented block
10677db96d56Sopenharmony_ci    | invalid_double_type_comments
10687db96d56Sopenharmony_ci    | TYPE_COMMENT
10697db96d56Sopenharmony_ci
10707db96d56Sopenharmony_ci# ========================= END OF THE GRAMMAR ===========================
10717db96d56Sopenharmony_ci
10727db96d56Sopenharmony_ci
10737db96d56Sopenharmony_ci
10747db96d56Sopenharmony_ci# ========================= START OF INVALID RULES =======================
10757db96d56Sopenharmony_ci
10767db96d56Sopenharmony_ci# From here on, there are rules for invalid syntax with specialised error messages
10777db96d56Sopenharmony_ciinvalid_arguments:
10787db96d56Sopenharmony_ci    | a=args ',' '*' { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "iterable argument unpacking follows keyword argument unpacking") }
10797db96d56Sopenharmony_ci    | a=expression b=for_if_clauses ',' [args | expression for_if_clauses] {
10807db96d56Sopenharmony_ci        RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, _PyPegen_get_last_comprehension_item(PyPegen_last_item(b, comprehension_ty)), "Generator expression must be parenthesized") }
10817db96d56Sopenharmony_ci    | a=NAME b='=' expression for_if_clauses {
10827db96d56Sopenharmony_ci        RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "invalid syntax. Maybe you meant '==' or ':=' instead of '='?")}
10837db96d56Sopenharmony_ci    | a=args b=for_if_clauses { _PyPegen_nonparen_genexp_in_call(p, a, b) }
10847db96d56Sopenharmony_ci    | args ',' a=expression b=for_if_clauses {
10857db96d56Sopenharmony_ci        RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, _PyPegen_get_last_comprehension_item(PyPegen_last_item(b, comprehension_ty)), "Generator expression must be parenthesized") }
10867db96d56Sopenharmony_ci    | a=args ',' args { _PyPegen_arguments_parsing_error(p, a) }
10877db96d56Sopenharmony_ciinvalid_kwarg:
10887db96d56Sopenharmony_ci    | a[Token*]=('True'|'False'|'None') b='=' {
10897db96d56Sopenharmony_ci        RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "cannot assign to %s", PyBytes_AS_STRING(a->bytes)) }
10907db96d56Sopenharmony_ci    | a=NAME b='=' expression for_if_clauses {
10917db96d56Sopenharmony_ci        RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "invalid syntax. Maybe you meant '==' or ':=' instead of '='?")}
10927db96d56Sopenharmony_ci    | !(NAME '=') a=expression b='=' {
10937db96d56Sopenharmony_ci        RAISE_SYNTAX_ERROR_KNOWN_RANGE(
10947db96d56Sopenharmony_ci            a, b, "expression cannot contain assignment, perhaps you meant \"==\"?") }
10957db96d56Sopenharmony_ci
10967db96d56Sopenharmony_ci# IMPORTANT: Note that the "_without_invalid" suffix causes the rule to not call invalid rules under it
10977db96d56Sopenharmony_ciexpression_without_invalid[expr_ty]:
10987db96d56Sopenharmony_ci    | a=disjunction 'if' b=disjunction 'else' c=expression { _PyAST_IfExp(b, a, c, EXTRA) }
10997db96d56Sopenharmony_ci    | disjunction
11007db96d56Sopenharmony_ci    | lambdef
11017db96d56Sopenharmony_ciinvalid_legacy_expression:
11027db96d56Sopenharmony_ci    | a=NAME !'(' b=star_expressions {
11037db96d56Sopenharmony_ci        _PyPegen_check_legacy_stmt(p, a) ? RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b,
11047db96d56Sopenharmony_ci            "Missing parentheses in call to '%U'. Did you mean %U(...)?", a->v.Name.id, a->v.Name.id) : NULL}
11057db96d56Sopenharmony_ci
11067db96d56Sopenharmony_ciinvalid_expression:
11077db96d56Sopenharmony_ci    # !(NAME STRING) is not matched so we don't show this error with some invalid string prefixes like: kf"dsfsdf"
11087db96d56Sopenharmony_ci    # Soft keywords need to also be ignored because they can be parsed as NAME NAME
11097db96d56Sopenharmony_ci   | !(NAME STRING | SOFT_KEYWORD) a=disjunction b=expression_without_invalid {
11107db96d56Sopenharmony_ci        _PyPegen_check_legacy_stmt(p, a) ? NULL : p->tokens[p->mark-1]->level == 0 ? NULL :
11117db96d56Sopenharmony_ci        RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "invalid syntax. Perhaps you forgot a comma?") }
11127db96d56Sopenharmony_ci   | a=disjunction 'if' b=disjunction !('else'|':') { RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "expected 'else' after 'if' expression") }
11137db96d56Sopenharmony_ci
11147db96d56Sopenharmony_ciinvalid_named_expression(memo):
11157db96d56Sopenharmony_ci    | a=expression ':=' expression {
11167db96d56Sopenharmony_ci        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(
11177db96d56Sopenharmony_ci            a, "cannot use assignment expressions with %s", _PyPegen_get_expr_name(a)) }
11187db96d56Sopenharmony_ci    | a=NAME '=' b=bitwise_or !('='|':=') {
11197db96d56Sopenharmony_ci        RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "invalid syntax. Maybe you meant '==' or ':=' instead of '='?") }
11207db96d56Sopenharmony_ci    | !(list|tuple|genexp|'True'|'None'|'False') a=bitwise_or b='=' bitwise_or !('='|':=') {
11217db96d56Sopenharmony_ci        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "cannot assign to %s here. Maybe you meant '==' instead of '='?",
11227db96d56Sopenharmony_ci                                          _PyPegen_get_expr_name(a)) }
11237db96d56Sopenharmony_ci
11247db96d56Sopenharmony_ciinvalid_assignment:
11257db96d56Sopenharmony_ci    | a=invalid_ann_assign_target ':' expression {
11267db96d56Sopenharmony_ci        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(
11277db96d56Sopenharmony_ci            a,
11287db96d56Sopenharmony_ci            "only single target (not %s) can be annotated",
11297db96d56Sopenharmony_ci            _PyPegen_get_expr_name(a)
11307db96d56Sopenharmony_ci        )}
11317db96d56Sopenharmony_ci    | a=star_named_expression ',' star_named_expressions* ':' expression {
11327db96d56Sopenharmony_ci        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "only single target (not tuple) can be annotated") }
11337db96d56Sopenharmony_ci    | a=expression ':' expression {
11347db96d56Sopenharmony_ci        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "illegal target for annotation") }
11357db96d56Sopenharmony_ci    | (star_targets '=')* a=star_expressions '=' {
11367db96d56Sopenharmony_ci        RAISE_SYNTAX_ERROR_INVALID_TARGET(STAR_TARGETS, a) }
11377db96d56Sopenharmony_ci    | (star_targets '=')* a=yield_expr '=' { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "assignment to yield expression not possible") }
11387db96d56Sopenharmony_ci    | a=star_expressions augassign (yield_expr | star_expressions) {
11397db96d56Sopenharmony_ci        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(
11407db96d56Sopenharmony_ci            a,
11417db96d56Sopenharmony_ci            "'%s' is an illegal expression for augmented assignment",
11427db96d56Sopenharmony_ci            _PyPegen_get_expr_name(a)
11437db96d56Sopenharmony_ci        )}
11447db96d56Sopenharmony_ciinvalid_ann_assign_target[expr_ty]:
11457db96d56Sopenharmony_ci    | list
11467db96d56Sopenharmony_ci    | tuple
11477db96d56Sopenharmony_ci    | '(' a=invalid_ann_assign_target ')' { a }
11487db96d56Sopenharmony_ciinvalid_del_stmt:
11497db96d56Sopenharmony_ci    | 'del' a=star_expressions {
11507db96d56Sopenharmony_ci        RAISE_SYNTAX_ERROR_INVALID_TARGET(DEL_TARGETS, a) }
11517db96d56Sopenharmony_ciinvalid_block:
11527db96d56Sopenharmony_ci    | NEWLINE !INDENT { RAISE_INDENTATION_ERROR("expected an indented block") }
11537db96d56Sopenharmony_ciinvalid_comprehension:
11547db96d56Sopenharmony_ci    | ('[' | '(' | '{') a=starred_expression for_if_clauses {
11557db96d56Sopenharmony_ci        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "iterable unpacking cannot be used in comprehension") }
11567db96d56Sopenharmony_ci    | ('[' | '{') a=star_named_expression ',' b=star_named_expressions for_if_clauses {
11577db96d56Sopenharmony_ci        RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, PyPegen_last_item(b, expr_ty),
11587db96d56Sopenharmony_ci        "did you forget parentheses around the comprehension target?") }
11597db96d56Sopenharmony_ci    | ('[' | '{') a=star_named_expression b=',' for_if_clauses {
11607db96d56Sopenharmony_ci        RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "did you forget parentheses around the comprehension target?") }
11617db96d56Sopenharmony_ciinvalid_dict_comprehension:
11627db96d56Sopenharmony_ci    | '{' a='**' bitwise_or for_if_clauses '}' {
11637db96d56Sopenharmony_ci        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "dict unpacking cannot be used in dict comprehension") }
11647db96d56Sopenharmony_ciinvalid_parameters:
11657db96d56Sopenharmony_ci    | param_no_default* invalid_parameters_helper a=param_no_default {
11667db96d56Sopenharmony_ci        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "non-default argument follows default argument") }
11677db96d56Sopenharmony_ci    | param_no_default* a='(' param_no_default+ ','? b=')' {
11687db96d56Sopenharmony_ci        RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "Function parameters cannot be parenthesized") }
11697db96d56Sopenharmony_ci    | a="/" ',' {
11707db96d56Sopenharmony_ci        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "at least one argument must precede /") }
11717db96d56Sopenharmony_ci    | (slash_no_default | slash_with_default) param_maybe_default* a='/' {
11727db96d56Sopenharmony_ci        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "/ may appear only once") }
11737db96d56Sopenharmony_ci    | (slash_no_default | slash_with_default)? param_maybe_default* '*' (',' | param_no_default) param_maybe_default* a='/' {
11747db96d56Sopenharmony_ci        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "/ must be ahead of *") }
11757db96d56Sopenharmony_ci    | param_maybe_default+ '/' a='*' {
11767db96d56Sopenharmony_ci        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "expected comma between / and *") }
11777db96d56Sopenharmony_ciinvalid_default:
11787db96d56Sopenharmony_ci    | a='=' &(')'|',') { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "expected default value expression") }
11797db96d56Sopenharmony_ciinvalid_star_etc:
11807db96d56Sopenharmony_ci    | a='*' (')' | ',' (')' | '**')) { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "named arguments must follow bare *") }
11817db96d56Sopenharmony_ci    | '*' ',' TYPE_COMMENT { RAISE_SYNTAX_ERROR("bare * has associated type comment") }
11827db96d56Sopenharmony_ci    | '*' param a='=' { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "var-positional argument cannot have default value") }
11837db96d56Sopenharmony_ci    | '*' (param_no_default | ',') param_maybe_default* a='*' (param_no_default | ',') {
11847db96d56Sopenharmony_ci        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "* argument may appear only once") }
11857db96d56Sopenharmony_ciinvalid_kwds:
11867db96d56Sopenharmony_ci    | '**' param a='=' { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "var-keyword argument cannot have default value") }
11877db96d56Sopenharmony_ci    | '**' param ',' a=param { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "arguments cannot follow var-keyword argument") }
11887db96d56Sopenharmony_ci    | '**' param ',' a[Token*]=('*'|'**'|'/') { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "arguments cannot follow var-keyword argument") }
11897db96d56Sopenharmony_ciinvalid_parameters_helper: # This is only there to avoid type errors
11907db96d56Sopenharmony_ci    | a=slash_with_default { _PyPegen_singleton_seq(p, a) }
11917db96d56Sopenharmony_ci    | param_with_default+
11927db96d56Sopenharmony_ciinvalid_lambda_parameters:
11937db96d56Sopenharmony_ci    | lambda_param_no_default* invalid_lambda_parameters_helper a=lambda_param_no_default {
11947db96d56Sopenharmony_ci        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "non-default argument follows default argument") }
11957db96d56Sopenharmony_ci    | lambda_param_no_default* a='(' ','.lambda_param+ ','? b=')' {
11967db96d56Sopenharmony_ci        RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "Lambda expression parameters cannot be parenthesized") }
11977db96d56Sopenharmony_ci    | a="/" ',' {
11987db96d56Sopenharmony_ci        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "at least one argument must precede /") }
11997db96d56Sopenharmony_ci    | (lambda_slash_no_default | lambda_slash_with_default) lambda_param_maybe_default* a='/' {
12007db96d56Sopenharmony_ci        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "/ may appear only once") }
12017db96d56Sopenharmony_ci    | (lambda_slash_no_default | lambda_slash_with_default)? lambda_param_maybe_default* '*' (',' | lambda_param_no_default) lambda_param_maybe_default* a='/' {
12027db96d56Sopenharmony_ci        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "/ must be ahead of *") }
12037db96d56Sopenharmony_ci    | lambda_param_maybe_default+ '/' a='*' {
12047db96d56Sopenharmony_ci        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "expected comma between / and *") }
12057db96d56Sopenharmony_ciinvalid_lambda_parameters_helper:
12067db96d56Sopenharmony_ci    | a=lambda_slash_with_default { _PyPegen_singleton_seq(p, a) }
12077db96d56Sopenharmony_ci    | lambda_param_with_default+
12087db96d56Sopenharmony_ciinvalid_lambda_star_etc:
12097db96d56Sopenharmony_ci    | '*' (':' | ',' (':' | '**')) { RAISE_SYNTAX_ERROR("named arguments must follow bare *") }
12107db96d56Sopenharmony_ci    | '*' lambda_param a='=' { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "var-positional argument cannot have default value") }
12117db96d56Sopenharmony_ci    | '*' (lambda_param_no_default | ',') lambda_param_maybe_default* a='*' (lambda_param_no_default | ',') {
12127db96d56Sopenharmony_ci        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "* argument may appear only once") }
12137db96d56Sopenharmony_ciinvalid_lambda_kwds:
12147db96d56Sopenharmony_ci    | '**' lambda_param a='=' { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "var-keyword argument cannot have default value") }
12157db96d56Sopenharmony_ci    | '**' lambda_param ',' a=lambda_param { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "arguments cannot follow var-keyword argument") }
12167db96d56Sopenharmony_ci    | '**' lambda_param ',' a[Token*]=('*'|'**'|'/') { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "arguments cannot follow var-keyword argument") }
12177db96d56Sopenharmony_ciinvalid_double_type_comments:
12187db96d56Sopenharmony_ci    | TYPE_COMMENT NEWLINE TYPE_COMMENT NEWLINE INDENT {
12197db96d56Sopenharmony_ci        RAISE_SYNTAX_ERROR("Cannot have two type comments on def") }
12207db96d56Sopenharmony_ciinvalid_with_item:
12217db96d56Sopenharmony_ci    | expression 'as' a=expression &(',' | ')' | ':') {
12227db96d56Sopenharmony_ci        RAISE_SYNTAX_ERROR_INVALID_TARGET(STAR_TARGETS, a) }
12237db96d56Sopenharmony_ci
12247db96d56Sopenharmony_ciinvalid_for_target:
12257db96d56Sopenharmony_ci    | ASYNC? 'for' a=star_expressions {
12267db96d56Sopenharmony_ci        RAISE_SYNTAX_ERROR_INVALID_TARGET(FOR_TARGETS, a) }
12277db96d56Sopenharmony_ci
12287db96d56Sopenharmony_ciinvalid_group:
12297db96d56Sopenharmony_ci    | '(' a=starred_expression ')' {
12307db96d56Sopenharmony_ci        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "cannot use starred expression here") }
12317db96d56Sopenharmony_ci    | '(' a='**' expression ')' {
12327db96d56Sopenharmony_ci        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "cannot use double starred expression here") }
12337db96d56Sopenharmony_ciinvalid_import_from_targets:
12347db96d56Sopenharmony_ci    | import_from_as_names ',' NEWLINE {
12357db96d56Sopenharmony_ci        RAISE_SYNTAX_ERROR("trailing comma not allowed without surrounding parentheses") }
12367db96d56Sopenharmony_ci
12377db96d56Sopenharmony_ciinvalid_with_stmt:
12387db96d56Sopenharmony_ci    | [ASYNC] 'with' ','.(expression ['as' star_target])+ NEWLINE { RAISE_SYNTAX_ERROR("expected ':'") }
12397db96d56Sopenharmony_ci    | [ASYNC] 'with' '(' ','.(expressions ['as' star_target])+ ','? ')' NEWLINE { RAISE_SYNTAX_ERROR("expected ':'") }
12407db96d56Sopenharmony_ciinvalid_with_stmt_indent:
12417db96d56Sopenharmony_ci    | [ASYNC] a='with' ','.(expression ['as' star_target])+ ':' NEWLINE !INDENT {
12427db96d56Sopenharmony_ci        RAISE_INDENTATION_ERROR("expected an indented block after 'with' statement on line %d", a->lineno) }
12437db96d56Sopenharmony_ci    | [ASYNC] a='with' '(' ','.(expressions ['as' star_target])+ ','? ')' ':' NEWLINE !INDENT {
12447db96d56Sopenharmony_ci        RAISE_INDENTATION_ERROR("expected an indented block after 'with' statement on line %d", a->lineno) }
12457db96d56Sopenharmony_ci
12467db96d56Sopenharmony_ciinvalid_try_stmt:
12477db96d56Sopenharmony_ci    | a='try' ':' NEWLINE !INDENT {
12487db96d56Sopenharmony_ci        RAISE_INDENTATION_ERROR("expected an indented block after 'try' statement on line %d", a->lineno) }
12497db96d56Sopenharmony_ci    | 'try' ':' block !('except' | 'finally') { RAISE_SYNTAX_ERROR("expected 'except' or 'finally' block") }
12507db96d56Sopenharmony_ci    | 'try' ':' block* except_block+ a='except' b='*' expression ['as' NAME] ':' {
12517db96d56Sopenharmony_ci        RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "cannot have both 'except' and 'except*' on the same 'try'") }
12527db96d56Sopenharmony_ci    | 'try' ':' block* except_star_block+ a='except' [expression ['as' NAME]] ':' {
12537db96d56Sopenharmony_ci        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "cannot have both 'except' and 'except*' on the same 'try'") }
12547db96d56Sopenharmony_ciinvalid_except_stmt:
12557db96d56Sopenharmony_ci    | 'except' '*'? a=expression ',' expressions ['as' NAME ] ':' {
12567db96d56Sopenharmony_ci        RAISE_SYNTAX_ERROR_STARTING_FROM(a, "multiple exception types must be parenthesized") }
12577db96d56Sopenharmony_ci    | a='except' '*'? expression ['as' NAME ] NEWLINE { RAISE_SYNTAX_ERROR("expected ':'") }
12587db96d56Sopenharmony_ci    | a='except' NEWLINE { RAISE_SYNTAX_ERROR("expected ':'") }
12597db96d56Sopenharmony_ci    | a='except' '*' (NEWLINE | ':') { RAISE_SYNTAX_ERROR("expected one or more exception types") }
12607db96d56Sopenharmony_ciinvalid_finally_stmt:
12617db96d56Sopenharmony_ci    | a='finally' ':' NEWLINE !INDENT {
12627db96d56Sopenharmony_ci        RAISE_INDENTATION_ERROR("expected an indented block after 'finally' statement on line %d", a->lineno) }
12637db96d56Sopenharmony_ciinvalid_except_stmt_indent:
12647db96d56Sopenharmony_ci    | a='except' expression ['as' NAME ] ':' NEWLINE !INDENT {
12657db96d56Sopenharmony_ci        RAISE_INDENTATION_ERROR("expected an indented block after 'except' statement on line %d", a->lineno) }
12667db96d56Sopenharmony_ci    | a='except' ':' NEWLINE !INDENT { RAISE_INDENTATION_ERROR("expected an indented block after 'except' statement on line %d", a->lineno) }
12677db96d56Sopenharmony_ciinvalid_except_star_stmt_indent:
12687db96d56Sopenharmony_ci    | a='except' '*' expression ['as' NAME ] ':' NEWLINE !INDENT {
12697db96d56Sopenharmony_ci        RAISE_INDENTATION_ERROR("expected an indented block after 'except*' statement on line %d", a->lineno) }
12707db96d56Sopenharmony_ciinvalid_match_stmt:
12717db96d56Sopenharmony_ci    | "match" subject_expr NEWLINE { CHECK_VERSION(void*, 10, "Pattern matching is", RAISE_SYNTAX_ERROR("expected ':'") ) }
12727db96d56Sopenharmony_ci    | a="match" subject=subject_expr ':' NEWLINE !INDENT {
12737db96d56Sopenharmony_ci        RAISE_INDENTATION_ERROR("expected an indented block after 'match' statement on line %d", a->lineno) }
12747db96d56Sopenharmony_ciinvalid_case_block:
12757db96d56Sopenharmony_ci    | "case" patterns guard? NEWLINE { RAISE_SYNTAX_ERROR("expected ':'") }
12767db96d56Sopenharmony_ci    | a="case" patterns guard? ':' NEWLINE !INDENT {
12777db96d56Sopenharmony_ci        RAISE_INDENTATION_ERROR("expected an indented block after 'case' statement on line %d", a->lineno) }
12787db96d56Sopenharmony_ciinvalid_as_pattern:
12797db96d56Sopenharmony_ci    | or_pattern 'as' a="_" { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "cannot use '_' as a target") }
12807db96d56Sopenharmony_ci    | or_pattern 'as' !NAME a=expression { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "invalid pattern target") }
12817db96d56Sopenharmony_ciinvalid_class_pattern:
12827db96d56Sopenharmony_ci    | name_or_attr '(' a=invalid_class_argument_pattern  { RAISE_SYNTAX_ERROR_KNOWN_RANGE(
12837db96d56Sopenharmony_ci        PyPegen_first_item(a, pattern_ty),
12847db96d56Sopenharmony_ci        PyPegen_last_item(a, pattern_ty),
12857db96d56Sopenharmony_ci        "positional patterns follow keyword patterns") }
12867db96d56Sopenharmony_ciinvalid_class_argument_pattern[asdl_pattern_seq*]:
12877db96d56Sopenharmony_ci    | [positional_patterns ','] keyword_patterns ',' a=positional_patterns { a }
12887db96d56Sopenharmony_ciinvalid_if_stmt:
12897db96d56Sopenharmony_ci    | 'if' named_expression NEWLINE { RAISE_SYNTAX_ERROR("expected ':'") }
12907db96d56Sopenharmony_ci    | a='if' a=named_expression ':' NEWLINE !INDENT {
12917db96d56Sopenharmony_ci        RAISE_INDENTATION_ERROR("expected an indented block after 'if' statement on line %d", a->lineno) }
12927db96d56Sopenharmony_ciinvalid_elif_stmt:
12937db96d56Sopenharmony_ci    | 'elif' named_expression NEWLINE { RAISE_SYNTAX_ERROR("expected ':'") }
12947db96d56Sopenharmony_ci    | a='elif' named_expression ':' NEWLINE !INDENT {
12957db96d56Sopenharmony_ci        RAISE_INDENTATION_ERROR("expected an indented block after 'elif' statement on line %d", a->lineno) }
12967db96d56Sopenharmony_ciinvalid_else_stmt:
12977db96d56Sopenharmony_ci    | a='else' ':' NEWLINE !INDENT {
12987db96d56Sopenharmony_ci        RAISE_INDENTATION_ERROR("expected an indented block after 'else' statement on line %d", a->lineno) }
12997db96d56Sopenharmony_ciinvalid_while_stmt:
13007db96d56Sopenharmony_ci    | 'while' named_expression NEWLINE { RAISE_SYNTAX_ERROR("expected ':'") }
13017db96d56Sopenharmony_ci    | a='while' named_expression ':' NEWLINE !INDENT {
13027db96d56Sopenharmony_ci        RAISE_INDENTATION_ERROR("expected an indented block after 'while' statement on line %d", a->lineno) }
13037db96d56Sopenharmony_ciinvalid_for_stmt:
13047db96d56Sopenharmony_ci    | [ASYNC] 'for' star_targets 'in' star_expressions NEWLINE { RAISE_SYNTAX_ERROR("expected ':'") }
13057db96d56Sopenharmony_ci    | [ASYNC] a='for' star_targets 'in' star_expressions ':' NEWLINE !INDENT {
13067db96d56Sopenharmony_ci        RAISE_INDENTATION_ERROR("expected an indented block after 'for' statement on line %d", a->lineno) }
13077db96d56Sopenharmony_ciinvalid_def_raw:
13087db96d56Sopenharmony_ci    | [ASYNC] a='def' NAME '(' [params] ')' ['->' expression] ':' NEWLINE !INDENT {
13097db96d56Sopenharmony_ci        RAISE_INDENTATION_ERROR("expected an indented block after function definition on line %d", a->lineno) }
13107db96d56Sopenharmony_ciinvalid_class_def_raw:
13117db96d56Sopenharmony_ci    | 'class' NAME ['(' [arguments] ')'] NEWLINE { RAISE_SYNTAX_ERROR("expected ':'") }
13127db96d56Sopenharmony_ci    | a='class' NAME ['(' [arguments] ')'] ':' NEWLINE !INDENT {
13137db96d56Sopenharmony_ci        RAISE_INDENTATION_ERROR("expected an indented block after class definition on line %d", a->lineno) }
13147db96d56Sopenharmony_ci
13157db96d56Sopenharmony_ciinvalid_double_starred_kvpairs:
13167db96d56Sopenharmony_ci    | ','.double_starred_kvpair+ ',' invalid_kvpair
13177db96d56Sopenharmony_ci    | expression ':' a='*' bitwise_or { RAISE_SYNTAX_ERROR_STARTING_FROM(a, "cannot use a starred expression in a dictionary value") }
13187db96d56Sopenharmony_ci    | expression a=':' &('}'|',') { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "expression expected after dictionary key and ':'") }
13197db96d56Sopenharmony_ciinvalid_kvpair:
13207db96d56Sopenharmony_ci    | a=expression !(':') {
13217db96d56Sopenharmony_ci        RAISE_ERROR_KNOWN_LOCATION(p, PyExc_SyntaxError, a->lineno, a->end_col_offset - 1, a->end_lineno, -1, "':' expected after dictionary key") }
13227db96d56Sopenharmony_ci    | expression ':' a='*' bitwise_or { RAISE_SYNTAX_ERROR_STARTING_FROM(a, "cannot use a starred expression in a dictionary value") }
13237db96d56Sopenharmony_ci    | expression a=':' &('}'|',') {RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "expression expected after dictionary key and ':'") }
1324