This commit is contained in:
BLUELOVETH 2023-04-01 04:25:09 +00:00
parent 744b0f8dde
commit e8da021105
2 changed files with 40 additions and 39 deletions

View File

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

View File

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