aboutsummaryrefslogtreecommitdiff
path: root/src/prc1/pop.c
diff options
context:
space:
mode:
authorXavier Del Campo Romero <xavi92@disroot.org>2026-10-01 01:04:30 +0200
committerXavier Del Campo Romero <xavi92@disroot.org>2026-10-11 00:14:35 +0200
commit4ce39e4fc1de9536de7dedfe91b6dee38dec76ae (patch)
treef9820f96b8eab624430c3700f32a2878a7036ee2 /src/prc1/pop.c
parent9140988be4e5bb028b7140aca1a67af1370c72a7 (diff)
downloadprc-4ce39e4fc1de9536de7dedfe91b6dee38dec76ae.tar.gz
WIP sym + cgen
Diffstat (limited to 'src/prc1/pop.c')
-rw-r--r--src/prc1/pop.c30
1 files changed, 20 insertions, 10 deletions
diff --git a/src/prc1/pop.c b/src/prc1/pop.c
index ba2f3a1..977129e 100644
--- a/src/prc1/pop.c
+++ b/src/prc1/pop.c
@@ -1,20 +1,28 @@
#include "prv.h"
+#include "dbg.h"
#include <stdlib.h>
int pop(const struct lex *l, struct prv *p)
{
size_t n;
- struct pos *pos = NULL;
+ struct pos *pos;
+ int (*end)(const struct lex *, struct prv *);
+ const char *name;
if (!p->n)
{
fprintf(stderr, "%s: underflow\n", __func__);
return -1;
}
- else if (!(n = p->n - 1))
+
+ pos = &p->pos[p->i];
+ end = pos->end;
+ name = pos->name;
+
+ if (!(n = p->n - 1))
{
free(p->pos);
- p->pos = NULL;
+ p->pos = pos = NULL;
}
else if (!(pos = realloc(p->pos, n * sizeof *pos)))
{
@@ -22,16 +30,18 @@ int pop(const struct lex *l, struct prv *p)
return -1;
}
+ ddbg("pop rule %s [%zu]", name, p->i);
+
+ if (end)
+ ddbg(", end=%p", end);
+
+ ddbg("\n");
p->pos = pos;
p->n = n;
+ p->i--;
- if (p->n)
- {
- const struct pos *old = &p->pos[--p->i];
-
- if (old->end && old->end(l, p))
- return -1;
- }
+ if (end)
+ return end(l, p);
return 0;
}