From 4c8b5236e7fa8902a310d78c9d9f55931138bafa Mon Sep 17 00:00:00 2001 From: aps <62445385+apsz3@users.noreply.github.com> Date: Wed, 15 Feb 2023 12:24:36 -0500 Subject: [PATCH] f --- src/compiler.h | 44 ++++++++----------------------------------- src/vm.h | 6 +++--- tests/_basic.py | 14 ++++++++++++-- tests/_controlflow.py | 23 +++++++++++----------- tests/_walrus.py | 7 ------- 5 files changed, 34 insertions(+), 60 deletions(-) delete mode 100644 tests/_walrus.py diff --git a/src/compiler.h b/src/compiler.h index 065e23b0..1a0fc57d 100644 --- a/src/compiler.h +++ b/src/compiler.h @@ -74,8 +74,6 @@ public: rules[TK("@str")] = { METHOD(exprLiteral), NO_INFIX }; rules[TK("@fstr")] = { METHOD(exprFString), NO_INFIX }; rules[TK("?")] = { nullptr, METHOD(exprTernary), PREC_TERNARY }; - // do not include standalone, as it allows naked assignment - //rules[TK(":=")] = { nullptr, METHOD(exprWalrus), PREC_ASSIGNMENT }; rules[TK("=")] = { nullptr, METHOD(exprAssign), PREC_ASSIGNMENT }; rules[TK("+=")] = { nullptr, METHOD(exprAssign), PREC_ASSIGNMENT }; rules[TK("-=")] = { nullptr, METHOD(exprAssign), PREC_ASSIGNMENT }; @@ -402,13 +400,6 @@ private: emit(OP_LOAD_LAMBDA, co()->add_const(vm->PyFunction(func))); } - void exprWalrus() { - // NAME is on stack - EXPR_TUPLE(); - // EXPR is on stack - emit(OP_STORE_REF); // will pop the value and the name off the stack, - // we need to return the value now - } void exprAssign() { co()->_rvalue = true; TokenIndex op = parser->prev.type; @@ -512,21 +503,10 @@ private: } void exprGrouping() { - // either a expr in parens, - // or a tuple. match_newlines(mode()==REPL_MODE); - // do { - // if (peek() == TK("@id")) { - // consume(TK("@id")); - // exprAssign(); - // } - // else { - // EXPR(); - // } - // } while (match(TK(","))); - // EXPR_TUPLE(); do { if (peek() == TK(")")) break; + // match walrus operator if(peek() == TK("@id") && peek_next() == TK(":=")) { consume(TK("@id")); Token tkname = parser->prev; @@ -534,26 +514,18 @@ private: tkname.str(), codes.size()>1 ? NAME_LOCAL : NAME_GLOBAL ); + // store the expr into NAME, + // and push it on the stack as well, + // so it is available as a value + // in the expression emit(OP_LOAD_NAME_REF, index); consume(TK(":=")); - exprWalrus(); + EXPR(); + emit(OP_STORE_REF); emit(OP_LOAD_NAME, index); - - // const Str& key = parser->prev.str(); - // emit(OP_LOAD_CONST, co()->add_const(vm->PyStr(key))); - // consume(TK("=")); - // co()->_rvalue=true; EXPR(); co()->_rvalue=false; - } - else { - EXPR_TUPLE(); } + else EXPR_TUPLE(); } while (match(TK(","))); - // if (peek() == TK("@id")) { - // consume(TK("@id")); - // exprAssign(); - // } else { - // EXPR_TUPLE(); - // } match_newlines(mode()==REPL_MODE); consume(TK(")")); } diff --git a/src/vm.h b/src/vm.h index a4b4f6ad..a9321faf 100644 --- a/src/vm.h +++ b/src/vm.h @@ -23,9 +23,9 @@ public: PyVar run_frame(Frame* frame){ while(frame->has_next_bytecode()){ const Bytecode& byte = frame->next_bytecode(); - if(true || frame->_module != builtins){ - printf("%d: %s (%d)\n", frame->_ip, OP_NAMES[byte.op], byte.arg); - } + // if(true || frame->_module != builtins){ + // printf("%d: %s (%d)\n",frame->_ip, OP_NAMES[byte.op], byte.arg); + // } switch (byte.op) { case OP_NO_OP: break; // do nothing diff --git a/tests/_basic.py b/tests/_basic.py index be06473a..ff94ca8f 100644 --- a/tests/_basic.py +++ b/tests/_basic.py @@ -4,7 +4,7 @@ assert 0xffff == 65535 assert 0xAAFFFF == 11206655 assert 0x7fffffff == 2147483647 -# test == != >= <= < > +# test == != >= <= < > # generate 2 cases for each operator assert -1 == -1 assert -1 != 1 @@ -99,7 +99,7 @@ assert [1, 2, 3] == [1, 2, 3] assert [1, 2, 3] != [1, 2, 4] # test + *= -assert [1, 2, 3] + [4, 5, 6] == [1, 2, 3, 4, 5, 6] +assert [1, 2, 3] + [4, 5, 6] == [1, 2, 3, 4, 5, 6] assert [1, 2, 3] * 3 == [1, 2, 3, 1, 2, 3, 1, 2, 3] # test ?: @@ -117,3 +117,13 @@ assert round(23.2) == 23 assert round(23.8) == 24 assert round(-23.2) == -23 assert round(-23.8) == -24 + +assert (x := 1) == 1 +assert (a := 1, b := 2) +assert a == 1 +assert b == 2 + +assert (x := (a := 1, b := 2)) == (1, 2) +assert x == 1 +assert (x := 0) + 1 == 1 +assert (x := 1, y := 2, 3) == (1,2,3) \ No newline at end of file diff --git a/tests/_controlflow.py b/tests/_controlflow.py index 40ebf24a..fca06cef 100644 --- a/tests/_controlflow.py +++ b/tests/_controlflow.py @@ -1,16 +1,16 @@ # if tests flag = False name = 'luren' -if name == 'python': - flag = True +if name == 'python': + flag = True else: - flag + flag assert flag == False num = 9 flag = 0 -if num >= 0 and num <= 10: +if num >= 0 and num <= 10: flag = 1 else: flag @@ -18,27 +18,27 @@ assert flag == 1 num = 10 flag = 0 -if num < 0 or num > 10: +if num < 0 or num > 10: flag = 1 else: flag assert flag == 0 num = 5 -result = 0 -if num == 3: - result = num +result = 0 +if num == 3: + result = num elif num == 2: result = num elif num == 1: result = num -elif num < 0: +elif num < 0: result = num else: result = num -assert result == 5 +assert result == 5 -# for tests +# for tests k = 0 for i in range(2, 1000): @@ -64,4 +64,3 @@ count = 0 while (count < 1000): count = count + 1 assert count == 1000 - diff --git a/tests/_walrus.py b/tests/_walrus.py deleted file mode 100644 index 952e4d53..00000000 --- a/tests/_walrus.py +++ /dev/null @@ -1,7 +0,0 @@ -assert ( x := 1) == 1 -assert ( y := 1) + 2 == 3 - -a = (y := 4) + 5 -assert a == 9 -assert y == 4 -