diff --git a/src/backends/lalr.c b/src/backends/lalr.c index a11baf21d0e103ad3adb0c4a487515facccbc0e5..e974da6127e081254dccb1ab0e14549fc784cdae 100644 --- a/src/backends/lalr.c +++ b/src/backends/lalr.c @@ -35,7 +35,9 @@ typedef struct HLRAction_ { struct { HCFChoice *lhs; // symbol carrying semantic actions etc. size_t length; // # of symbols in rhs - // NB: the rhs symbols are not needed for the parse +#ifndef NDEBUG + HCFChoice **rhs; // NB: the rhs symbols are not needed for the parse +#endif } production; // used with REDUCE }; } HLRAction; @@ -378,12 +380,15 @@ static HLRAction *shift_action(HArena *arena, size_t nextstate) return action; } -static HLRAction *reduce_action(HArena *arena, HCFChoice *lhs, size_t rhslen) +static HLRAction *reduce_action(HArena *arena, const HLRItem *item) { HLRAction *action = h_arena_malloc(arena, sizeof(HLRAction)); action->type = HLR_REDUCE; - action->production.lhs = lhs; - action->production.length = rhslen; + action->production.lhs = item->lhs; + action->production.length = item->len; +#ifndef NDEBUG + action->production.rhs = item->rhs; +#endif return action; } @@ -424,7 +429,7 @@ HLRTable *h_lr0_table(HCFGrammar *g) h_slist_push(table->inadeq, (void *)(uintptr_t)i); } else { // set reduce action for the entire row - table->forall[i] = reduce_action(arena, item->lhs, item->len); + table->forall[i] = reduce_action(arena, item); } } H_END_FOREACH @@ -811,8 +816,15 @@ void pprint_lraction(FILE *f, const HCFGrammar *g, const HLRAction *action) if(action->type == HLR_SHIFT) { fprintf(f, "s%lu", action->nextstate); } else { - fputc('r', f); - // XXX reference the production somehow +#ifdef NDEBUG + // if we can't print the production, at least print its length + fprintf(f, "r[%lu]", action->production.length); +#else + fputs("r(", f); + HCFSequence seq = {action->production.rhs}; + h_pprint_sequence(f, g, &seq); + fputc(')', f); +#endif } }