diff --git a/src/cfgrammar.c b/src/cfgrammar.c
index b056261e415954d3ef6f49edf437513c1ede006d..d45da2e6aaa6884e8c643aad50f6b7867eddf7e0 100644
--- a/src/cfgrammar.c
+++ b/src/cfgrammar.c
@@ -235,11 +235,16 @@ void h_stringmap_put_epsilon(HCFStringMap *m, void *v)
   m->epsilon_branch = v;
 }
 
+void h_stringmap_put_after(HCFStringMap *m, uint8_t c, HCFStringMap *ends)
+{
+  h_hashtable_put(m->char_branches, (void *)char_key(c), ends);
+}
+
 void h_stringmap_put_char(HCFStringMap *m, uint8_t c, void *v)
 {
   HCFStringMap *node = h_stringmap_new(m->arena);
   h_stringmap_put_epsilon(node, v);
-  h_hashtable_put(m->char_branches, (void *)char_key(c), node);
+  h_stringmap_put_after(m, c, node);
 }
 
 // helper for h_stringmap_update
@@ -505,7 +510,7 @@ static void stringset_extend(HCFGrammar *g, HCFStringMap *ret,
       // t { a b | a <- as_, b <- f_l(tail), l=k-|a|-1 }
       // so we can use recursion over k
       HCFStringMap *ret_ = h_stringmap_new(g->arena);
-      h_stringmap_put_char(ret, c, ret_);
+      h_stringmap_put_after(ret, c, ret_);
 
       stringset_extend(g, ret_, k-1, as_, f, tail);
     }
diff --git a/src/cfgrammar.h b/src/cfgrammar.h
index cec5d6e9b4b7ea011fe896b7f6d433826ebefcc9..eb53b0140635d160025d13e916c6bf65b5b68553 100644
--- a/src/cfgrammar.h
+++ b/src/cfgrammar.h
@@ -42,6 +42,7 @@ typedef struct HCFStringMap_ {
 HCFStringMap *h_stringmap_new(HArena *a);
 void h_stringmap_put_end(HCFStringMap *m, void *v);
 void h_stringmap_put_epsilon(HCFStringMap *m, void *v);
+void h_stringmap_put_after(HCFStringMap *m, uint8_t c, HCFStringMap *ends);
 void h_stringmap_put_char(HCFStringMap *m, uint8_t c, void *v);
 void h_stringmap_update(HCFStringMap *m, const HCFStringMap *n);
 void *h_stringmap_get(const HCFStringMap *m, const uint8_t *str, size_t n, bool end);