diff --git a/src/backends/llk.c b/src/backends/llk.c index 13152c3..72b39bb 100644 --- a/src/backends/llk.c +++ b/src/backends/llk.c @@ -297,6 +297,10 @@ HParseResult *h_llk_parse(HAllocator* mm__, const HParser* parser, HInputStream* // XXX set tok->index and tok->bit_offset (don't take directly from stream, cuz peek!) + // perform token reshape if indicated + if(x->reshape) + tok = (HParsedToken *)x->reshape(make_result(arena, tok)); + // call validation and semantic action, if present if(x->pred && !x->pred(make_result(tarena, tok))) goto no_parse; // validation failed -> no parse diff --git a/src/internal.h b/src/internal.h index 7592fed..a48fb29 100644 --- a/src/internal.h +++ b/src/internal.h @@ -285,6 +285,8 @@ typedef struct HCFChoice_ { HCFSequence** seq; uint8_t chr; }; + HAction reshape; // take CFG parse tree to HParsedToken of expected form. + // to execute before action and pred are applied. HAction action; HPredicate pred; } HCFChoice;