From 717b00c1a05930778aa98b504a38adfa967cc4ac Mon Sep 17 00:00:00 2001 From: Ivar Fatland Date: Thu, 1 Oct 2026 21:12:32 +0200 Subject: [PATCH] some progress. test printing of errors later --- cig.h | 3 ++- scanner.c | 37 +++++++++++++++++++++---------------- test_scanner.c | 28 +++++++++++++++++++++++++++- 3 files changed, 50 insertions(+), 18 deletions(-) diff --git a/cig.h b/cig.h index 073e45c..635b36e 100644 --- a/cig.h +++ b/cig.h @@ -337,7 +337,8 @@ scan_result_t scan_f32(scanner_t *s); // valid characters after the identifier is scanned. scan_result_t scan_identifier(scanner_t *s); scan_result_t scan_string_literal(scanner_t *s); -void scanner_print_errors(scan_error_t error, FILE *fp); +bool scanner_print_errors_func(FILE *fp, scan_result_t const *results, int results_len); +#define scanner_print_errors(FP, ...) scanner_print_errors_func(FP, &(scan_result_t[]){__VA_ARGS__}, sizeof((scan_result_t[]){__VA_ARGS__})) bool looks_like_float(scanner_t *s); bool looks_like_int(scanner_t *s); diff --git a/scanner.c b/scanner.c index ea4fb92..0148760 100644 --- a/scanner.c +++ b/scanner.c @@ -251,9 +251,9 @@ scan_result_t scan_f32(scanner_t *s) { return scan_value(.f32=val); } -bool scan_identifier(scanner_t *s) { +scan_result_t scan_identifier(scanner_t *s) { if (!isalpha((unsigned char)*s->cur) && *s->cur != '_') { - return false; + return scan_error(s, "not an identifier"); } char const *start = s->cur++; while (isalnum((unsigned char)*s->cur) || *s->cur == '_') { @@ -263,21 +263,21 @@ bool scan_identifier(scanner_t *s) { char *buf = allocator_alloc(s->allocator, len + 1); memcpy(buf, start, len); buf[len] = '\0'; - s->value.identifier = buf; - return true; + return scan_value(.identifier=buf); } -bool scan_string_literal(scanner_t *s) { +scan_result_t scan_string_literal(scanner_t *s) { char const *save = s->cur; if (*s->cur != '"') - return false; + return scan_error(s, "not a string"); s->cur++; // skip opening quote char *buf = allocator_alloc(s->allocator, 256); size_t cap = 256; size_t len = 0; while (*s->cur && *s->cur != '"') { char c = *s->cur++; + scan_result_t ret; if (c == '\\') { char esc = *s->cur++; switch (esc) { @@ -288,9 +288,9 @@ bool scan_string_literal(scanner_t *s) { case '"': c = '"'; break; case '0': c = '\0'; break; default: - scanner_error(s, "invalid escape sequence"); + ret = scan_error(s, "invalid escape sequence"); s->cur = save; - return false; + return ret; } } if (len + 2 >= cap) { @@ -300,21 +300,26 @@ bool scan_string_literal(scanner_t *s) { buf[len++] = c; } if (*s->cur != '"') { - scanner_error(s, "unterminated string literal"); + scan_result_t ret = scan_error(s, "unterminated string literal"); s->cur = save; - return false; + return ret; } s->cur++; // skip closing quote buf[len] = '\0'; - s->value.string_literal = buf; - return true; + return scan_value(.string_literal=buf); } -bool scanner_print_errors(scanner_t *s, FILE *fp) { - for (error_node_t *node = s->errors; node != NULL; node = node->next) { - fprintf(fp, "%s\n", node->msg); +bool scanner_print_errors_func(FILE *fp, scan_result_t const *results, int results_len) { + bool did_print_errors = false; + for (int i = 0; i < results_len; i++) { + scan_result_t res = results[i]; + if (!res.ok) { + scan_error_t err = res.error; + fprintf(fp, "%s:%d:%d: %s", err.buffer_name, err.line, err.column, err.message); + did_print_errors = true; + } } - return s->errors != NULL; + return did_print_errors; } bool looks_like_float(scanner_t *s) { diff --git a/test_scanner.c b/test_scanner.c index 7bc7d50..b507d9c 100644 --- a/test_scanner.c +++ b/test_scanner.c @@ -22,7 +22,7 @@ Test(scanner, looks_like_float) { scanner_t scanner = make_scanner("test", buffer, allocator); while (!scan_eof(&scanner)) { bool does_look_like_float = looks_like_float(&scanner); - bool does_look_like_int = looks_like_float(&scanner); + bool does_look_like_int = looks_like_int(&scanner); while (*scanner.cur++ != ' '); bool expect; if (scan_literal(&scanner, "true")) { @@ -41,3 +41,29 @@ Test(scanner, looks_like_float) { } } + +Test(scanner, print_errors) { + char const *buffer = + "1.0 true\n" + "12.34 true\n" + "0.5 true\n" + "9.99 true\n" + "+1.2 true\n" + "-3.14 true\n" + "1 false\n" + "42 false\n" + "+7 false\n" + "1. false\n" + ".5 false\n" + "+. false\n" + "abc false\n" + "+x false\n"; + with_borrow(allocator) { + scanner_t scanner = make_scanner("test", buffer, allocator); + while (!scan_eof(&scanner)) { + // TODO + cr_assert(false); + } + } + +}