reader: implement read_sym and read_list
To be tested properly.
This commit is contained in:
@@ -15,6 +15,7 @@ typedef enum
|
|||||||
{
|
{
|
||||||
READ_ERR_OK = 0,
|
READ_ERR_OK = 0,
|
||||||
READ_ERR_EOF,
|
READ_ERR_EOF,
|
||||||
|
READ_ERR_EXPECTED_CLOSED_BRACE,
|
||||||
READ_ERR_UNKNOWN_CHAR,
|
READ_ERR_UNKNOWN_CHAR,
|
||||||
} read_err_t;
|
} read_err_t;
|
||||||
|
|
||||||
|
|||||||
40
src/reader.c
40
src/reader.c
@@ -55,14 +55,46 @@ read_err_t read_int(sys_t *, stream_t *, lisp_t **)
|
|||||||
TODO("read_int: not implemented");
|
TODO("read_int: not implemented");
|
||||||
}
|
}
|
||||||
|
|
||||||
read_err_t read_sym(sys_t *, stream_t *, lisp_t **)
|
read_err_t read_sym(sys_t *sys, stream_t *stream, lisp_t **ret)
|
||||||
{
|
{
|
||||||
TODO("read_sym: not implemented");
|
sv_t sym_sv = stream_while(stream, SYMBOL_CHARS);
|
||||||
|
*ret = intern(sys, sym_sv);
|
||||||
|
return READ_ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
read_err_t read_list(sys_t *, stream_t *, lisp_t **)
|
read_err_t read_list(sys_t *sys, stream_t *stream, lisp_t **ret)
|
||||||
{
|
{
|
||||||
TODO("read_list: not implemented");
|
// skip past the open parentheses '('
|
||||||
|
(void)stream_next(stream);
|
||||||
|
|
||||||
|
lisp_t *top = NIL;
|
||||||
|
lisp_t *cur = NIL;
|
||||||
|
while (stream_peek(stream) != ')')
|
||||||
|
{
|
||||||
|
lisp_t *item = NIL;
|
||||||
|
read_err_t err = read(sys, stream, &item);
|
||||||
|
if (err)
|
||||||
|
{
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
else if (!top)
|
||||||
|
{
|
||||||
|
top = cons(sys, item, NIL);
|
||||||
|
cur = top;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
as_cons(cur)->cdr = cons(sys, item, NIL);
|
||||||
|
cur = cdr(cur);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stream_peek(stream) != ')')
|
||||||
|
return READ_ERR_EXPECTED_CLOSED_BRACE;
|
||||||
|
|
||||||
|
stream_next(stream);
|
||||||
|
*ret = top;
|
||||||
|
return READ_ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
read_err_t read_vec(sys_t *, stream_t *, lisp_t **)
|
read_err_t read_vec(sys_t *, stream_t *, lisp_t **)
|
||||||
|
|||||||
Reference in New Issue
Block a user