From a28afb60be8f503d47d9d9cafd051fb5d225e4a1 Mon Sep 17 00:00:00 2001 From: blueloveTH Date: Mon, 18 Dec 2023 20:29:12 +0800 Subject: [PATCH] fix a parser bug --- src/compiler.cpp | 20 +++++++++++--------- tests/40_class_ex.py | 9 +++++++++ 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/compiler.cpp b/src/compiler.cpp index 9cac9a65..4a2ccc2d 100644 --- a/src/compiler.cpp +++ b/src/compiler.cpp @@ -756,6 +756,10 @@ __EAT_DOTS_END: } void Compiler::compile_stmt() { + if(match(TK("class"))){ + compile_class(); + return; + } advance(); int kw_line = prev().line; // backup line number int curr_loop_block = ctx()->get_loop(); @@ -968,6 +972,12 @@ __EAT_DOTS_END: base->emit_(ctx()); } 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; compile_block_body(); ctx()->is_compiling_class = false; @@ -1134,10 +1144,6 @@ __EAT_DOTS_END: used = true; tokens = lexer->run(); - // if(lexer->src->filename == ""){ - // for(auto& t: tokens) std::cout << t.info() << std::endl; - // } - CodeObject_ code = push_global_context(); advance(); // skip @sof, so prev() is always valid @@ -1161,11 +1167,7 @@ __EAT_DOTS_END: } while (!match(TK("@eof"))) { - if (match(TK("class"))) { - compile_class(); - } else { - compile_stmt(); - } + compile_stmt(); match_newlines(); } pop_context(); diff --git a/tests/40_class_ex.py b/tests/40_class_ex.py index de9e5607..3877fc04 100644 --- a/tests/40_class_ex.py +++ b/tests/40_class_ex.py @@ -117,3 +117,12 @@ class A(c.void_p): a = A(0) assert repr(a).startswith('