Skip to content

Commit b0f9bfe

Browse files
committed
handle compiler errors using an exception
1 parent 0022804 commit b0f9bfe

3 files changed

Lines changed: 49 additions & 22 deletions

File tree

main.cpp

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -38,20 +38,30 @@ int main(int argc, char *argv[])
3838
std::stringstream buf;
3939
buf << inf.rdbuf();
4040

41-
auto tokens = tokenize(buf.str());
42-
if (dump_tokens) {
43-
dump(tokens);
44-
}
41+
try {
42+
auto tokens = tokenize(buf.str());
43+
if (dump_tokens) {
44+
dump(tokens);
45+
}
4546

46-
auto ast = parse(tokens);
47-
if (dump_ast) {
48-
dump(ast);
49-
}
47+
auto ast = parse(tokens);
48+
if (dump_ast) {
49+
dump(ast);
50+
}
5051

51-
auto bytecode = compile(ast);
52-
if (dump_bytecode) {
53-
disassemble(bytecode, std::cerr);
54-
}
52+
auto bytecode = compile(ast);
53+
if (dump_bytecode) {
54+
disassemble(bytecode, std::cerr);
55+
}
5556

56-
exec(bytecode);
57+
exec(bytecode);
58+
59+
} catch (SourceError &error) {
60+
fprintf(stderr, "%s\n", error.token.source.c_str());
61+
fprintf(stderr, "%*s\n", error.token.column, "^");
62+
fprintf(stderr, "Error S%d: %d:%d %s %s (%s:%d)\n", error.number, error.token.line, error.token.column, error.token.tostring().c_str(), error.message.c_str(), error.file.c_str(), error.line);
63+
exit(1);
64+
} catch (InternalError &error) {
65+
fprintf(stderr, "Compiler Internal Error: %s (%s:%d)\n", error.message.c_str(), error.file.c_str(), error.line);
66+
}
5767
}

util.cpp

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,12 @@
22

33
#include <stdlib.h>
44

5-
#include "lexer.h"
6-
75
void abort_error(const char *file, int line, int number, const Token &token, const std::string &message)
86
{
9-
fprintf(stderr, "%s\n", token.source.c_str());
10-
fprintf(stderr, "%*s\n", token.column, "^");
11-
fprintf(stderr, "Error S%d: %d:%d %s %s (%s:%d)\n", number, token.line, token.column, token.tostring().c_str(), message.c_str(), file, line);
12-
exit(1);
7+
throw SourceError(file, line, number, token, message);
138
}
149

1510
void abort_internal_error(const char *file, int line, const std::string &message)
1611
{
17-
fprintf(stderr, "Compiler Internal Error: %s (%s:%d)\n", message.c_str(), file, line);
18-
exit(1);
12+
throw InternalError(file, line, message);
1913
}

util.h

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,30 @@
33

44
#include <string>
55

6-
class Token;
6+
#include "lexer.h"
7+
8+
class CompilerError {
9+
public:
10+
CompilerError(const std::string &file, int line, const std::string &message): file(file), line(line), message(message) {}
11+
virtual ~CompilerError() {}
12+
const std::string file;
13+
const int line;
14+
const std::string message;
15+
private:
16+
CompilerError &operator=(const CompilerError &);
17+
};
18+
19+
class InternalError: public CompilerError {
20+
public:
21+
InternalError(const std::string &file, int line, const std::string &message): CompilerError(file, line, message) {}
22+
};
23+
24+
class SourceError: public CompilerError {
25+
public:
26+
SourceError(const std::string &file, int line, int number, const Token &token, const std::string &message): CompilerError(file, line, message), number(number), token(token) {}
27+
const int number;
28+
const Token token;
29+
};
730

831
#define error(number, token, message) abort_error(__FILE__, __LINE__, number, token, message)
932
#define internal_error(message) abort_internal_error(__FILE__, __LINE__, message)

0 commit comments

Comments
 (0)