diff --git a/src/Makefile b/src/Makefile
index 128de0506ec7f2b39232b79441890047ac4a95f0..84970c9263a7562e96e8fb480c7fdb7e5dfdc698 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -34,6 +34,7 @@ HAMMER_PARTS := \
 	bitwriter.o \
 	pprint.o \
 	allocator.o \
+	desugar.o \
 	datastructures.o \
 	system_allocator.o \
 	benchmark.o \
diff --git a/src/internal.h b/src/internal.h
index 279f9980d008d2fa3cd80d01aeab20ee16067be9..2386e4e7442095cc0b778c3acd527b70c06c6f6e 100644
--- a/src/internal.h
+++ b/src/internal.h
@@ -224,6 +224,8 @@ long long h_read_bits(HInputStream* state, int count, char signed_p);
 HParseResult* h_do_parse(const HParser* parser, HParseState *state);
 void put_cached(HParseState *ps, const HParser *p, HParseResult *cached);
 
+HCFChoice *h_desugar(HAllocator *mm__, HParser *parser);
+
 HCountedArray *h_carray_new_sized(HArena * arena, size_t size);
 HCountedArray *h_carray_new(HArena * arena);
 void h_carray_append(HCountedArray *array, void* item);
diff --git a/src/parsers/sequence.c b/src/parsers/sequence.c
index b15b168d04aa0dc8ba2aee296913f2340aeb9d6d..eb215a94de2bf4e36465cd4d2a6ac76ccf46cf0c 100644
--- a/src/parsers/sequence.c
+++ b/src/parsers/sequence.c
@@ -47,7 +47,7 @@ static HCFChoice* desugar_sequence(HAllocator *mm__, void *env) {
   HCFSequence *seq = h_new(HCFSequence, 1);
   seq->items = h_new(HCFChoice*, s->len+1);
   for (size_t i=0; i<s->len; ++i) {
-    seq->items[i] = s->p_array[i]->vtable->desugar(mm__, s->p_array[i]->env);
+    seq->items[i] = h_desugar(s->p_array[i]);
   }
   seq->items[s->len] = NULL;
   HCFChoice *ret = h_new(HCFChoice, 1);