summaryrefslogtreecommitdiff
path: root/utils/Burg/burs.c
diff options
context:
space:
mode:
Diffstat (limited to 'utils/Burg/burs.c')
-rw-r--r--utils/Burg/burs.c71
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);
+ }
+ }
+}