From ee1a5de91c875fb66724dc21c02333bfebe2a812 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Tue, 1 Feb 2022 18:36:52 +0100 Subject: Add new syntax to lexer and prepare refactor --- src/errors.c | 62 +++++++++++++++++++++++++++++------------------------------- 1 file changed, 30 insertions(+), 32 deletions(-) (limited to 'src/errors.c') 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 @@ static const char* error_msgs[] = { [ERR_UNKNOWN] = "error: something unexpected happened", [ERR_UNMATCHED_STRING] = "error: unmatched string delimiter", - [ERR_UNBALANCED_PAREN] = "error: unbalanced parentheses", - [ERR_NOT_IMPLEMENTED] = "error: not implemented", - [ERR_EOF_REACHED] = "error: EOF reached", - [ERR_UNKNOWN_TOKEN] = "error: unknown token", - [ERR_UNKNOWN_OBJ_TYPE] = "error: can't eval unknown object type", - [ERR_NOT_A_SYMBOL] = "error: object is not a symbol", - [ERR_SYMBOL_NOT_FOUND] = "error: symbol not found", - [ERR_NOT_CALLABLE] = "error: not callable", - [ERR_NOT_ENOUGH_ARGS] = "error: not enough arguments", - [ERR_TOO_MANY_ARGS] = "error: too many arguments", - [ERR_WRONG_ARG_TYPE] = "error: wrong argument type", - [ERR_DIVISION_BY_ZERO] = "error: division by zero", - [ERR_AMBIGUOUS_PARAMS] = "error: ambiguous parameter names", + [ERR_UNKNOWN_TOK_TYPE] = "error: unknown token type", + [ERR_MALFORMED_NUMBER] = "error: malformed number token", }; +static Error current_error = {.value = ERR_OK}; + void -error_push(Errors *errors, Error error) { - if (errors->n < ERR_MAX_NUMBER) { - errors->errors[errors->n++] = error; +push_error(ErrorType type, ErrorValue value, size_t line, size_t col) { + if (has_errors()) { + return; } + current_error.type = type; + current_error.value = value; + current_error.line = line; + current_error.col = col; +} + +bool +has_errors(void) { + return current_error.value != ERR_OK; } void -report_errors(Errors *errors, const char *file_name) { - for (size_t i = 0; i < errors->n; i++) { - Error err = errors->errors[i]; - fprintf(stderr, "%s", file_name); - if (err.line != 0) { - fprintf(stderr, ":%ld:%ld", err.line, err.col); - } - switch (err.type) { - case ERR_TYPE_LEXER: { fprintf(stderr, ": [lexer]"); } break; - case ERR_TYPE_COMPILER: { fprintf(stderr, ": [compiler]"); } break; - case ERR_TYPE_RUNTIME: { fprintf(stderr, ": [runtime]"); } break; - case ERR_TYPE_PARSER: { fprintf(stderr, ": [parser]"); } break; - default: break; - } - fprintf(stderr, " %s\n", error_msgs[err.value]); +check_errors(const char *file_name) { + if (!has_errors()) { + return; + } + fprintf(stderr, "%s", file_name); + if (current_error.line != 0) { + fprintf(stderr, ":%ld:%ld", current_error.line, current_error.col); + } + switch (current_error.type) { + case ERR_TYPE_LEXER: { fprintf(stderr, ": [lexer] "); } break; + case ERR_TYPE_PARSER: { fprintf(stderr, ": [parser] "); } break; + default: break; } - errors->n = 0; + fprintf(stderr, "%s\n", error_msgs[current_error.value]); + exit(EXIT_FAILURE); } -- cgit v1.2.1