From 8163bf4f47edf2619781e3e8e7bb233d25cceb88 Mon Sep 17 00:00:00 2001 From: Lukas Krickl Date: Sun, 19 Nov 2023 14:18:49 +0100 Subject: [PATCH] WIP: parser --- include/ulas.h | 6 +++--- src/ulas.c | 56 +++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 54 insertions(+), 8 deletions(-) diff --git a/include/ulas.h b/include/ulas.h index 6cbb8f4..d48dcfc 100644 --- a/include/ulas.h +++ b/include/ulas.h @@ -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; }; diff --git a/src/ulas.c b/src/ulas.c index bcb9236..11fbb74 100644 --- a/src/ulas.c +++ b/src/ulas.c @@ -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; } -- 2.30.2