add unpack builder

This commit is contained in:
blueloveTH 2023-06-09 22:28:36 +08:00
parent 636dbdd64a
commit 754808412b
6 changed files with 60 additions and 10 deletions

View File

@ -343,13 +343,21 @@ class Compiler {
match_newlines_repl(); match_newlines_repl();
if (curr().type == TK("}")) break; if (curr().type == TK("}")) break;
EXPR(); EXPR();
if(curr().type == TK(":")) parsing_dict = true; int star_level = ctx()->s_expr.top()->star_level();
if(star_level==2 || curr().type == TK(":")){
parsing_dict = true;
}
if(parsing_dict){ if(parsing_dict){
consume(TK(":"));
EXPR();
auto dict_item = make_expr<DictItemExpr>(); auto dict_item = make_expr<DictItemExpr>();
dict_item->key = ctx()->s_expr.popx(); if(star_level == 2){
dict_item->value = ctx()->s_expr.popx(); dict_item->key = nullptr;
dict_item->value = ctx()->s_expr.popx();
}else{
consume(TK(":"));
EXPR();
dict_item->key = ctx()->s_expr.popx();
dict_item->value = ctx()->s_expr.popx();
}
items.push_back(std::move(dict_item)); items.push_back(std::move(dict_item));
}else{ }else{
items.push_back(ctx()->s_expr.popx()); items.push_back(ctx()->s_expr.popx());

View File

@ -366,7 +366,7 @@ struct SliceExpr: Expr{
}; };
struct DictItemExpr: Expr{ struct DictItemExpr: Expr{
Expr_ key; Expr_ key; // maybe nullptr if it is **kwargs
Expr_ value; Expr_ value;
std::string str() const override { return "DictItem()"; } std::string str() const override { return "DictItem()"; }
@ -374,6 +374,7 @@ struct DictItemExpr: Expr{
void emit(CodeEmitContext* ctx) override { void emit(CodeEmitContext* ctx) override {
if(is_starred()){ if(is_starred()){
PK_ASSERT(key == nullptr);
value->emit(ctx); value->emit(ctx);
}else{ }else{
value->emit(ctx); value->emit(ctx);

View File

@ -74,4 +74,13 @@ assert a == [8, 2, 4, 2, 9]
b = [(1, 2), (3, 3), (5, 1)] b = [(1, 2), (3, 3), (5, 1)]
b.sort(key=lambda x:x[1]) b.sort(key=lambda x:x[1])
assert b == [(5, 1), (1, 2), (3,3)] assert b == [(5, 1), (1, 2), (3,3)]
# unpack expression
a = [1, 2, 3]
b = [*a, 4, 5]
assert b == [1, 2, 3, 4, 5]
a = []
b = [*a, 1, 2, 3, *a, *a]
assert b == [1, 2, 3]

View File

@ -5,4 +5,13 @@ assert b == 2
a,b = b,a a,b = b,a
assert a == 2 assert a == 2
assert b == 1 assert b == 1
assert len(tup) == 6 assert len(tup) == 6
# unpack expression
a = 1, 2, 3
b = *a, 4, 5
assert b == (1, 2, 3, 4, 5)
a = tuple([])
b = *a, 1, 2, 3, *a, *a
assert b == (1, 2, 3)

View File

@ -52,4 +52,18 @@ assert a == {1: 2, 3: 4}
assert a.pop(1) == 2 assert a.pop(1) == 2
assert a == {3: 4} assert a == {3: 4}
assert a.pop(3) == 4 assert a.pop(3) == 4
assert a == {} assert a == {}
# unpack expression
a = {1:2, 3:4}
b = {**a, 5:6, **a}
assert b == {1: 2, 3: 4, 5: 6}
a = {}
b = {**a, 1:2, 3:4}
assert b == {1: 2, 3: 4}
a = {1:2, 3:4, 7:8}
b = {**a, 1:5, 3:6}
c = {**a, **b}
assert c == {1: 5, 3: 6, 7: 8}

View File

@ -76,4 +76,13 @@ assert type({}) is dict
assert {1,2}.issubset({1,2,3}) assert {1,2}.issubset({1,2,3})
assert {1,2,3}.issuperset({1,2}) assert {1,2,3}.issuperset({1,2})
assert {1,2,3}.isdisjoint({4,5,6}) assert {1,2,3}.isdisjoint({4,5,6})
assert not {1,2,3}.isdisjoint({2,3,4}) assert not {1,2,3}.isdisjoint({2,3,4})
# unpack expression
a = {1, 2, 3}
b = {*a, 4, 5, *a, *a}
assert b == {1, 2, 3, 4, 5}
a = set()
b = {*a, 1, 2, 3, *a, *a}
assert b == {1, 2, 3}