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;