mirror of
https://github.com/pocketpy/pocketpy
synced 2025-11-07 20:20:17 +00:00
f
This commit is contained in:
parent
72e36997ca
commit
4c8b5236e7
@ -74,8 +74,6 @@ public:
|
|||||||
rules[TK("@str")] = { METHOD(exprLiteral), NO_INFIX };
|
rules[TK("@str")] = { METHOD(exprLiteral), NO_INFIX };
|
||||||
rules[TK("@fstr")] = { METHOD(exprFString), NO_INFIX };
|
rules[TK("@fstr")] = { METHOD(exprFString), NO_INFIX };
|
||||||
rules[TK("?")] = { nullptr, METHOD(exprTernary), PREC_TERNARY };
|
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 };
|
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)));
|
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() {
|
void exprAssign() {
|
||||||
co()->_rvalue = true;
|
co()->_rvalue = true;
|
||||||
TokenIndex op = parser->prev.type;
|
TokenIndex op = parser->prev.type;
|
||||||
@ -512,21 +503,10 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void exprGrouping() {
|
void exprGrouping() {
|
||||||
// either a expr in parens,
|
|
||||||
// or a tuple.
|
|
||||||
match_newlines(mode()==REPL_MODE);
|
match_newlines(mode()==REPL_MODE);
|
||||||
// do {
|
|
||||||
// if (peek() == TK("@id")) {
|
|
||||||
// consume(TK("@id"));
|
|
||||||
// exprAssign();
|
|
||||||
// }
|
|
||||||
// else {
|
|
||||||
// EXPR();
|
|
||||||
// }
|
|
||||||
// } while (match(TK(",")));
|
|
||||||
// EXPR_TUPLE();
|
|
||||||
do {
|
do {
|
||||||
if (peek() == TK(")")) break;
|
if (peek() == TK(")")) break;
|
||||||
|
// match walrus operator
|
||||||
if(peek() == TK("@id") && peek_next() == TK(":=")) {
|
if(peek() == TK("@id") && peek_next() == TK(":=")) {
|
||||||
consume(TK("@id"));
|
consume(TK("@id"));
|
||||||
Token tkname = parser->prev;
|
Token tkname = parser->prev;
|
||||||
@ -534,26 +514,18 @@ private:
|
|||||||
tkname.str(),
|
tkname.str(),
|
||||||
codes.size()>1 ? NAME_LOCAL : NAME_GLOBAL
|
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);
|
emit(OP_LOAD_NAME_REF, index);
|
||||||
consume(TK(":="));
|
consume(TK(":="));
|
||||||
exprWalrus();
|
EXPR();
|
||||||
|
emit(OP_STORE_REF);
|
||||||
emit(OP_LOAD_NAME, index);
|
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(",")));
|
} while (match(TK(",")));
|
||||||
// if (peek() == TK("@id")) {
|
|
||||||
// consume(TK("@id"));
|
|
||||||
// exprAssign();
|
|
||||||
// } else {
|
|
||||||
// EXPR_TUPLE();
|
|
||||||
// }
|
|
||||||
match_newlines(mode()==REPL_MODE);
|
match_newlines(mode()==REPL_MODE);
|
||||||
consume(TK(")"));
|
consume(TK(")"));
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,7 +4,7 @@ assert 0xffff == 65535
|
|||||||
assert 0xAAFFFF == 11206655
|
assert 0xAAFFFF == 11206655
|
||||||
assert 0x7fffffff == 2147483647
|
assert 0x7fffffff == 2147483647
|
||||||
|
|
||||||
# test == != >= <= < >
|
# test == != >= <= < >
|
||||||
# generate 2 cases for each operator
|
# generate 2 cases for each operator
|
||||||
assert -1 == -1
|
assert -1 == -1
|
||||||
assert -1 != 1
|
assert -1 != 1
|
||||||
@ -99,7 +99,7 @@ assert [1, 2, 3] == [1, 2, 3]
|
|||||||
assert [1, 2, 3] != [1, 2, 4]
|
assert [1, 2, 3] != [1, 2, 4]
|
||||||
|
|
||||||
# test + *=
|
# 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]
|
assert [1, 2, 3] * 3 == [1, 2, 3, 1, 2, 3, 1, 2, 3]
|
||||||
|
|
||||||
# test ?:
|
# test ?:
|
||||||
@ -117,3 +117,13 @@ assert round(23.2) == 23
|
|||||||
assert round(23.8) == 24
|
assert round(23.8) == 24
|
||||||
assert round(-23.2) == -23
|
assert round(-23.2) == -23
|
||||||
assert round(-23.8) == -24
|
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)
|
||||||
@ -1,16 +1,16 @@
|
|||||||
# if tests
|
# if tests
|
||||||
flag = False
|
flag = False
|
||||||
name = 'luren'
|
name = 'luren'
|
||||||
if name == 'python':
|
if name == 'python':
|
||||||
flag = True
|
flag = True
|
||||||
else:
|
else:
|
||||||
flag
|
flag
|
||||||
assert flag == False
|
assert flag == False
|
||||||
|
|
||||||
|
|
||||||
num = 9
|
num = 9
|
||||||
flag = 0
|
flag = 0
|
||||||
if num >= 0 and num <= 10:
|
if num >= 0 and num <= 10:
|
||||||
flag = 1
|
flag = 1
|
||||||
else:
|
else:
|
||||||
flag
|
flag
|
||||||
@ -18,27 +18,27 @@ assert flag == 1
|
|||||||
|
|
||||||
num = 10
|
num = 10
|
||||||
flag = 0
|
flag = 0
|
||||||
if num < 0 or num > 10:
|
if num < 0 or num > 10:
|
||||||
flag = 1
|
flag = 1
|
||||||
else:
|
else:
|
||||||
flag
|
flag
|
||||||
assert flag == 0
|
assert flag == 0
|
||||||
|
|
||||||
num = 5
|
num = 5
|
||||||
result = 0
|
result = 0
|
||||||
if num == 3:
|
if num == 3:
|
||||||
result = num
|
result = num
|
||||||
elif num == 2:
|
elif num == 2:
|
||||||
result = num
|
result = num
|
||||||
elif num == 1:
|
elif num == 1:
|
||||||
result = num
|
result = num
|
||||||
elif num < 0:
|
elif num < 0:
|
||||||
result = num
|
result = num
|
||||||
else:
|
else:
|
||||||
result = num
|
result = num
|
||||||
assert result == 5
|
assert result == 5
|
||||||
|
|
||||||
# for tests
|
# for tests
|
||||||
|
|
||||||
k = 0
|
k = 0
|
||||||
for i in range(2, 1000):
|
for i in range(2, 1000):
|
||||||
@ -64,4 +64,3 @@ count = 0
|
|||||||
while (count < 1000):
|
while (count < 1000):
|
||||||
count = count + 1
|
count = count + 1
|
||||||
assert count == 1000
|
assert count == 1000
|
||||||
|
|
||||||
|
|||||||
@ -1,7 +0,0 @@
|
|||||||
assert ( x := 1) == 1
|
|
||||||
assert ( y := 1) + 2 == 3
|
|
||||||
|
|
||||||
a = (y := 4) + 5
|
|
||||||
assert a == 9
|
|
||||||
assert y == 4
|
|
||||||
|
|
||||||
Loading…
x
Reference in New Issue
Block a user