| char rcsid_burs[] = "$Id$"; |
| |
| #include "b.h" |
| |
| Item_Set errorState; |
| |
| static void doLeaf ARGS((Operator)); |
| |
| static void |
| doLeaf(leaf) Operator leaf; |
| { |
| int new; |
| List pl; |
| Item_Set ts; |
| Item_Set tmp; |
| |
| assert(leaf->arity == 0); |
| |
| ts = newItem_Set(leaf->table->relevant); |
| |
| for (pl = rules; pl; pl = pl->next) { |
| Rule p = (Rule) pl->x; |
| if (p->pat->op == leaf) { |
| if (!ts->virgin[p->lhs->num].rule || p->delta < ts->virgin[p->lhs->num].delta) { |
| ts->virgin[p->lhs->num].rule = p; |
| ASSIGNCOST(ts->virgin[p->lhs->num].delta, p->delta); |
| ts->op = leaf; |
| } |
| } |
| } |
| trim(ts); |
| zero(ts); |
| tmp = encode(globalMap, ts, &new); |
| if (new) { |
| closure(ts); |
| leaf->table->transition[0] = ts; |
| addQ(globalQ, ts); |
| } else { |
| leaf->table->transition[0] = tmp; |
| freeItem_Set(ts); |
| } |
| } |
| |
| void |
| build() |
| { |
| int new; |
| List ol; |
| Item_Set ts; |
| |
| globalQ = newQ(); |
| globalMap = newMapping(GLOBAL_MAP_SIZE); |
| |
| ts = newItem_Set(0); |
| errorState = encode(globalMap, ts, &new); |
| ts->closed = ts->virgin; |
| addQ(globalQ, ts); |
| |
| foreachList((ListFn) doLeaf, leaves); |
| |
| debug(debugTables, printf("---initial set of states ---\n")); |
| debug(debugTables, dumpMapping(globalMap)); |
| debug(debugTables, foreachList((ListFn) dumpItem_Set, globalQ->head)); |
| |
| for (ts = popQ(globalQ); ts; ts = popQ(globalQ)) { |
| for (ol = operators; ol; ol = ol->next) { |
| Operator op = (Operator) ol->x; |
| addToTable(op->table, ts); |
| } |
| } |
| } |