diff --git a/src/desugar.c b/src/desugar.c
index fbd15811a9e8a53342ef56f7c1c8338a79ac41d4..6117c2212af77be8cc2db4abbc8ccffa83101753 100644
--- a/src/desugar.c
+++ b/src/desugar.c
@@ -2,5 +2,10 @@
 #include "internal.h"
 
 HCFChoice *h_desugar(HAllocator *mm__, const HParser *parser) {
-  return parser->vtable->desugar(mm__, parser->env);
+  if(parser->desugared == NULL) {
+    // we're going to do something naughty and cast away the const to memoize
+    ((HParser *)parser)->desugared = parser->vtable->desugar(mm__, parser->env);
+  }
+
+  return parser->desugared;
 }