diff --git a/src/backends/llk.c b/src/backends/llk.c index 13152c3523f8617ee5849d9c5cf8312333e8b3e8..72b39bbbcfb8bfed1db466aa8674c1392c7fba3f 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 7592fed0915d35df3f9d405a5e2c074f3f212702..a48fb29e4ddf6cd008b3af8ed8bac9bd936f1a11 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;