diff --git a/scripts/check.py b/scripts/check.py index 0087d68..7dfcf1d 100644 --- a/scripts/check.py +++ b/scripts/check.py @@ -23,20 +23,20 @@ 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 'runtime error' in result.stderr or result.returncode not in [0, 1]: + if 'runtime error' in result.stderr or result.returncode != 0: print(f' {Color.RED}测试失败:{Color.RESET} 在编译 {file_path} 时发生运行时错误') has_failed_tests = True continue if should_fail: - if 'error' not in result.stdout: + if 'error' not in result.stderr: print(f' {Color.RED}测试失败:{Color.RESET} {file_path} 应该编译失败,但是没有发现错误') has_failed_tests = True else: print(f' {Color.GREEN}测试通过:{Color.RESET} {file_path}') passed_files += 1 else: - if 'error' in result.stdout: + if 'error' in result.stderr: print(f' {Color.RED}测试失败:{Color.RESET} {file_path} 应该编译通过,但是发现错误。') has_failed_tests = True else: diff --git a/src/scan.cpp b/src/scan.cpp index 81c0561..a667e47 100644 --- a/src/scan.cpp +++ b/src/scan.cpp @@ -50,14 +50,14 @@ vector scan(string s) { if (pt + 1 < s.size() && s[pt + 1] == '>') { type = TokenType::IMPLY, pt += 2; } else { - printf("error on line %d", line), exit(1); + fprintf(stderr, "error on line %d", line), exit(0); } } else if (s[pt] == '/') { if (pt + 1 < s.size() && s[pt + 1] == '/') { for (pt += 2; pt < s.size() && s[pt] != '\n'; pt++) {} continue; } else { - printf("error on line %d", line), exit(1); + fprintf(stderr, "error on line %d", line), exit(0); } } else if (isalpha(s[pt]) || s[pt] == '_') { size_t r = pt + 1; @@ -89,7 +89,7 @@ vector scan(string s) { } pt = r; } else { - printf("error on line %d", line), exit(1); + fprintf(stderr, "error on line %d", line), exit(0); } tokens.push_back({line, type, id}); } diff --git a/src/work.cpp b/src/work.cpp index aa4e675..cbb6da4 100644 --- a/src/work.cpp +++ b/src/work.cpp @@ -68,11 +68,11 @@ int jump(TokenType t) { return tokens[pt++].s; } if (pt < tokens.size()) { - printf("error on line %d", tokens[pt].line); + fprintf(stderr, "error on line %d", tokens[pt].line); } else { - puts("error on end"); + fprintf(stderr, "error on end"); } - exit(1); + exit(0); } shared_ptr _createVal(shared_ptr t); @@ -90,7 +90,7 @@ shared_ptr _createVal(shared_ptr ft) { auto str = ft->str; auto s = jump(TokenType::ID); if (str->vars.find(s) == str->vars.end()) { - printf("error on line %d", tokens[pt - 1].line), exit(0); + fprintf(stderr, "error on line %d", tokens[pt - 1].line), exit(0); } auto t = struct_replace(str->vars[s], ft); while (t->type() == ValType::FUNCTION @@ -101,7 +101,7 @@ shared_ptr _createVal(shared_ptr ft) { types = createTypes(); } if (tt->c1.size() != types.size()) { - printf("error on line %d", tokens[pt - 1].line), exit(0); + fprintf(stderr, "error on line %d", tokens[pt - 1].line), exit(0); } map, shared_ptr> mp; for (size_t i = 0; i < types.size(); i++) { @@ -118,7 +118,7 @@ shared_ptr _createVal(shared_ptr ft) { } } if (!legal) { - printf("error on line %d", tokens[pt - 1].line), exit(0); + fprintf(stderr, "error on line %d", tokens[pt - 1].line), exit(0); } t = function_replace(tt->c3, mp); } @@ -126,7 +126,7 @@ shared_ptr _createVal(shared_ptr ft) { return t; } if (t->type() != ValType::STRUCT) { - printf("error on line %d", tokens[pt].line), exit(0); + fprintf(stderr, "error on line %d", tokens[pt].line), exit(0); } pt++; return _createVal(static_pointer_cast(t)); @@ -165,7 +165,7 @@ shared_ptr createVal() { auto ret = createVal(); jump(TokenType::SEMI); if (!sameType(tt->c3, ret)) { - printf("error on line %d", tokens[pt - 1].line), exit(0); + fprintf(stderr, "error on line %d", tokens[pt - 1].line), exit(0); } for (const auto& pr : tems) { ndefs.erase(pr.first); @@ -200,7 +200,7 @@ shared_ptr createVal() { if (flag) { t = createType(); if (t->type() != ValType::STRUCT) { - printf("error on line %d", tokens[pt - 1].line), exit(0); + fprintf(stderr, "error on line %d", tokens[pt - 1].line), exit(0); } auto tt = static_pointer_cast(t); auto vals = createVals(); @@ -215,12 +215,12 @@ shared_ptr createVal() { } } if (!legal) { - printf("error on line %d", tokens[pt - 1].line), exit(0); + fprintf(stderr, "error on line %d", tokens[pt - 1].line), exit(0); } } else { auto s = jump(TokenType::ID); if (ndefs.find(s) == ndefs.end() || ndefs[s]->type() != Def::VAR) { - printf("error on line %d", tokens[pt - 1].line), exit(0); + fprintf(stderr, "error on line %d", tokens[pt - 1].line), exit(0); } t = static_pointer_cast(ndefs[s])->def_var; } @@ -233,7 +233,7 @@ shared_ptr createVal() { types = createTypes(); } if (tt->c1.size() != types.size()) { - printf("error on line %d", tokens[pt - 1].line), exit(0); + fprintf(stderr, "error on line %d", tokens[pt - 1].line), exit(0); } map, shared_ptr> mp; for (size_t i = 0; i < types.size(); i++) { @@ -250,7 +250,7 @@ shared_ptr createVal() { } } if (!legal) { - printf("error on line %d", tokens[pt - 1].line), exit(0); + fprintf(stderr, "error on line %d", tokens[pt - 1].line), exit(0); } t = function_replace(tt->c3, mp); } @@ -258,7 +258,7 @@ shared_ptr createVal() { return t; } if (t->type() != ValType::STRUCT) { - printf("error on line %d", tokens[pt].line), exit(0); + fprintf(stderr, "error on line %d", tokens[pt].line), exit(0); } pt++; return _createVal(static_pointer_cast(t)); @@ -279,7 +279,7 @@ shared_ptr _createType(shared_ptr t) { auto str = t->str; auto s = jump(TokenType::ID); if (str->structs.find(s) == str->structs.end()) { - printf("error on line %d", tokens[pt - 1].line), exit(0); + fprintf(stderr, "error on line %d", tokens[pt - 1].line), exit(0); } auto tt = make_shared(); tt->str = str->structs[s], tt->mp = t->mp; @@ -288,7 +288,7 @@ shared_ptr _createType(shared_ptr t) { types = createTypes(); } if (tt->str->c1.size() != types.size()) { - printf("error on line %d", tokens[pt - 1].line), exit(0); + fprintf(stderr, "error on line %d", tokens[pt - 1].line), exit(0); } for (size_t i = 0; i < types.size(); i++) { tt->mp[tt->str->c1[i]] = types[i]; @@ -328,7 +328,7 @@ shared_ptr createType() { } else { auto s = jump(TokenType::ID); if (ndefs.find(s) == ndefs.end() || ndefs[s]->type() == Def::VAR) { - printf("error on line %d", tokens[pt - 1].line), exit(0); + fprintf(stderr, "error on line %d", tokens[pt - 1].line), exit(0); } if (ndefs[s]->type() == Def::STRUCT) { auto tt = make_shared(); @@ -338,7 +338,7 @@ shared_ptr createType() { types = createTypes(); } if (tt->str->c1.size() != types.size()) { - printf("error on line %d", tokens[pt - 1].line), exit(0); + fprintf(stderr, "error on line %d", tokens[pt - 1].line), exit(0); } for (size_t i = 0; i < types.size(); i++) { tt->mp[tt->str->c1[i]] = types[i]; @@ -353,7 +353,7 @@ shared_ptr createType() { return t; } if (t->type() != ValType::STRUCT) { - printf("error on line %d", tokens[pt].line), exit(0); + fprintf(stderr, "error on line %d", tokens[pt].line), exit(0); } pt++; return _createType(static_pointer_cast(t)); @@ -377,7 +377,7 @@ vector>> createTems() { auto single = [&]() { auto s = jump(TokenType::ID); if (ndefs.find(s) != ndefs.end()) { - printf("error on line %d", tokens[pt - 1].line), exit(0); + fprintf(stderr, "error on line %d", tokens[pt - 1].line), exit(0); } auto x = make_shared(); auto d = make_shared(); @@ -402,7 +402,7 @@ vector>> createPars(map>* } auto s = jump(TokenType::ID); if (ndefs.find(s) != ndefs.end()) { - printf("error on line %d", tokens[pt - 1].line), exit(0); + fprintf(stderr, "error on line %d", tokens[pt - 1].line), exit(0); } jump(TokenType::COLON); auto t = createType(); @@ -514,7 +514,7 @@ pair> createVar() { jump(TokenType::SEMI); } if (ndefs.find(s) != ndefs.end()) { - printf("error on line %d", tokens[pt - 1].line), exit(0); + fprintf(stderr, "error on line %d", tokens[pt - 1].line), exit(0); } auto d = make_shared(); d->def_var = t;