aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMistivia <i@mistivia.com>2025-06-19 07:06:29 +0800
committerMistivia <i@mistivia.com>2025-06-19 07:06:29 +0800
commitd96ab7d81aeb9676779faa7c1380dd48f5440b07 (patch)
tree5170d5cae8d3f506f2ec0be27074c24949d85d2c /src
parent0b335dc24e76cace44e748e62d5cbbc40c4355f5 (diff)
parse list test
Diffstat (limited to 'src')
-rw-r--r--src/parser.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/src/parser.c b/src/parser.c
index ff7d625..f60946a 100644
--- a/src/parser.c
+++ b/src/parser.c
@@ -118,7 +118,17 @@ static ParseResult expect_space(Parser *parser) {
return ParseErr(parser, "Unexpected EOF.\n.");
}
if (isspace(Parser_peek(parser))) {
- Parser_getchar(parser);
+ return ParseOk(parser->ctx->nil);
+ }
+ return ParseErr(parser, "Expect space.\n");
+}
+
+static ParseResult expect_space_or_end(Parser *parser) {
+ if (Parser_peek(parser) == EOF) {
+ return ParseErr(parser, "Unexpected EOF.\n.");
+ }
+ if (isspace(Parser_peek(parser))
+ || Parser_peek(parser) == ')') {
return ParseOk(parser->ctx->nil);
}
return ParseErr(parser, "Expect space.\n");
@@ -127,6 +137,7 @@ static ParseResult expect_space(Parser *parser) {
static SExpRef build_list_from_vector(Interp *ctx, SExpRefVector elems) {
int i = SExpRefVector_len(&elems) - 1;
SExpRef ret = *SExpRefVector_ref(&elems, i);
+ i--;
for (; i >= 0; i--) {
SExpRef cur = *SExpRefVector_ref(&elems, i);
ret = cons(ctx, cur, ret);
@@ -159,7 +170,7 @@ ParseResult parse_list(Parser *parser) {
ret = parse_sexp(parser);
if (ParseResult_is_err(ret)) goto end;
SExpRefVector_push_back(&elems, ret.val);
- ret = expect_space(parser);
+ ret = expect_space_or_end(parser);
if (ParseResult_is_err(ret)) goto end;
skip_spaces(parser);
}
@@ -183,6 +194,7 @@ static char *read_token(Parser *parser) {
int i = 0;
while (!isspace(Parser_peek(parser))
&& Parser_peek(parser) != EOF
+ && Parser_peek(parser) != ')'
&& i < BUFSIZE - 1) {
parser->token_buf[i] = Parser_getchar(parser);
i++;