mirror of
https://github.com/pocketpy/pocketpy
synced 2025-12-07 10:40:16 +00:00
up
This commit is contained in:
parent
4d7b9d1c7c
commit
b88cd66046
@ -676,13 +676,13 @@ private:
|
|||||||
case TK("yield"):
|
case TK("yield"):
|
||||||
if (contexts.size() <= 1) SyntaxError("'yield' outside function");
|
if (contexts.size() <= 1) SyntaxError("'yield' outside function");
|
||||||
EXPR_TUPLE(true);
|
EXPR_TUPLE(true);
|
||||||
// if yield present, the function is a generator
|
// if yield present, mark the function as generator
|
||||||
ctx()->co->is_generator = true;
|
ctx()->co->is_generator = true;
|
||||||
ctx()->emit(OP_YIELD_VALUE, BC_NOARG, kw_line);
|
ctx()->emit(OP_YIELD_VALUE, BC_NOARG, kw_line);
|
||||||
consume_end_stmt();
|
consume_end_stmt();
|
||||||
break;
|
break;
|
||||||
case TK("return"):
|
case TK("return"):
|
||||||
if (contexts.size() <= 1) SyntaxError("'return' outside function");
|
if (contexts.size() <= 1) SyntaxError("'ret urn' outside function");
|
||||||
if(match_end_stmt()){
|
if(match_end_stmt()){
|
||||||
ctx()->emit(OP_LOAD_NONE, BC_NOARG, kw_line);
|
ctx()->emit(OP_LOAD_NONE, BC_NOARG, kw_line);
|
||||||
}else{
|
}else{
|
||||||
@ -710,7 +710,10 @@ private:
|
|||||||
break;
|
break;
|
||||||
case TK("del"):
|
case TK("del"):
|
||||||
EXPR_TUPLE();
|
EXPR_TUPLE();
|
||||||
ctx()->emit_lvalue();
|
Expr_ e = ctx()->s_expr.popx();
|
||||||
|
switch(e->ref_type()){
|
||||||
|
case EXPR_NAME_REF:
|
||||||
|
}
|
||||||
ctx()->emit(OP_DELETE_REF, BC_NOARG, kw_line);
|
ctx()->emit(OP_DELETE_REF, BC_NOARG, kw_line);
|
||||||
consume_end_stmt();
|
consume_end_stmt();
|
||||||
break;
|
break;
|
||||||
|
|||||||
47
src/expr.h
47
src/expr.h
@ -10,14 +10,25 @@
|
|||||||
namespace pkpy{
|
namespace pkpy{
|
||||||
|
|
||||||
struct CodeEmitContext;
|
struct CodeEmitContext;
|
||||||
|
|
||||||
|
enum ExprRefType{
|
||||||
|
EXPR_NO_REF,
|
||||||
|
EXPR_NAME_REF,
|
||||||
|
EXPR_ATTR_REF,
|
||||||
|
EXPR_INDEX_REF,
|
||||||
|
EXPR_STARRED_REF,
|
||||||
|
EXPR_TUPLE_REF
|
||||||
|
};
|
||||||
|
|
||||||
struct Expr{
|
struct Expr{
|
||||||
int line = 0;
|
int line = 0;
|
||||||
virtual ~Expr() = default;
|
virtual ~Expr() = default;
|
||||||
virtual void emit(CodeEmitContext* ctx) = 0;
|
virtual void emit(CodeEmitContext* ctx) = 0;
|
||||||
virtual Str str() const = 0;
|
virtual Str str() const = 0;
|
||||||
|
virtual std::vector<const Expr*> children() = 0;
|
||||||
|
|
||||||
virtual void emit_ref(CodeEmitContext* ctx){
|
virtual ExprRefType ref_type() const {
|
||||||
throw std::runtime_error("emit_ref() is not supported");
|
return EXPR_NO_REF;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -96,6 +107,7 @@ struct CodeEmitContext{
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
struct NameExpr: Expr{
|
struct NameExpr: Expr{
|
||||||
Str name;
|
Str name;
|
||||||
NameScope scope;
|
NameScope scope;
|
||||||
@ -109,9 +121,8 @@ struct NameExpr: Expr{
|
|||||||
ctx->emit(OP_LOAD_NAME, index, line);
|
ctx->emit(OP_LOAD_NAME, index, line);
|
||||||
}
|
}
|
||||||
|
|
||||||
void emit_ref(CodeEmitContext* ctx) override {
|
ExprRefType ref_type() const override {
|
||||||
int index = ctx->add_name(name, scope);
|
return EXPR_NAME_REF;
|
||||||
ctx->emit(OP_LOAD_NAME_REF, index, line);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -126,12 +137,12 @@ struct StarredExpr: Expr{
|
|||||||
ctx->emit(OP_UNARY_STAR, (int)false, line);
|
ctx->emit(OP_UNARY_STAR, (int)false, line);
|
||||||
}
|
}
|
||||||
|
|
||||||
void emit_ref(CodeEmitContext* ctx) override {
|
ExprRefType ref_type() const override {
|
||||||
child->emit(ctx);
|
return EXPR_STARRED_REF;
|
||||||
ctx->emit(OP_UNARY_STAR, (int)true, line);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
struct NegatedExpr: Expr{
|
struct NegatedExpr: Expr{
|
||||||
Expr_ child;
|
Expr_ child;
|
||||||
NegatedExpr(Expr_&& child): child(std::move(child)) {}
|
NegatedExpr(Expr_&& child): child(std::move(child)) {}
|
||||||
@ -296,6 +307,10 @@ struct SetExpr: SequenceExpr{
|
|||||||
struct TupleExpr: SequenceExpr{
|
struct TupleExpr: SequenceExpr{
|
||||||
Str str() const override { return "tuple()"; }
|
Str str() const override { return "tuple()"; }
|
||||||
Opcode opcode() const override { return OP_BUILD_TUPLE; }
|
Opcode opcode() const override { return OP_BUILD_TUPLE; }
|
||||||
|
|
||||||
|
ExprRefType ref_type() const override {
|
||||||
|
return EXPR_TUPLE_REF;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct CompExpr: Expr{
|
struct CompExpr: Expr{
|
||||||
@ -330,7 +345,7 @@ struct LambdaExpr: Expr{
|
|||||||
void emit(CodeEmitContext* ctx) override {
|
void emit(CodeEmitContext* ctx) override {
|
||||||
VM* vm = ctx->vm;
|
VM* vm = ctx->vm;
|
||||||
ctx->emit(OP_LOAD_FUNCTION, ctx->add_const(VAR(func)), line);
|
ctx->emit(OP_LOAD_FUNCTION, ctx->add_const(VAR(func)), line);
|
||||||
if(scope == NAME_LOCAL) ctx->emit(OP_SETUP_CLOSURE, BC_NOARG, line);
|
if(scope == NAME_LOCAL) ctx->emit(OP_SETUP_CLOSURE, BC_NOARG, BC_KEEPLINE);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -374,6 +389,16 @@ struct SubscrExpr: Expr{
|
|||||||
Expr_ a;
|
Expr_ a;
|
||||||
Expr_ b;
|
Expr_ b;
|
||||||
Str str() const override { return "a[b]"; }
|
Str str() const override { return "a[b]"; }
|
||||||
|
|
||||||
|
void emit(CodeEmitContext* ctx) override{
|
||||||
|
a->emit(ctx);
|
||||||
|
b->emit(ctx);
|
||||||
|
ctx->emit(OP_BUILD_INDEX, BC_NOARG, line);
|
||||||
|
}
|
||||||
|
|
||||||
|
ExprRefType ref_type() const override {
|
||||||
|
return EXPR_INDEX_REF;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct AttribExpr: Expr{
|
struct AttribExpr: Expr{
|
||||||
@ -382,6 +407,10 @@ struct AttribExpr: Expr{
|
|||||||
AttribExpr(Expr_ a, const Str& b): a(std::move(a)), b(b) {}
|
AttribExpr(Expr_ a, const Str& b): a(std::move(a)), b(b) {}
|
||||||
AttribExpr(Expr_ a, Str&& b): a(std::move(a)), b(std::move(b)) {}
|
AttribExpr(Expr_ a, Str&& b): a(std::move(a)), b(std::move(b)) {}
|
||||||
Str str() const override { return "a.b"; }
|
Str str() const override { return "a.b"; }
|
||||||
|
|
||||||
|
ExprRefType ref_type() const override {
|
||||||
|
return EXPR_ATTR_REF;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct CallExpr: Expr{
|
struct CallExpr: Expr{
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user