diff --git a/src/hammer.h b/src/hammer.h
index e337b49374f07db7745a28aa218149f42236a074..13724cac70b16e3ec3a80012ecf955f5409a1daa 100644
--- a/src/hammer.h
+++ b/src/hammer.h
@@ -112,10 +112,13 @@ typedef bool (*HPredicate)(HParseResult *p);
 
 typedef struct HParserVtable_ HParserVtable;
 
+typedef struct HCFChoice_ HCFChoice; // forward declaration
+
 typedef struct HParser_ {
   const HParserVtable *vtable;
   void *env;
   void *data; /* e.g., parse tables */
+  HCFChoice *desugared; /* if the parser can be desugared, its desugared form */
 } HParser;
 
 // {{{ Stuff for benchmarking
diff --git a/src/parsers/indirect.c b/src/parsers/indirect.c
index ed556270d1ab100c6d1ca4250f7a47f4e8d81490..c6935489042953122d9069625131ed2f34b4c64e 100644
--- a/src/parsers/indirect.c
+++ b/src/parsers/indirect.c
@@ -10,8 +10,10 @@ static bool indirect_isValidCF(void *env) {
   return inner->vtable->isValidCF(inner->env);
 }
 
-static HCFChoice desugar_indirect(HAllocator *mm__, void *env) {
-
+static HCFChoice* desugar_indirect(HAllocator *mm__, void *env) {
+  HParser *p = (HParser*)env;
+  HParser *inner = (HParser*)p->env;
+  return inner->desugared;
 }
 
 static const HParserVtable indirect_vt = {