WIP: parser
authorLukas Krickl <lukas@krickl.dev>
Sun, 19 Nov 2023 13:18:49 +0000 (14:18 +0100)
committerLukas Krickl <lukas@krickl.dev>
Sun, 19 Nov 2023 13:18:49 +0000 (14:18 +0100)
include/ulas.h
src/ulas.c

index 6cbb8f41dde623c5cad6489aab44727fc943df86..d48dcfc736b3c99599b14a464d8e17b3df1a68c4 100644 (file)
@@ -221,7 +221,7 @@ struct ulas_sym {
  * -1 denotes a NULL value
  */
 
-enum ulas_exprs { ULAS_EXPUN, ULAS_EXPBIN, ULAS_EXPLIT, ULAS_EXPGRP };
+enum ulas_exprs { ULAS_EXPUN, ULAS_EXPBIN, ULAS_EXPPRIM, ULAS_EXPGRP };
 
 struct ulas_expun {
   long expr;
@@ -234,7 +234,7 @@ struct ulas_expbin {
   long op;
 };
 
-struct ulas_explit {
+struct ulas_expprim {
   long tok;
 };
 
@@ -249,7 +249,7 @@ struct ulas_expgrp {
 union ulas_expval {
   struct ulas_expun un;
   struct ulas_expbin bin;
-  struct ulas_explit lit;
+  struct ulas_expprim prim;
   struct ulas_expgrp grp;
 };
 
index bcb923675e547712d9e9e7da0ed72444ce64f2de..11fbb74c7bd559f50ca2bdda475d38d5d15b2fcf 100644 (file)
@@ -1012,15 +1012,61 @@ end:
   return tokrc;
 }
 
+/**
+ * Parse expressions from tokens 
+ * return tree-like structure
+ * all these functions return an int index into 
+ * the expression buffer.
+ * they also all take an index variable i which can be freely modified.
+ * i may never exceed toks->len.
+ * if i is not the same as toks->len when the parser finishes 
+ * we error out because of trailing tokens!
+ */
+
+int ulas_parseprim(int *i) {
+}
+
+int ulas_parseun(int *i) {
+  return ulas_parseprim(i);
+}
+
+int ulas_parsefact(int *i) {
+  int expr = ulas_parseun(i);
+
+  return expr;
+}
+
+int ulas_parseterm(int *i) {
+  int expr = ulas_parsefact(i);
+  return expr;
+}
+
+int ulas_parsecmp(int *i) {
+  int expr = ulas_parseterm(i);
+
+  return expr;
+}
+
+int ulas_parseeq(int *i) {
+  int expr = ulas_parsecmp(i);
+
+  return expr;
+}
+
 // parses tokens to expression tree
-int ulas_parseexpr(struct ulas_tokbuf *toks) {
+int ulas_parseexpr(void) {
   ulas_exprbufclear(&ulas.exprs);
 
-  int rc = 0;
-  for (long i = 0; i < toks->len; i++) {
+  struct ulas_tokbuf *toks = &ulas.toks;
+
+  int i = 0;
+  int rc = ulas_parseeq(&i); 
+
+  if (i != toks->len) {
+    ULASERR("Trailing token!\n");
+    rc = -1;
   }
 
-fail:
   return rc;
 }
 
@@ -1030,7 +1076,7 @@ int ulas_intexpr(const char **line, unsigned long n, int *rc) {
     return -1;
   }
 
-  if (ulas_parseexpr(&ulas.toks) == -1) {
+  if (ulas_parseexpr() == -1) {
     *rc = -1;
     return -1;
   }