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);
		}
	}
}