diff --git a/CHANGELOG.md b/CHANGELOG.md index 846e61639..046d51060 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ All notable changes to this project will be documented in this file. - Matter add option to disable bridge mode (#18992) - Support for SGP41 TVOC/NOx Sensor (#18880) - Command ``BrRestart`` to restart the Berry VM (experimental) +- Berry `var` allowed in with walrus operator `:=` ### Breaking Changed - Berry `bool( [] )` and `bool( {} )` now evaluate as `false` (#18986) diff --git a/lib/libesp32/berry/berry.exe b/lib/libesp32/berry/berry.exe index a20999c83..b87202902 100644 Binary files a/lib/libesp32/berry/berry.exe and b/lib/libesp32/berry/berry.exe differ diff --git a/lib/libesp32/berry/src/be_parser.c b/lib/libesp32/berry/src/be_parser.c index 57b2ffa7f..dff91b546 100644 --- a/lib/libesp32/berry/src/be_parser.c +++ b/lib/libesp32/berry/src/be_parser.c @@ -1135,8 +1135,22 @@ static void sub_expr(bparser *parser, bexpdesc *e, int prio) static void walrus_expr(bparser *parser, bexpdesc *e) { int line = parser->lexer.linenumber; - sub_expr(parser, e, ASSIGN_OP_PRIO); /* left expression */ btokentype op = next_type(parser); + if (op == KeyVar) { + /* 'var' ID ':=' expr */ + scan_next_token(parser); /* skip 'var' */ + bstring *name; + name = next_token(parser).u.s; + match_token(parser, TokenId); /* match and skip ID */ + new_var(parser, name, e); /* new variable */ + op = next_type(parser); + if (op != OptWalrus) { + parser_error(parser, "'var' in expr must be followed by ':='"); + } + } else { + sub_expr(parser, e, ASSIGN_OP_PRIO); /* left expression */ + op = next_type(parser); + } if (op == OptWalrus) { check_symbol(parser, e); bexpdesc e1 = *e; /* copy var to e1, e will get the result of expression */ @@ -1149,8 +1163,7 @@ static void walrus_expr(bparser *parser, bexpdesc *e) } if (be_code_setvar(parser->finfo, &e1, e, btrue /* do not release register */ )) { parser->lexer.linenumber = line; - parser_error(parser, - "try to assign constant expressions."); + parser_error(parser, "try to assign constant expressions."); } } }