mirror of
https://github.com/pocketpy/pocketpy
synced 2025-12-07 10:40:16 +00:00
up
This commit is contained in:
parent
744b0f8dde
commit
e8da021105
@ -572,17 +572,17 @@ private:
|
|||||||
do {
|
do {
|
||||||
ctx()->emit(OP_DUP_TOP_VALUE, BC_NOARG, BC_KEEPLINE);
|
ctx()->emit(OP_DUP_TOP_VALUE, BC_NOARG, BC_KEEPLINE);
|
||||||
consume(TK("@id"));
|
consume(TK("@id"));
|
||||||
Token tkname = prev();
|
Str name = prev().str();
|
||||||
int index = co()->add_name(tkname.str(), NAME_ATTR);
|
int index = ctx()->add_name(name, NAME_ATTR);
|
||||||
emit(OP_BUILD_ATTR, index);
|
ctx()->emit(OP_BUILD_ATTR, index, prev().line);
|
||||||
if (match(TK("as"))) {
|
if (match(TK("as"))) {
|
||||||
consume(TK("@id"));
|
consume(TK("@id"));
|
||||||
tkname = prev();
|
name = prev().str();
|
||||||
}
|
}
|
||||||
index = co()->add_name(tkname.str(), name_scope());
|
index = ctx()->add_name(name, name_scope());
|
||||||
emit(OP_STORE_NAME, index);
|
ctx()->emit(OP_STORE_NAME, index, prev().line);
|
||||||
} while (match(TK(",")));
|
} while (match(TK(",")));
|
||||||
emit(OP_POP_TOP);
|
ctx()->emit(OP_POP_TOP, BC_NOARG, BC_KEEPLINE);
|
||||||
consume_end_stmt();
|
consume_end_stmt();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -599,7 +599,6 @@ private:
|
|||||||
while (rules[curr().type].precedence >= precedence) {
|
while (rules[curr().type].precedence >= precedence) {
|
||||||
TokenIndex op = curr().type;
|
TokenIndex op = curr().type;
|
||||||
advance();
|
advance();
|
||||||
if (op == TK(":") && !allowslice) SyntaxError();
|
|
||||||
PrattCallback infix = rules[op].infix;
|
PrattCallback infix = rules[op].infix;
|
||||||
if(infix == nullptr) throw std::runtime_error("(infix == nullptr) is true");
|
if(infix == nullptr) throw std::runtime_error("(infix == nullptr) is true");
|
||||||
(this->*infix)();
|
(this->*infix)();
|
||||||
@ -609,33 +608,33 @@ private:
|
|||||||
void compile_if_stmt() {
|
void compile_if_stmt() {
|
||||||
match_newlines();
|
match_newlines();
|
||||||
EXPR(); // condition
|
EXPR(); // condition
|
||||||
emit_expr();
|
ctx()->emit_expr();
|
||||||
int ifpatch = emit(OP_POP_JUMP_IF_FALSE);
|
int ifpatch = ctx()->emit(OP_POP_JUMP_IF_FALSE, BC_NOARG, prev().line);
|
||||||
compile_block_body();
|
compile_block_body();
|
||||||
|
|
||||||
if (match(TK("elif"))) {
|
if (match(TK("elif"))) {
|
||||||
int exit_jump = emit(OP_JUMP_ABSOLUTE);
|
int exit_jump = ctx()->emit(OP_JUMP_ABSOLUTE, BC_NOARG, prev().line);
|
||||||
patch_jump(ifpatch);
|
ctx()->patch_jump(ifpatch);
|
||||||
compile_if_stmt();
|
compile_if_stmt();
|
||||||
patch_jump(exit_jump);
|
ctx()->patch_jump(exit_jump);
|
||||||
} else if (match(TK("else"))) {
|
} else if (match(TK("else"))) {
|
||||||
int exit_jump = emit(OP_JUMP_ABSOLUTE);
|
int exit_jump = ctx()->emit(OP_JUMP_ABSOLUTE, BC_NOARG, prev().line);
|
||||||
patch_jump(ifpatch);
|
ctx()->patch_jump(ifpatch);
|
||||||
compile_block_body();
|
compile_block_body();
|
||||||
patch_jump(exit_jump);
|
ctx()->patch_jump(exit_jump);
|
||||||
} else {
|
} else {
|
||||||
patch_jump(ifpatch);
|
ctx()->patch_jump(ifpatch);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void compile_while_loop() {
|
void compile_while_loop() {
|
||||||
ctx()->enter_block(WHILE_LOOP);
|
ctx()->enter_block(WHILE_LOOP);
|
||||||
EXPR(); // condition
|
EXPR(); // condition
|
||||||
emit_expr();
|
ctx()->emit_expr();
|
||||||
int patch = emit(OP_POP_JUMP_IF_FALSE);
|
int patch = ctx()->emit(OP_POP_JUMP_IF_FALSE, BC_NOARG, prev().line);
|
||||||
compile_block_body();
|
compile_block_body();
|
||||||
emit(OP_LOOP_CONTINUE, -1, true);
|
ctx()->emit(OP_LOOP_CONTINUE, BC_NOARG, BC_KEEPLINE);
|
||||||
patch_jump(patch);
|
ctx()->patch_jump(patch);
|
||||||
ctx()->exit_block();
|
ctx()->exit_block();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -643,7 +642,7 @@ private:
|
|||||||
int size = 0;
|
int size = 0;
|
||||||
do {
|
do {
|
||||||
consume(TK("@id"));
|
consume(TK("@id"));
|
||||||
int index = co()->add_name(prev().str(), name_scope());
|
int index = ctx()->add_name(prev().str(), name_scope());
|
||||||
emit(OP_LOAD_NAME_REF, index);
|
emit(OP_LOAD_NAME_REF, index);
|
||||||
size++;
|
size++;
|
||||||
} while (match(TK(",")));
|
} while (match(TK(",")));
|
||||||
@ -663,16 +662,18 @@ private:
|
|||||||
|
|
||||||
void compile_try_except() {
|
void compile_try_except() {
|
||||||
ctx()->enter_block(TRY_EXCEPT);
|
ctx()->enter_block(TRY_EXCEPT);
|
||||||
emit(OP_TRY_BLOCK_ENTER);
|
ctx()->emit(OP_TRY_BLOCK_ENTER, BC_NOARG, prev().line);
|
||||||
compile_block_body();
|
compile_block_body();
|
||||||
emit(OP_TRY_BLOCK_EXIT);
|
ctx()->emit(OP_TRY_BLOCK_EXIT, BC_NOARG, BC_KEEPLINE);
|
||||||
std::vector<int> patches = { emit(OP_JUMP_ABSOLUTE) };
|
std::vector<int> patches = {
|
||||||
|
ctx()->emit(OP_JUMP_ABSOLUTE, BC_NOARG, BC_KEEPLINE)
|
||||||
|
};
|
||||||
ctx()->exit_block();
|
ctx()->exit_block();
|
||||||
|
|
||||||
do {
|
do {
|
||||||
consume(TK("except"));
|
consume(TK("except"));
|
||||||
if(match(TK("@id"))){
|
if(match(TK("@id"))){
|
||||||
int name_idx = co()->add_name(prev().str(), NAME_SPECIAL);
|
int name_idx = ctx()->add_name(prev().str(), NAME_SPECIAL);
|
||||||
emit(OP_EXCEPTION_MATCH, name_idx);
|
emit(OP_EXCEPTION_MATCH, name_idx);
|
||||||
}else{
|
}else{
|
||||||
emit(OP_LOAD_TRUE);
|
emit(OP_LOAD_TRUE);
|
||||||
@ -691,26 +692,28 @@ private:
|
|||||||
if (match(TK("break"))) {
|
if (match(TK("break"))) {
|
||||||
if (!ctx()->is_curr_block_loop()) SyntaxError("'break' outside loop");
|
if (!ctx()->is_curr_block_loop()) SyntaxError("'break' outside loop");
|
||||||
consume_end_stmt();
|
consume_end_stmt();
|
||||||
emit(OP_LOOP_BREAK);
|
ctx()->emit(OP_LOOP_BREAK, BC_NOARG, prev().line);
|
||||||
} else if (match(TK("continue"))) {
|
} else if (match(TK("continue"))) {
|
||||||
if (!ctx()->is_curr_block_loop()) SyntaxError("'continue' not properly in loop");
|
if (!ctx()->is_curr_block_loop()) SyntaxError("'continue' not properly in loop");
|
||||||
consume_end_stmt();
|
consume_end_stmt();
|
||||||
emit(OP_LOOP_CONTINUE);
|
ctx()->emit(OP_LOOP_CONTINUE, BC_NOARG, prev().line);
|
||||||
} else if (match(TK("yield"))) {
|
} else if (match(TK("yield"))) {
|
||||||
if (contexts.size() <= 1) SyntaxError("'yield' outside function");
|
if (contexts.size() <= 1) SyntaxError("'yield' outside function");
|
||||||
EXPR_TUPLE(); emit_expr();
|
EXPR_TUPLE();
|
||||||
|
ctx()->emit_expr();
|
||||||
consume_end_stmt();
|
consume_end_stmt();
|
||||||
co()->is_generator = true;
|
co()->is_generator = true;
|
||||||
emit(OP_YIELD_VALUE, -1, true);
|
ctx()->emit(OP_YIELD_VALUE, BC_NOARG, BC_KEEPLINE);
|
||||||
} else if (match(TK("return"))) {
|
} else if (match(TK("return"))) {
|
||||||
if (contexts.size() <= 1) SyntaxError("'return' outside function");
|
if (contexts.size() <= 1) SyntaxError("'return' outside function");
|
||||||
if(match_end_stmt()){
|
if(match_end_stmt()){
|
||||||
emit(OP_LOAD_NONE);
|
ctx()->emit(OP_LOAD_NONE, BC_NOARG, prev().line);
|
||||||
}else{
|
}else{
|
||||||
EXPR_TUPLE(); emit_expr();
|
EXPR_TUPLE();
|
||||||
|
ctx()->emit_expr();
|
||||||
consume_end_stmt();
|
consume_end_stmt();
|
||||||
}
|
}
|
||||||
emit(OP_RETURN_VALUE, -1, true);
|
ctx()->emit(OP_RETURN_VALUE, BC_NOARG, BC_KEEPLINE);
|
||||||
} else if (match(TK("if"))) {
|
} else if (match(TK("if"))) {
|
||||||
compile_if_stmt();
|
compile_if_stmt();
|
||||||
} else if (match(TK("while"))) {
|
} else if (match(TK("while"))) {
|
||||||
@ -734,12 +737,10 @@ private:
|
|||||||
} else if (match(TK("try"))) {
|
} else if (match(TK("try"))) {
|
||||||
compile_try_except();
|
compile_try_except();
|
||||||
} else if(match(TK("assert"))) {
|
} else if(match(TK("assert"))) {
|
||||||
EXPR_TUPLE(); emit_expr();
|
EXPR_TUPLE();
|
||||||
|
ctx()->emit_expr();
|
||||||
// OP_CODE needs to change
|
// OP_CODE needs to change
|
||||||
|
ctx()->emit(OP_ASSERT, BC_NOARG, BC_KEEPLINE);
|
||||||
// if (match(TK(","))) EXPR();
|
|
||||||
// else emit(OP_LOAD_CONST, co()->add_const(VAR("")));
|
|
||||||
emit(OP_ASSERT);
|
|
||||||
consume_end_stmt();
|
consume_end_stmt();
|
||||||
} else if(match(TK("with"))){
|
} else if(match(TK("with"))){
|
||||||
EXPR();
|
EXPR();
|
||||||
|
|||||||
@ -242,7 +242,7 @@ struct DictExpr: Expr{
|
|||||||
|
|
||||||
struct SetExpr: Expr{
|
struct SetExpr: Expr{
|
||||||
std::vector<Expr_> items;
|
std::vector<Expr_> items;
|
||||||
Set(std::vector<Expr_>&& items): items(std::move(items)) {}
|
SetExpr(std::vector<Expr_>&& items): items(std::move(items)) {}
|
||||||
Str str() const override { return "{}"; }
|
Str str() const override { return "{}"; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user