From a4fb48a863f0854d2710d25f3d982391136e4306 Mon Sep 17 00:00:00 2001 From: Aryadev Chavali Date: Wed, 11 Feb 2026 10:26:55 +0000 Subject: [PATCH] reader: implement read_vec and setup errors for random closed brackets --- include/alisp/reader.h | 3 +++ src/reader.c | 47 +++++++++++++++++++++++++++++++++++++++--- 2 files changed, 47 insertions(+), 3 deletions(-) diff --git a/include/alisp/reader.h b/include/alisp/reader.h index 9bd7dfb..30bc3c9 100644 --- a/include/alisp/reader.h +++ b/include/alisp/reader.h @@ -16,6 +16,9 @@ typedef enum READ_ERR_OK = 0, READ_ERR_EOF, READ_ERR_EXPECTED_CLOSED_BRACE, + READ_ERR_EXPECTED_CLOSED_SQUARE_BRACKET, + READ_ERR_UNEXPECTED_CLOSED_BRACE, + READ_ERR_UNEXPECTED_CLOSED_SQUARE_BRACKET, READ_ERR_UNKNOWN_CHAR, } read_err_t; diff --git a/src/reader.c b/src/reader.c index 856581b..a6efd2c 100644 --- a/src/reader.c +++ b/src/reader.c @@ -21,6 +21,15 @@ const char *read_err_to_cstr(read_err_t err) return "EOF"; case READ_ERR_UNKNOWN_CHAR: return "UNKNOWN_CHAR"; + break; + case READ_ERR_EXPECTED_CLOSED_BRACE: + return "EXPECTED_CLOSED_BRACE"; + case READ_ERR_EXPECTED_CLOSED_SQUARE_BRACKET: + return "EXPECTED_CLOSED_SQUARE_BRACKET"; + case READ_ERR_UNEXPECTED_CLOSED_BRACE: + return "UNEXPECTED_CLOSED_BRACE"; + case READ_ERR_UNEXPECTED_CLOSED_SQUARE_BRACKET: + return "UNEXPECTED_CLOSED_SQUARE_BRACKET"; default: FAIL("Unreachable"); } @@ -128,7 +137,11 @@ read_err_t read_list(sys_t *sys, stream_t *stream, lisp_t **ret) { lisp_t *item = NIL; read_err_t err = read(sys, stream, &item); - if (err) + if (err == READ_ERR_EOF) + { + return READ_ERR_EXPECTED_CLOSED_BRACE; + } + else if (err) { return err; } @@ -152,9 +165,33 @@ read_err_t read_list(sys_t *sys, stream_t *stream, lisp_t **ret) return READ_ERR_OK; } -read_err_t read_vec(sys_t *, stream_t *, lisp_t **) +read_err_t read_vec(sys_t *sys, stream_t *stream, lisp_t **ret) { - TODO("read_vec: not implemented"); + (void)stream_next(stream); + lisp_t *container = make_vec(sys, 0); + while (!stream_eoc(stream) && stream_peek(stream) != ']') + { + lisp_t *item = NIL; + read_err_t err = read(sys, stream, &item); + if (err == READ_ERR_EOF) + { + return READ_ERR_EXPECTED_CLOSED_BRACE; + } + else if (err) + { + return err; + } + else + { + vec_append(as_vec(container), &item, sizeof(item)); + } + } + + if (stream_peek(stream) != ']') + return READ_ERR_EXPECTED_CLOSED_SQUARE_BRACKET; + stream_next(stream); + *ret = container; + return READ_ERR_OK; } read_err_t read_quote(sys_t *sys, stream_t *stream, lisp_t **ret) @@ -201,8 +238,12 @@ read_err_t read(sys_t *sys, stream_t *stream, lisp_t **ret) return read_quote(sys, stream, ret); else if (c == '(') return read_list(sys, stream, ret); + else if (c == ')') + return READ_ERR_UNEXPECTED_CLOSED_BRACE; else if (c == '[') return read_vec(sys, stream, ret); + else if (c == ']') + return READ_ERR_UNEXPECTED_CLOSED_SQUARE_BRACKET; return READ_ERR_UNKNOWN_CHAR; }