@@ -509,13 +509,13 @@ star_named_expression[expr_ty]:
509
509
| '*' a=bitwise_or { _PyAST_Starred(a, Load, EXTRA) }
510
510
| named_expression
511
511
512
- named_expression[expr_ty]:
513
- | a=NAME ':=' ~ b=expression { _PyAST_NamedExpr(CHECK(expr_ty, _PyPegen_set_expr_context(p, a, Store)), b, EXTRA) }
514
- | invalid_named_expression
515
- | expression !':='
516
512
517
- direct_named_expression [expr_ty]:
513
+ assigment_expression [expr_ty]:
518
514
| a=NAME ':=' ~ b=expression { _PyAST_NamedExpr(CHECK(expr_ty, _PyPegen_set_expr_context(p, a, Store)), b, EXTRA) }
515
+
516
+ named_expression[expr_ty]:
517
+ | assigment_expression
518
+ | invalid_named_expression
519
519
| expression !':='
520
520
521
521
annotated_rhs[expr_ty]: yield_expr | star_expressions
@@ -706,7 +706,7 @@ group[expr_ty]:
706
706
| '(' a=(yield_expr | named_expression) ')' { a }
707
707
| invalid_group
708
708
genexp[expr_ty]:
709
- | '(' a=direct_named_expression b=for_if_clauses ')' { _PyAST_GeneratorExp(a, b, EXTRA) }
709
+ | '(' a=( assigment_expression | expression !':=') b=for_if_clauses ')' { _PyAST_GeneratorExp(a, b, EXTRA) }
710
710
| invalid_comprehension
711
711
set[expr_ty]: '{' a=star_named_expressions '}' { _PyAST_Set(a, EXTRA) }
712
712
setcomp[expr_ty]:
@@ -745,27 +745,29 @@ arguments[expr_ty] (memo):
745
745
| a=args [','] &')' { a }
746
746
| invalid_arguments
747
747
args[expr_ty]:
748
- | a[asdl_expr_seq*]=','.(starred_expression | direct_named_expression !'=')+ b=[',' k=kwargs {k}] { _PyPegen_collect_call_seqs(p, a, b, EXTRA) }
748
+ | a[asdl_expr_seq*]=','.(starred_expression | ( assigment_expression | expression !':=') !'=')+ b=[',' k=kwargs {k}] {
749
+ _PyPegen_collect_call_seqs(p, a, b, EXTRA) }
749
750
| a=kwargs { _PyAST_Call(_PyPegen_dummy_name(p),
750
751
CHECK_NULL_ALLOWED(asdl_expr_seq*, _PyPegen_seq_extract_starred_exprs(p, a)),
751
752
CHECK_NULL_ALLOWED(asdl_keyword_seq*, _PyPegen_seq_delete_starred_exprs(p, a)),
752
753
EXTRA) }
754
+
753
755
kwargs[asdl_seq*]:
754
756
| a=','.kwarg_or_starred+ ',' b=','.kwarg_or_double_starred+ { _PyPegen_join_sequences(p, a, b) }
755
757
| ','.kwarg_or_starred+
756
758
| ','.kwarg_or_double_starred+
757
759
starred_expression[expr_ty]:
758
760
| '*' a=expression { _PyAST_Starred(a, Load, EXTRA) }
759
761
kwarg_or_starred[KeywordOrStarred*]:
762
+ | invalid_kwarg
760
763
| a=NAME '=' b=expression {
761
764
_PyPegen_keyword_or_starred(p, CHECK(keyword_ty, _PyAST_keyword(a->v.Name.id, b, EXTRA)), 1) }
762
765
| a=starred_expression { _PyPegen_keyword_or_starred(p, a, 0) }
763
- | invalid_kwarg
764
766
kwarg_or_double_starred[KeywordOrStarred*]:
767
+ | invalid_kwarg
765
768
| a=NAME '=' b=expression {
766
769
_PyPegen_keyword_or_starred(p, CHECK(keyword_ty, _PyAST_keyword(a->v.Name.id, b, EXTRA)), 1) }
767
770
| '**' a=expression { _PyPegen_keyword_or_starred(p, CHECK(keyword_ty, _PyAST_keyword(NULL, a, EXTRA)), 1) }
768
- | invalid_kwarg
769
771
770
772
# NOTE: star_targets may contain *bitwise_or, targets may not.
771
773
star_targets[expr_ty]:
@@ -838,29 +840,37 @@ invalid_arguments:
838
840
| a=args ',' '*' { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "iterable argument unpacking follows keyword argument unpacking") }
839
841
| a=expression b=for_if_clauses ',' [args | expression for_if_clauses] {
840
842
RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, PyPegen_last_item(b, comprehension_ty)->target, "Generator expression must be parenthesized") }
843
+ | a=NAME b='=' expression for_if_clauses {
844
+ RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "invalid syntax. Maybe you meant '==' or ':=' instead of '='?")}
841
845
| a=args for_if_clauses { _PyPegen_nonparen_genexp_in_call(p, a) }
842
846
| args ',' a=expression b=for_if_clauses {
843
847
RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, asdl_seq_GET(b, b->size-1)->target, "Generator expression must be parenthesized") }
844
848
| a=args ',' args { _PyPegen_arguments_parsing_error(p, a) }
845
849
invalid_kwarg:
850
+ | a=NAME b='=' expression for_if_clauses {
851
+ RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "invalid syntax. Maybe you meant '==' or ':=' instead of '='?")}
846
852
| !(NAME '=') a=expression b='=' {
847
853
RAISE_SYNTAX_ERROR_KNOWN_RANGE(
848
854
a, b, "expression cannot contain assignment, perhaps you meant \"==\"?") }
849
855
856
+ expression_without_invalid[expr_ty]:
857
+ | a=disjunction 'if' b=disjunction 'else' c=expression { _PyAST_IfExp(b, a, c, EXTRA) }
858
+ | disjunction
859
+ | lambdef
850
860
invalid_expression:
851
861
# !(NAME STRING) is not matched so we don't show this error with some invalid string prefixes like: kf"dsfsdf"
852
862
# Soft keywords need to also be ignored because they can be parsed as NAME NAME
853
- | !(NAME STRING | SOFT_KEYWORD) a=disjunction b=expression {
863
+ | !(NAME STRING | SOFT_KEYWORD) a=disjunction b=expression_without_invalid {
854
864
RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "invalid syntax. Perhaps you forgot a comma?") }
855
865
856
866
invalid_named_expression:
857
867
| a=expression ':=' expression {
858
868
RAISE_SYNTAX_ERROR_KNOWN_LOCATION(
859
869
a, "cannot use assignment expressions with %s", _PyPegen_get_expr_name(a)) }
860
- | a=NAME '=' b=bitwise_or !('='|':='|',' ) {
861
- RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "invalid syntax. Maybe you meant '==' or ':=' instead of '='?") }
862
- | !(list|tuple|genexp|'True'|'None'|'False') a=bitwise_or b='=' bitwise_or !('='|':='|',' ) {
863
- RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "cannot assign to %s here. Maybe you meant '==' instead of '='?",
870
+ | a=NAME '=' b=bitwise_or !('='|':=') {
871
+ p->in_raw_rule ? NULL : RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "invalid syntax. Maybe you meant '==' or ':=' instead of '='?") }
872
+ | !(list|tuple|genexp|'True'|'None'|'False') a=bitwise_or b='=' bitwise_or !('='|':=') {
873
+ p->in_raw_rule ? NULL : RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "cannot assign to %s here. Maybe you meant '==' instead of '='?",
864
874
_PyPegen_get_expr_name(a)) }
865
875
866
876
invalid_assignment:
0 commit comments