From 668c7baf55d07cb429b30b92ea8ce302f9de053a Mon Sep 17 00:00:00 2001 From: Bruce Hill Date: Fri, 8 Jan 2021 01:00:27 -0800 Subject: Refactoring, moving visualization and virtual machine code into proper files --- grammar.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'grammar.c') diff --git a/grammar.c b/grammar.c index 229fb0e..aa75522 100644 --- a/grammar.c +++ b/grammar.c @@ -98,6 +98,19 @@ void push_backref(grammar_t *g, const char *name, match_t *capture) g->backrefs[i].op = op; } +size_t push_backrefs(grammar_t *g, match_t *m) +{ + if (m->op->op == VM_REF) return 0; + size_t count = 0; + if (m->op->op == VM_CAPTURE && m->op->args.capture.name) { + ++count; + push_backref(g, m->op->args.capture.name, m->child); + } + if (m->child) count += push_backrefs(g, m->child); + if (m->nextsibling) count += push_backrefs(g, m->nextsibling); + return count; +} + void pop_backrefs(grammar_t *g, size_t count) { check(count <= g->backrefcount, "Attempt to pop %ld backrefs when there are only %ld", count, g->backrefcount); -- cgit v1.2.3