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);