将错误信息输出到标准异常流 (#4)

This commit is contained in:
lcw 2023-09-01 09:41:43 +08:00
parent 8f01835cab
commit c263344c66
3 changed files with 28 additions and 28 deletions

View File

@ -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:

View File

@ -50,14 +50,14 @@ vector<Token> 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<Token> 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});
}

View File

@ -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<ValType> _createVal(shared_ptr<StructType> t);
@ -90,7 +90,7 @@ shared_ptr<ValType> _createVal(shared_ptr<StructType> 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<ValType> _createVal(shared_ptr<StructType> 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<TemplateType>, shared_ptr<ValType>> mp;
for (size_t i = 0; i < types.size(); i++) {
@ -118,7 +118,7 @@ shared_ptr<ValType> _createVal(shared_ptr<StructType> 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<ValType> _createVal(shared_ptr<StructType> 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<StructType>(t));
@ -165,7 +165,7 @@ shared_ptr<ValType> 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<ValType> 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<StructType>(t);
auto vals = createVals();
@ -215,12 +215,12 @@ shared_ptr<ValType> 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<DefVar>(ndefs[s])->def_var;
}
@ -233,7 +233,7 @@ shared_ptr<ValType> 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<TemplateType>, shared_ptr<ValType>> mp;
for (size_t i = 0; i < types.size(); i++) {
@ -250,7 +250,7 @@ shared_ptr<ValType> 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<ValType> 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<StructType>(t));
@ -279,7 +279,7 @@ shared_ptr<ValType> _createType(shared_ptr<StructType> 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<StructType>();
tt->str = str->structs[s], tt->mp = t->mp;
@ -288,7 +288,7 @@ shared_ptr<ValType> _createType(shared_ptr<StructType> 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<ValType> 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<StructType>();
@ -338,7 +338,7 @@ shared_ptr<ValType> 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<ValType> 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<StructType>(t));
@ -377,7 +377,7 @@ vector<pair<int, shared_ptr<TemplateType>>> 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<TemplateType>();
auto d = make_shared<DefTemplate>();
@ -402,7 +402,7 @@ vector<pair<int, shared_ptr<ValType>>> createPars(map<int, shared_ptr<ValType>>*
}
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<int, shared_ptr<ValType>> 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<DefVar>();
d->def_var = t;