aboutsummaryrefslogtreecommitdiff
path: root/src/parse.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/parse.c')
-rw-r--r--src/parse.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/src/parse.c b/src/parse.c
new file mode 100644
index 0000000..00fd498
--- /dev/null
+++ b/src/parse.c
@@ -0,0 +1,36 @@
+// Just for debugging purposes
+// -> parses custom bruijn syntax
+
+#include <parse.h>
+#include <term.h>
+#include <stdio.h>
+
+static struct term *rec(const char **term)
+{
+ struct term *res = 0;
+ if (!**term) {
+ fprintf(stderr, "invalid parsing state!\n");
+ } else if (**term == '[') {
+ (*term)++;
+ res = new_term(ABS);
+ res->u.abs.term = rec(term);
+ } else if (**term == '(') {
+ (*term)++;
+ res = new_term(APP);
+ res->u.app.lhs = rec(term);
+ res->u.app.rhs = rec(term);
+ } else if (**term >= '0' && **term <= '9') {
+ res = new_term(VAR);
+ res->u.var = **term - '0';
+ (*term)++;
+ } else {
+ (*term)++;
+ res = rec(term); // this is quite tolerant..
+ }
+ return res;
+}
+
+struct term *parse(const char *term)
+{
+ return rec(&term);
+}