aboutsummaryrefslogtreecommitdiff
path: root/src/parse.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/parse.c')
-rw-r--r--src/parse.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/src/parse.c b/src/parse.c
new file mode 100644
index 0000000..18dfffe
--- /dev/null
+++ b/src/parse.c
@@ -0,0 +1,37 @@
+// Copyright (c) 2023, Marvin Borner <dev@marvinborner.de>
+// SPDX-License-Identifier: MIT
+
+#include <stdlib.h>
+
+#include <parse.h>
+#include <log.h>
+
+struct term *parse_blc(char **term)
+{
+ if (!**term) {
+ fatal("invalid parsing state!\n");
+ } else if (**term == '0' && *(*term + 1) == '0') {
+ (*term) += 2;
+ struct term *new = term_new(ABS);
+ new->u.abs.term = parse_blc(term);
+ return new;
+ } else if (**term == '0' && *(*term + 1) == '1') {
+ (*term) += 2;
+ struct term *new = term_new(APP);
+ new->u.app.lhs = parse_blc(term);
+ new->u.app.rhs = parse_blc(term);
+ return new;
+ } else if (**term == '1') {
+ const char *cur = *term;
+ while (**term == '1')
+ (*term)++;
+ int index = *term - cur - 1;
+ (*term)++;
+ struct term *new = term_new(VAR);
+ new->u.var.index = index;
+ return new;
+ } else {
+ (*term)++;
+ return parse_blc(term);
+ }
+}