diff --git a/include/element.h b/include/element.h index 754e7e9..a495472 100644 --- a/include/element.h +++ b/include/element.h @@ -2,15 +2,15 @@ #define ACPA_ELEMENT_H #include -#include -#include #include +#include #include +#include #include using std::map; -using std::set; using std::pair; +using std::set; using std::shared_ptr; using std::string; using std::vector; @@ -37,40 +37,70 @@ struct ValType { FUNCTION }; virtual ValType::Type type() const = 0; - virtual shared_ptr struct_replace(shared_ptr, map, shared_ptr>&) = 0; - virtual shared_ptr function_replace(const map, shared_ptr>&, map, shared_ptr>&) = 0; - virtual bool sameType(shared_ptr, set, shared_ptr>>&) = 0; + virtual shared_ptr struct_replace( + shared_ptr, + map, shared_ptr>&) + = 0; + virtual shared_ptr function_replace( + const map, shared_ptr>&, + map, shared_ptr>&) + = 0; + virtual bool sameType(shared_ptr, + set, shared_ptr>>&) + = 0; virtual ~ValType() = default; }; -struct TemplateType : ValType, std::enable_shared_from_this { +struct TemplateType + : ValType + , std::enable_shared_from_this { ValType::Type type() const override; - shared_ptr struct_replace(shared_ptr, map, shared_ptr>&) override; - shared_ptr function_replace(const map, shared_ptr>&, map, shared_ptr>&) override; - bool sameType(shared_ptr, set, shared_ptr>>&) override; + shared_ptr struct_replace( + shared_ptr, + map, shared_ptr>&) override; + shared_ptr function_replace( + const map, shared_ptr>&, + map, shared_ptr>&) override; + bool sameType(shared_ptr, + set, shared_ptr>>&) override; }; -struct StructType : ValType, std::enable_shared_from_this { +struct StructType + : ValType + , std::enable_shared_from_this { ValType::Type type() const override; - shared_ptr struct_replace(shared_ptr, map, shared_ptr>&) override; - shared_ptr function_replace(const map, shared_ptr>&, map, shared_ptr>&) override; - bool sameType(shared_ptr, set, shared_ptr>>&) override; + shared_ptr struct_replace( + shared_ptr, + map, shared_ptr>&) override; + shared_ptr function_replace( + const map, shared_ptr>&, + map, shared_ptr>&) override; + bool sameType(shared_ptr, + set, shared_ptr>>&) override; shared_ptr str; map, shared_ptr> mp; }; -struct FunctionType : ValType, std::enable_shared_from_this { +struct FunctionType + : ValType + , std::enable_shared_from_this { ValType::Type type() const override; - shared_ptr struct_replace(shared_ptr, map, shared_ptr>&) override; - shared_ptr function_replace(const map, shared_ptr>&, map, shared_ptr>&) override; - bool sameType(shared_ptr, set, shared_ptr>>&) override; + shared_ptr struct_replace( + shared_ptr, + map, shared_ptr>&) override; + shared_ptr function_replace( + const map, shared_ptr>&, + map, shared_ptr>&) override; + bool sameType(shared_ptr, + set, shared_ptr>>&) override; vector> c1; vector> c2; shared_ptr c3; }; shared_ptr struct_replace(shared_ptr, shared_ptr); -shared_ptr function_replace(shared_ptr, const map, shared_ptr>&); +shared_ptr function_replace(shared_ptr, + const map, shared_ptr>&); bool sameType(shared_ptr, shared_ptr); #endif \ No newline at end of file diff --git a/scripts/check.py b/scripts/check.py index 1e7f2fb..0087d68 100644 --- a/scripts/check.py +++ b/scripts/check.py @@ -23,7 +23,7 @@ def test_compiler(test_dir, should_fail): result = subprocess.run(['./acpa', file_path], capture_output=True, text=True) elapsed_time = time.time() - start_time - if result.returncode != 0: + if 'runtime error' in result.stderr or result.returncode not in [0, 1]: print(f' {Color.RED}测试失败:{Color.RESET} 在编译 {file_path} 时发生运行时错误') has_failed_tests = True continue diff --git a/src/element.cpp b/src/element.cpp index c0a67b1..3ed14c9 100644 --- a/src/element.cpp +++ b/src/element.cpp @@ -15,7 +15,9 @@ ValType::Type FunctionType::type() const { return ValType::FUNCTION; } -shared_ptr TemplateType::struct_replace(shared_ptr ut, map, shared_ptr> &eq) { +shared_ptr TemplateType::struct_replace( + shared_ptr ut, + map, shared_ptr>& eq) { auto vt = shared_from_this(); auto it1 = ut->mp.find(vt); auto it2 = eq.find(vt); @@ -29,15 +31,16 @@ shared_ptr TemplateType::struct_replace(shared_ptr ut, map< return static_pointer_cast(vt); } -shared_ptr StructType::struct_replace(shared_ptr ut, map, shared_ptr> &eq) { +shared_ptr StructType::struct_replace( + shared_ptr ut, + map, shared_ptr>& eq) { auto tt = make_shared(); (*tt) = (*ut); set> vis; for (auto u = str; u.get() != nullptr; u = u->fa.lock()) { vis.insert(u); } - for (auto u = ut->str; u.get() != nullptr && vis.find(u) == vis.end(); - u = u->fa.lock()) { + for (auto u = ut->str; u.get() != nullptr && vis.find(u) == vis.end(); u = u->fa.lock()) { for (auto tem : u->c1) { tt->mp.erase(tem); } @@ -48,7 +51,9 @@ shared_ptr StructType::struct_replace(shared_ptr ut, map(tt); } -shared_ptr FunctionType::struct_replace(shared_ptr ut, map, shared_ptr> &eq) { +shared_ptr FunctionType::struct_replace( + shared_ptr ut, + map, shared_ptr>& eq) { auto tt = make_shared(); for (size_t i = 0; i < c1.size(); i++) { tt->c1.push_back(eq[c1[i]] = make_shared()); @@ -65,10 +70,12 @@ shared_ptr FunctionType::struct_replace(shared_ptr ut, map< shared_ptr struct_replace(shared_ptr vt, shared_ptr ut) { static map, shared_ptr> eq; - return vt->struct_replace(ut,eq); + return vt->struct_replace(ut, eq); } -shared_ptr TemplateType::function_replace(const map, shared_ptr> &mp, map, shared_ptr> &eq) { +shared_ptr TemplateType::function_replace( + const map, shared_ptr>& mp, + map, shared_ptr>& eq) { auto tt = shared_from_this(); auto it1 = mp.find(tt); auto it2 = eq.find(tt); @@ -82,7 +89,9 @@ shared_ptr TemplateType::function_replace(const map(tt); } -shared_ptr StructType::function_replace(const map, shared_ptr> &mp, map, shared_ptr> &eq) { +shared_ptr StructType::function_replace( + const map, shared_ptr>& mp, + map, shared_ptr>& eq) { auto tt = make_shared(); (*tt) = (*this); for (auto& pr : tt->mp) { @@ -91,7 +100,9 @@ shared_ptr StructType::function_replace(const map FunctionType::function_replace(const map, shared_ptr> &mp, map, shared_ptr> &eq) { +shared_ptr FunctionType::function_replace( + const map, shared_ptr>& mp, + map, shared_ptr>& eq) { auto tt = make_shared(); for (size_t i = 0; i < c1.size(); i++) { tt->c1.push_back(eq[c1[i]] = make_shared()); @@ -106,17 +117,21 @@ shared_ptr FunctionType::function_replace(const map(tt); } -shared_ptr function_replace(shared_ptr t, const map, shared_ptr>& mp) { +shared_ptr function_replace( + shared_ptr t, + const map, shared_ptr>& mp) { static map, shared_ptr> eq; return t->function_replace(mp, eq); } -bool TemplateType::sameType(shared_ptr b, set, shared_ptr>> &eq) { +bool TemplateType::sameType(shared_ptr b, + set, shared_ptr>>& eq) { auto aa = shared_from_this(), bb = static_pointer_cast(b); return aa == bb || eq.find({aa, bb}) != eq.end(); } -bool StructType::sameType(shared_ptr b, set, shared_ptr>> &eq) { +bool StructType::sameType(shared_ptr b, + set, shared_ptr>>& eq) { auto bb = static_pointer_cast(b); if (str != bb->str) { return false; @@ -131,7 +146,8 @@ bool StructType::sameType(shared_ptr b, set b, set, shared_ptr>> &eq) { +bool FunctionType::sameType(shared_ptr b, + set, shared_ptr>>& eq) { auto bb = static_pointer_cast(b); if (c1.size() != bb->c1.size() || c2.size() != bb->c2.size()) { return false; diff --git a/src/main.cpp b/src/main.cpp index 89eaf39..e8c961d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4,10 +4,23 @@ #include "token.h" #include "work.h" #include +#include using namespace std; +void signal_handler(int signal) { + std::cerr << "runtime error, signal: " << signal << std::endl; + std::exit(signal); +} + int main(int argc, char* argv[]) { + std::signal(SIGSEGV, signal_handler); // 捕获段错误,如空指针异常 + std::signal(SIGABRT, signal_handler); // 捕获异常终止,如释放后使用 + std::signal(SIGFPE, signal_handler); // 捕获浮点异常 + std::signal(SIGILL, signal_handler); // 捕获非法指令 + std::signal(SIGINT, signal_handler); // 捕获中断信号 + std::signal(SIGTERM, signal_handler); // 捕获终止信号 + argparse::ArgumentParser program("acpa", "0.1a0", argparse::default_arguments::help,