aboutsummaryrefslogtreecommitdiff
path: root/src/parser.c
diff options
context:
space:
mode:
authorMistivia <i@mistivia.com>2025-06-21 16:04:00 +0800
committerMistivia <i@mistivia.com>2025-06-21 16:04:00 +0800
commitca22ae606ca674a91e28597a96641c01f7eacb24 (patch)
tree01fadb02db0ee2bffe9217373c304dae7c48e19d /src/parser.c
parent1b2e36b342be527937ad350690023cb50190f1e0 (diff)
add tests
Diffstat (limited to 'src/parser.c')
-rw-r--r--src/parser.c43
1 files changed, 34 insertions, 9 deletions
diff --git a/src/parser.c b/src/parser.c
index 87690c8..6982198 100644
--- a/src/parser.c
+++ b/src/parser.c
@@ -11,6 +11,15 @@
#define BUFSIZE 1024
+static void skip_comment(Parser *parser) {
+ if (Parser_peek(parser) == ';') {
+ while (1) {
+ int peek = Parser_peek(parser);
+ if (peek == '\n' || peek == EOF) break;
+ Parser_getchar(parser);
+ }
+ }
+}
static void skip_spaces(Parser *parser) {
while (isspace(Parser_peek(parser))) {
@@ -18,8 +27,19 @@ static void skip_spaces(Parser *parser) {
}
}
+static void skip_blank(Parser *parser) {
+ while (1) {
+ int peek = Parser_peek(parser);
+ if (!isspace(peek) && peek != ';') {
+ break;
+ }
+ skip_comment(parser);
+ skip_spaces(parser);
+ }
+}
+
bool Parser_is_end(Parser *parser) {
- skip_spaces(parser);
+ skip_blank(parser);
if (Parser_peek(parser) == EOF) return true;
return false;
}
@@ -71,6 +91,7 @@ void Parser_set_readline(Parser *parser) {
parser->readline_eof = false;
}
+
int Parser_getchar(Parser *ctx) {
if (ctx->parse_type == kParseString) {
if (*ctx->str_cursor == '\0') return EOF;
@@ -142,7 +163,7 @@ int Parser_peek(Parser *ctx) {
}
ParseResult parse_sexp(Parser *parser) {
- skip_spaces(parser);
+ skip_blank(parser);
if (Parser_peek(parser) == EOF) {
return ParseErr(parser, "Unexpected EOF.\n");
}
@@ -185,7 +206,7 @@ static ParseResult expect_space(Parser *parser) {
if (Parser_peek(parser) == EOF) {
return ParseErr(parser, "Unexpected EOF.\n");
}
- if (isspace(Parser_peek(parser))) {
+ if (isspace(Parser_peek(parser)) || Parser_peek(parser) == ';') {
return ParseOk(parser->ctx->nil);
}
return ParseErr(parser, "Expect space.\n");
@@ -196,7 +217,8 @@ static ParseResult expect_space_or_end(Parser *parser) {
return ParseErr(parser, "Unexpected EOF.\n");
}
if (isspace(Parser_peek(parser))
- || Parser_peek(parser) == ')') {
+ || Parser_peek(parser) == ')'
+ || Parser_peek(parser) == ';') {
return ParseOk(parser->ctx->nil);
}
return ParseErr(parser, "Expect space.\n");
@@ -220,7 +242,7 @@ ParseResult parse_list(Parser *parser) {
ret = expect_char(parser, '(');
if (ParseResult_is_err(ret)) goto end;
- skip_spaces(parser);
+ skip_blank(parser);
while (1) {
if (Parser_peek(parser) == EOF) {
ret = ParseErr(parser, "Unexpected EOF.\n");
@@ -240,16 +262,16 @@ ParseResult parse_list(Parser *parser) {
SExpRefVector_push_back(&elems, ret.val);
// ret = expect_space_or_end(parser);
// if (ParseResult_is_err(ret)) goto end;
- skip_spaces(parser);
+ skip_blank(parser);
}
// dot
ret = expect_space(parser);
if (ParseResult_is_err(ret)) goto end;
- skip_spaces(parser);
+ skip_blank(parser);
ret = parse_sexp(parser);
if (ParseResult_is_err(ret)) goto end;
SExpRefVector_push_back(&elems, ret.val);
- skip_spaces(parser);
+ skip_blank(parser);
ret = expect_char(parser, ')');
if (ParseResult_is_err(ret)) goto end;
ret = ParseOk(build_list_from_vector(parser->ctx, elems));
@@ -265,6 +287,7 @@ static char *read_token(Parser *parser) {
&& Parser_peek(parser) != ')'
&& Parser_peek(parser) != '('
&& Parser_peek(parser) != '"'
+ && Parser_peek(parser) != ';'
&& (i == 0 || Parser_peek(parser) != '#')
&& i < BUFSIZE - 1) {
parser->token_buf[i] = Parser_getchar(parser);
@@ -307,7 +330,9 @@ static bool is_symbol_subsequent(char c) {
static ParseResult parse_token(Parser *parser, const char *token) {
int len = strlen(token);
- if (len == 0) return ParseErr(parser, "Empty token.\n");
+ if (len == 0) {
+ return ParseErr(parser, "Empty token.\n");
+ }
if (len == 1) {
if (token[0] == '-' || token[0] == '+') {
return ParseOk(new_symbol(parser->ctx, token));