reader: implement read_vec and setup errors for random closed brackets

This commit is contained in:
2026-02-11 10:26:55 +00:00
committed by oreodave
parent 5f05a6a108
commit a4fb48a863
2 changed files with 47 additions and 3 deletions

View File

@@ -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;

View File

@@ -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;
}