From 0231dc141e6aff819bcc13dd78416414130e178d Mon Sep 17 00:00:00 2001 From: "Sven M. Hallberg" <pesco@khjk.org> Date: Thu, 3 Sep 2015 19:18:07 +0200 Subject: [PATCH] add iterative API to LL(k) backend --- src/backends/llk.c | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/src/backends/llk.c b/src/backends/llk.c index af755944..2b8d35b1 100644 --- a/src/backends/llk.c +++ b/src/backends/llk.c @@ -461,12 +461,45 @@ HParseResult *h_llk_parse(HAllocator* mm__, const HParser* parser, HInputStream* return llk_parse_finish_(mm__, s); } +void h_llk_parse_start(HSuspendedParser *s) +{ + s->backend_state = llk_parse_start_(s->mm__, s->parser); +} + +void h_llk_parse_chunk(HSuspendedParser *s, HInputStream *input) +{ + HLLkState *state = s->backend_state; + + state->seq = llk_parse_chunk_(state, s->parser, input, false); +} + +HParseResult *h_llk_parse_finish(HSuspendedParser *s) +{ + HLLkState *state = s->backend_state; + HInputStream empty = { + .index = 0, + .bit_offset = 0, + .overrun = 0, + .endianness = s->endianness, + .length = 0, + .input = NULL + }; + + // signal end of input (no-op parse already done) + state->seq = llk_parse_chunk_(state, s->parser, &empty, true); + + return llk_parse_finish_(s->mm__, s->backend_state); +} HParserBackendVTable h__llk_backend_vtable = { .compile = h_llk_compile, .parse = h_llk_parse, - .free = h_llk_free + .free = h_llk_free, + + .parse_start = h_llk_parse_start, + .parse_chunk = h_llk_parse_chunk, + .parse_finish = h_llk_parse_finish }; -- GitLab