diff --git a/src/backends/lalr.c b/src/backends/lalr.c
index 0dd1d0705a87923aba3badba58b1579842c66483..773b457743e188754da21567e2ca3d566f91e7ac 100644
--- a/src/backends/lalr.c
+++ b/src/backends/lalr.c
@@ -579,15 +579,16 @@ int h_lrtable_put(HLRTable *tbl, size_t state, HCFChoice *x, HLRAction *action)
 bool match_production(HLREnhGrammar *eg, HCFChoice **p,
                       HCFChoice **rhs, size_t endstate)
 {
-  HLRTransition *t;
+  size_t state = endstate;  // initialized to end in case of empty rhs
   for(; *p && *rhs; p++, rhs++) {
-    t = h_hashtable_get(eg->smap, *p);
+    HLRTransition *t = h_hashtable_get(eg->smap, *p);
     assert(t != NULL);
     if(!eq_symbol(t->symbol, *rhs))
       return false;
+    state = t->to;
   }
   return (*p == *rhs    // both NULL
-          && t->to == endstate);
+          && state == endstate);
 }
 
 int h_lalr_compile(HAllocator* mm__, HParser* parser, const void* params)
@@ -1022,7 +1023,7 @@ int test_lalr(void)
   h_pprint_lrtable(stdout, g, (HLRTable *)p->backend_data, 0);
 
   printf("\n==== P A R S E  R E S U L T ====\n");
-  HParseResult *res = h_parse(p, (uint8_t *)"xxn-(n-((n)))-n", 13);
+  HParseResult *res = h_parse(p, (uint8_t *)"xxn-(n-((n)))-n", 2);
   if(res)
     h_pprint(stdout, res->ast, 0, 2);
   else