From 17ff2a3170920b83de36d91f77858e5873f01136 Mon Sep 17 00:00:00 2001 From: Evan Hubinger Date: Wed, 17 Jan 2024 18:44:37 -0800 Subject: [PATCH] Fix walrus in subscripts Resolves #820. --- coconut/compiler/grammar.py | 14 ++++++++------ coconut/root.py | 2 +- .../tests/src/cocotest/target_311/py311_test.coco | 2 ++ 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/coconut/compiler/grammar.py b/coconut/compiler/grammar.py index 3cf73fb22..a6ded70cc 100644 --- a/coconut/compiler/grammar.py +++ b/coconut/compiler/grammar.py @@ -649,8 +649,8 @@ class Grammar(object): unsafe_fat_arrow = Literal("=>") | fixto(Literal("\u21d2"), "=>") colon_eq = Literal(":=") unsafe_dubcolon = Literal("::") - unsafe_colon = Literal(":") colon = disambiguate_literal(":", ["::", ":="]) + indexing_colon = disambiguate_literal(":", [":="]) # same as : but :: is allowed lt_colon = Literal("<:") semicolon = Literal(";") | invalid_syntax("\u037e", "invalid Greek question mark instead of semicolon", greedy=True) multisemicolon = combine(OneOrMore(semicolon)) @@ -1199,21 +1199,23 @@ class Grammar(object): | op_item ) + # for .[] subscript_star = Forward() subscript_star_ref = star slicetest = Optional(test_no_chain) - sliceop = condense(unsafe_colon + slicetest) + sliceop = condense(indexing_colon + slicetest) subscript = condense( slicetest + sliceop + Optional(sliceop) - | Optional(subscript_star) + test + | Optional(subscript_star) + new_namedexpr_test ) - subscriptlist = itemlist(subscript, comma, suppress_trailing=False) | new_namedexpr_test + subscriptlist = itemlist(subscript, comma, suppress_trailing=False) + # for .$[] slicetestgroup = Optional(test_no_chain, default="") - sliceopgroup = unsafe_colon.suppress() + slicetestgroup + sliceopgroup = indexing_colon.suppress() + slicetestgroup subscriptgroup = attach( slicetestgroup + sliceopgroup + Optional(sliceopgroup) - | test, + | new_namedexpr_test, subscriptgroup_handle, ) subscriptgrouplist = itemlist(subscriptgroup, comma) diff --git a/coconut/root.py b/coconut/root.py index 40da17bcc..3eed681c3 100644 --- a/coconut/root.py +++ b/coconut/root.py @@ -26,7 +26,7 @@ VERSION = "3.0.4" VERSION_NAME = None # False for release, int >= 1 for develop -DEVELOP = 14 +DEVELOP = 15 ALPHA = False # for pre releases rather than post releases assert DEVELOP is False or DEVELOP >= 1, "DEVELOP must be False or an int >= 1" diff --git a/coconut/tests/src/cocotest/target_311/py311_test.coco b/coconut/tests/src/cocotest/target_311/py311_test.coco index a2c655815..c527cf3a4 100644 --- a/coconut/tests/src/cocotest/target_311/py311_test.coco +++ b/coconut/tests/src/cocotest/target_311/py311_test.coco @@ -7,4 +7,6 @@ def py311_test() -> bool: except* ValueError as err: got_err = err assert repr(got_err) == repr(multi_err), (got_err, multi_err) + assert [1, 2, 3][x := 1] == 2 + assert x == 1 return True