diff options
Diffstat (limited to 'utils/Burg/burs.c')
-rw-r--r-- | utils/Burg/burs.c | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/utils/Burg/burs.c b/utils/Burg/burs.c new file mode 100644 index 0000000000..b4f8b83d00 --- /dev/null +++ b/utils/Burg/burs.c @@ -0,0 +1,71 @@ +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); + } + } +} |