aboutsummaryrefslogtreecommitdiff
path: root/src/parser.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/parser.c')
-rw-r--r--src/parser.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/parser.c b/src/parser.c
new file mode 100644
index 0000000..d164186
--- /dev/null
+++ b/src/parser.c
@@ -0,0 +1,38 @@
+#include "parser.h"
+
+#include <ctype.h>
+#include <stdlib.h>
+
+static void skip_spaces(Parser *ctx) {
+ while (isspace(parser_peek(ctx))) {
+ parser_getchar(ctx);
+ }
+}
+
+ParseResult ParseOk(SExpRef ref) {
+ return (ParseResult){ .val = ref, .errmsg = NULL };
+}
+
+ParseResult ParseErr(const char *msg) {
+ return (ParseResult){ .val = {-1}, .errmsg = msg };
+}
+
+ParseResult parse_sexp(Parser *ctx) {
+ skip_spaces(ctx);
+ int next = parser_peek(ctx);
+ if (next == '(') {
+ return parse_list(ctx);
+ } else if (next == ',') {
+ parser_getchar(ctx);
+ if (parser_peek(ctx) == '@') {
+ return parse_slicing_unquote(ctx);
+ }
+ return parse_unquote(ctx);
+ } else if (next == '`') {
+ return parse_quasi(ctx);
+ } else if (next == '\'') {
+ return parse_quote(ctx);
+ }
+ return parse_atom(ctx);
+}
+