aboutsummaryrefslogtreecommitdiffstats
path: root/src/errors.c
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2022-02-01 18:36:52 +0100
committerBad Diode <bd@badd10de.dev>2022-02-01 18:36:52 +0100
commitee1a5de91c875fb66724dc21c02333bfebe2a812 (patch)
treed3eaa226816d295bb9dc48a2aed27044832ec413 /src/errors.c
parent3156265c7b2da8cc43fee996c0518ea274d39c8a (diff)
downloadbdl-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.c62
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 @@
3static const char* error_msgs[] = { 3static 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
10static Error current_error = {.value = ERR_OK};
11
21void 12void
22error_push(Errors *errors, Error error) { 13push_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
23bool
24has_errors(void) {
25 return current_error.value != ERR_OK;
26} 26}
27 27
28void 28void
29report_errors(Errors *errors, const char *file_name) { 29check_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}