diff options
author | Bad Diode <bd@badd10de.dev> | 2021-10-29 15:37:28 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2021-10-29 15:37:28 +0200 |
commit | e73a4c16a2269cdb2f5e7d66fb9839e4c44e14de (patch) | |
tree | c44721b005b7a0623e7acc7103ca8e21a25ff422 /src/errors.c | |
parent | fcc131afdd029c606ea39f3557bc3d33a075b1de (diff) | |
download | bdl-e73a4c16a2269cdb2f5e7d66fb9839e4c44e14de.tar.gz bdl-e73a4c16a2269cdb2f5e7d66fb9839e4c44e14de.zip |
Prepare third compiler implementation
Diffstat (limited to 'src/errors.c')
-rwxr-xr-x | src/errors.c | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/src/errors.c b/src/errors.c new file mode 100755 index 0000000..11348fd --- /dev/null +++ b/src/errors.c | |||
@@ -0,0 +1,46 @@ | |||
1 | #include "errors.h" | ||
2 | |||
3 | static const char* error_msgs[] = { | ||
4 | [ERR_UNKNOWN] = "error: something unexpected happened", | ||
5 | [ERR_UNMATCHED_STRING] = "error: unmatched string delimiter", | ||
6 | [ERR_UNBALANCED_PAREN] = "error: unbalanced parentheses", | ||
7 | [ERR_NOT_IMPLEMENTED] = "error: not implemented", | ||
8 | [ERR_EOF_REACHED] = "error: EOF reached", | ||
9 | [ERR_UNKNOWN_TOKEN] = "error: unknown token", | ||
10 | [ERR_UNKNOWN_OBJ_TYPE] = "error: can't eval unknown object type", | ||
11 | [ERR_NOT_A_SYMBOL] = "error: object is not a symbol", | ||
12 | [ERR_SYMBOL_NOT_FOUND] = "error: symbol not found", | ||
13 | [ERR_NOT_CALLABLE] = "error: not callable", | ||
14 | [ERR_NOT_ENOUGH_ARGS] = "error: not enough arguments", | ||
15 | [ERR_TOO_MANY_ARGS] = "error: too many arguments", | ||
16 | [ERR_WRONG_ARG_TYPE] = "error: wrong argument type", | ||
17 | [ERR_DIVISION_BY_ZERO] = "error: division by zero", | ||
18 | [ERR_AMBIGUOUS_PARAMS] = "error: ambiguous parameter names", | ||
19 | }; | ||
20 | |||
21 | void | ||
22 | error_push(Errors *errors, Error error) { | ||
23 | if (errors->n < ERR_MAX_NUMBER) { | ||
24 | errors->errors[errors->n++] = error; | ||
25 | } | ||
26 | } | ||
27 | |||
28 | void | ||
29 | report_errors(Errors *errors, const char *file_name) { | ||
30 | for (size_t i = 0; i < errors->n; i++) { | ||
31 | Error err = errors->errors[i]; | ||
32 | fprintf(stderr, "%s", file_name); | ||
33 | if (err.line != 0) { | ||
34 | fprintf(stderr, ":%ld:%ld", err.line, err.col); | ||
35 | } | ||
36 | switch (err.type) { | ||
37 | case ERR_TYPE_LEXER: { fprintf(stderr, ": [lexer]"); } break; | ||
38 | case ERR_TYPE_COMPILER: { fprintf(stderr, ": [compiler]"); } break; | ||
39 | case ERR_TYPE_RUNTIME: { fprintf(stderr, ": [runtime]"); } break; | ||
40 | case ERR_TYPE_PARSER: { fprintf(stderr, ": [parser]"); } break; | ||
41 | default: break; | ||
42 | } | ||
43 | fprintf(stderr, " %s\n", error_msgs[err.value]); | ||
44 | } | ||
45 | errors->n = 0; | ||
46 | } | ||