This commit is contained in:
aps 2023-02-15 12:24:36 -05:00
parent 72e36997ca
commit 4c8b5236e7
5 changed files with 34 additions and 60 deletions

View File

@ -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(")"));
}

File diff suppressed because one or more lines are too long

View File

@ -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)

View File

@ -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

View File

@ -1,7 +0,0 @@
assert ( x := 1) == 1
assert ( y := 1) + 2 == 3
a = (y := 4) + 5
assert a == 9
assert y == 4