diff --git a/src/backends/lalr.c b/src/backends/lalr.c index c0be736267eb6535ecb9361f587c3c14c7bb4c54..fbdb55498c6d83b97dda45bfe24d84e45c01cd94 100644 --- a/src/backends/lalr.c +++ b/src/backends/lalr.c @@ -215,6 +215,7 @@ static HLRItem *advance_mark(HArena *arena, const HLRItem *item) static HHashSet *closure(HCFGrammar *g, const HHashSet *items) { + HAllocator *mm__ = g->mm__; HArena *arena = g->arena; HHashSet *ret = h_lrstate_new(arena); HSlist *work = h_slist_new(arena); @@ -251,8 +252,9 @@ static HHashSet *closure(HCFGrammar *g, const HHashSet *items) } else { // HCF_CHARSET for(unsigned int i=0; i<256; i++) { if(charset_isset(sym->charset, i)) { - HCFChoice **rhs = h_arena_malloc(arena, 2 * sizeof(HCFChoice *)); - rhs[0] = h_arena_malloc(arena, sizeof(HCFChoice)); + // XXX allocatethese single-character symbols statically somewhere + HCFChoice **rhs = h_new(HCFChoice *, 2); + rhs[0] = h_new(HCFChoice, 1); rhs[0]->type = HCF_CHAR; rhs[0]->chr = i; rhs[1] = NULL; @@ -558,7 +560,7 @@ static HLREnhGrammar *enhance_grammar(const HCFGrammar *g, const HLRDFA *dfa, const HLRTable *table) { HAllocator *mm__ = g->mm__; - HArena *arena = g->arena; // XXX ? + HArena *arena = g->arena; HLREnhGrammar *eg = h_arena_malloc(arena, sizeof(HLREnhGrammar)); eg->tmap = h_hashtable_new(arena, eq_transition, hash_transition); @@ -851,8 +853,8 @@ HParseResult *h_lr_parse(HAllocator* mm__, const HParser* parser, HInputStream* HParseResult *result = NULL; if(h_slist_pop(right) == table->start) { // next on the right stack is the start symbol's semantic value + assert(!h_slist_empty(right)); HParsedToken *tok = h_slist_pop(right); - assert(tok != NULL); result = make_result(arena, tok); } else { h_delete_arena(arena);