diff options
author | Bad Diode <bd@badd10de.dev> | 2022-02-01 18:36:52 +0100 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2022-02-01 18:36:52 +0100 |
commit | ee1a5de91c875fb66724dc21c02333bfebe2a812 (patch) | |
tree | d3eaa226816d295bb9dc48a2aed27044832ec413 /src/errors.c | |
parent | 3156265c7b2da8cc43fee996c0518ea274d39c8a (diff) | |
download | bdl-ee1a5de91c875fb66724dc21c02333bfebe2a812.tar.gz bdl-ee1a5de91c875fb66724dc21c02333bfebe2a812.zip |
Add new syntax to lexer and prepare refactor
Diffstat (limited to 'src/errors.c')
-rw-r--r-- | src/errors.c | 62 |
1 files changed, 30 insertions, 32 deletions
diff --git a/src/errors.c b/src/errors.c index 11348fd..efc834f 100644 --- a/src/errors.c +++ b/src/errors.c | |||
@@ -3,44 +3,42 @@ | |||
3 | static const char* error_msgs[] = { | 3 | static const char* error_msgs[] = { |
4 | [ERR_UNKNOWN] = "error: something unexpected happened", | 4 | [ERR_UNKNOWN] = "error: something unexpected happened", |
5 | [ERR_UNMATCHED_STRING] = "error: unmatched string delimiter", | 5 | [ERR_UNMATCHED_STRING] = "error: unmatched string delimiter", |
6 | [ERR_UNBALANCED_PAREN] = "error: unbalanced parentheses", | 6 | [ERR_UNKNOWN_TOK_TYPE] = "error: unknown token type", |
7 | [ERR_NOT_IMPLEMENTED] = "error: not implemented", | 7 | [ERR_MALFORMED_NUMBER] = "error: malformed number token", |
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 | }; | 8 | }; |
20 | 9 | ||
10 | static Error current_error = {.value = ERR_OK}; | ||
11 | |||
21 | void | 12 | void |
22 | error_push(Errors *errors, Error error) { | 13 | push_error(ErrorType type, ErrorValue value, size_t line, size_t col) { |
23 | if (errors->n < ERR_MAX_NUMBER) { | 14 | if (has_errors()) { |
24 | errors->errors[errors->n++] = error; | 15 | return; |
25 | } | 16 | } |
17 | current_error.type = type; | ||
18 | current_error.value = value; | ||
19 | current_error.line = line; | ||
20 | current_error.col = col; | ||
21 | } | ||
22 | |||
23 | bool | ||
24 | has_errors(void) { | ||
25 | return current_error.value != ERR_OK; | ||
26 | } | 26 | } |
27 | 27 | ||
28 | void | 28 | void |
29 | report_errors(Errors *errors, const char *file_name) { | 29 | check_errors(const char *file_name) { |
30 | for (size_t i = 0; i < errors->n; i++) { | 30 | if (!has_errors()) { |
31 | Error err = errors->errors[i]; | 31 | return; |
32 | fprintf(stderr, "%s", file_name); | 32 | } |
33 | if (err.line != 0) { | 33 | fprintf(stderr, "%s", file_name); |
34 | fprintf(stderr, ":%ld:%ld", err.line, err.col); | 34 | if (current_error.line != 0) { |
35 | } | 35 | fprintf(stderr, ":%ld:%ld", current_error.line, current_error.col); |
36 | switch (err.type) { | 36 | } |
37 | case ERR_TYPE_LEXER: { fprintf(stderr, ": [lexer]"); } break; | 37 | switch (current_error.type) { |
38 | case ERR_TYPE_COMPILER: { fprintf(stderr, ": [compiler]"); } break; | 38 | case ERR_TYPE_LEXER: { fprintf(stderr, ": [lexer] "); } break; |
39 | case ERR_TYPE_RUNTIME: { fprintf(stderr, ": [runtime]"); } break; | 39 | case ERR_TYPE_PARSER: { fprintf(stderr, ": [parser] "); } break; |
40 | case ERR_TYPE_PARSER: { fprintf(stderr, ": [parser]"); } break; | 40 | default: break; |
41 | default: break; | ||
42 | } | ||
43 | fprintf(stderr, " %s\n", error_msgs[err.value]); | ||
44 | } | 41 | } |
45 | errors->n = 0; | 42 | fprintf(stderr, "%s\n", error_msgs[current_error.value]); |
43 | exit(EXIT_FAILURE); | ||
46 | } | 44 | } |