some progress. test printing of errors later

This commit is contained in:
2026-10-01 21:12:32 +02:00
parent 105295157c
commit 717b00c1a0
3 changed files with 50 additions and 18 deletions
+2 -1
View File
@@ -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);
+21 -16
View File
@@ -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) {
+27 -1
View File
@@ -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);
}
}
}