From 1c0bd20cbad1c4089a4f5d19d2154d710fee2481 Mon Sep 17 00:00:00 2001 From: Aryadev Chavali Date: Sat, 28 Oct 2023 18:21:56 +0100 Subject: Introduce error reporting in asm/main Pretty simple implementation, I've stopped printing the tokens cos I think the lexer is done. --- asm/main.c | 43 +++++++++++++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 14 deletions(-) (limited to 'asm/main.c') diff --git a/asm/main.c b/asm/main.c index bb1a2b6..aa6dcec 100644 --- a/asm/main.c +++ b/asm/main.c @@ -17,33 +17,48 @@ int main(void) { - FILE *fp = fopen("main.asm", "rb"); - darr_t buffer = darr_read_file(fp); + int ret = 0; + const char *filename = "main.asm"; + FILE *fp = fopen(filename, "rb"); + darr_t buffer = darr_read_file(fp); fclose(fp); token_stream_t tokens = tokenise_buffer(&buffer); printf("%lu bytes -> %lu tokens\n", buffer.used, tokens.available); free(buffer.data); - for (size_t i = 0; i < tokens.available; ++i) - printf("%s(%.*s)\n", - token_type_as_cstr((TOKEN_STREAM_AT(tokens.data, i)).type), - (int)(TOKEN_STREAM_AT(tokens.data, i).str_size), - (TOKEN_STREAM_AT(tokens.data, i).str)); - puts(""); - size_t number = 0; - inst_t *instructions = parse_stream(&tokens, &number); + inst_t *instructions = NULL; + perr_t parse_error = parse_stream(&tokens, &instructions, &number); + if (parse_error) + { + size_t column = 0; + size_t line = 0; + if (tokens.used < tokens.available) + { + token_t t = TOKEN_STREAM_AT(tokens.data, tokens.used); + column = t.column; + line = t.line; + } + fprintf(stderr, "%s:%lu:%lu: %s\n", filename, line, column, + perr_as_cstr(parse_error)); + ret = 255 - parse_error; + goto end; + } for (size_t i = 0; i < number; ++i) { inst_print(instructions[i], stdout); puts(""); } // Free the tokens - for (size_t i = 0; i < tokens.available; ++i) - free(TOKEN_STREAM_AT(tokens.data, i).str); - free(tokens.data); +end: + if (tokens.data) + { + for (size_t i = 0; i < tokens.available; ++i) + free(TOKEN_STREAM_AT(tokens.data, i).str); + free(tokens.data); + } if (instructions) free(instructions); - return 0; + return ret; } -- cgit v1.2.3-13-gbd6f