diff --git a/src/backends/lalr.c b/src/backends/lalr.c index 541a69afac5cd780894135cc3027b15e18899980..5b340e9238590f3b6f8716ff3ee27c6b6175978a 100644 --- a/src/backends/lalr.c +++ b/src/backends/lalr.c @@ -308,14 +308,16 @@ HLRDFA *h_lr0_dfa(HCFGrammar *g) // XXX replace other hashtable iterations with this // XXX move to internal.h or something #define H_FOREACH_(HT) do { \ - const HHashTable *ht = HT; \ - for(size_t i=0; i < ht->capacity; i++) { \ - for(HHashTableEntry *hte = &ht->contents[i]; hte; hte = hte->next) { \ - if(hte->key == NULL) continue; + const HHashTable *ht__ = HT; \ + for(size_t i__=0; i__ < ht__->capacity; i__++) { \ + for(HHashTableEntry *hte__ = &ht__->contents[i]; hte__; hte__ = hte__->next) { \ + if(hte__->key == NULL) continue; -#define H_FOREACH(HT, KEYVAR, VALVAR) H_FOREACH_(HT) \ - const KEYVAR = hte->key; \ - VALVAR = hte->value; +#define H_FOREACH_KEY(HT, KEYVAR) H_FOREACH_(HT) \ + const KEYVAR = hte__->key; \ + +#define H_FOREACH(HT, KEYVAR, VALVAR) H_FOREACH_KEY(HT) \ + VALVAR = hte__->value; #define H_END_FOREACH \ } \ @@ -330,6 +332,8 @@ HLRTable *h_lrtable_new(HAllocator *mm__, size_t nrows) HLRTable *ret = h_new(HLRTable, 1); ret->nrows = nrows; ret->rows = h_arena_malloc(arena, nrows * sizeof(HHashTable *)); + ret->forall = h_arena_malloc(arena, nrows * sizeof(HLRAction *)); + ret->inadeq = h_slist_new(arena); ret->arena = arena; ret->mm__ = mm__; @@ -386,7 +390,7 @@ HLRTable *h_lr0_table(HCFGrammar *g) // add reduce entries, record inadequate states for(size_t i=0; i<dfa->nstates; i++) { // find reducible items in state - H_FOREACH(dfa->states[i], HLRItem *item, void *v_) + H_FOREACH_KEY(dfa->states[i], HLRItem *item) if(item->mark == item->len) { // mark at the end // XXX store more informative stuff in the inadeq records? if(table->forall[i]) { @@ -519,6 +523,7 @@ static HHashTable *enhance_grammar(const HCFGrammar *g, const HLRTable *tbl) bool is_inadequate(HLRTable *table, size_t state) { // XXX + return false; } bool has_conflicts(HLRTable *table)