summaryrefslogtreecommitdiff
path: root/utils/Burg/burs.c
blob: b4f8b83d00ea2a0ee6a5fce8470f06a7d8d5a9dc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
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);
		}
	}
}