fix a parser bug

This commit is contained in:
blueloveTH 2023-12-18 20:29:12 +08:00
parent 3219f588c2
commit a28afb60be
2 changed files with 20 additions and 9 deletions

View File

@ -756,6 +756,10 @@ __EAT_DOTS_END:
} }
void Compiler::compile_stmt() { void Compiler::compile_stmt() {
if(match(TK("class"))){
compile_class();
return;
}
advance(); advance();
int kw_line = prev().line; // backup line number int kw_line = prev().line; // backup line number
int curr_loop_block = ctx()->get_loop(); int curr_loop_block = ctx()->get_loop();
@ -968,6 +972,12 @@ __EAT_DOTS_END:
base->emit_(ctx()); base->emit_(ctx());
} }
ctx()->emit_(OP_BEGIN_CLASS, namei, BC_KEEPLINE); ctx()->emit_(OP_BEGIN_CLASS, namei, BC_KEEPLINE);
for(auto& c: this->contexts.data()){
if(c.is_compiling_class){
SyntaxError("nested class is not allowed");
}
}
ctx()->is_compiling_class = true; ctx()->is_compiling_class = true;
compile_block_body(); compile_block_body();
ctx()->is_compiling_class = false; ctx()->is_compiling_class = false;
@ -1134,10 +1144,6 @@ __EAT_DOTS_END:
used = true; used = true;
tokens = lexer->run(); tokens = lexer->run();
// if(lexer->src->filename == "<stdin>"){
// for(auto& t: tokens) std::cout << t.info() << std::endl;
// }
CodeObject_ code = push_global_context(); CodeObject_ code = push_global_context();
advance(); // skip @sof, so prev() is always valid advance(); // skip @sof, so prev() is always valid
@ -1161,11 +1167,7 @@ __EAT_DOTS_END:
} }
while (!match(TK("@eof"))) { while (!match(TK("@eof"))) {
if (match(TK("class"))) { compile_stmt();
compile_class();
} else {
compile_stmt();
}
match_newlines(); match_newlines();
} }
pop_context(); pop_context();

View File

@ -117,3 +117,12 @@ class A(c.void_p):
a = A(0) a = A(0)
assert repr(a).startswith('<void* at') assert repr(a).startswith('<void* at')
if 1:
class TrueClass:
pass
else:
class FalseClass:
pass
assert TrueClass