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