From a7fe3824cda87f6f74b565abb53c9e1ad27889ef Mon Sep 17 00:00:00 2001
From: "Sven M. Hallberg" <pesco@khjk.org>
Date: Fri, 14 Jun 2013 19:07:26 +0200
Subject: [PATCH] minor bugfixies

---
 src/backends/lalr.c | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/src/backends/lalr.c b/src/backends/lalr.c
index c0be7362..fbdb5549 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);
-- 
GitLab