Universität Paderborn - Home Universität Paderborn
Die Universität der Informationsgesellschaft

Compilation Methods SS 2013 - File utils.c

/* shortcut functions to simplify construction of trees */

#define iconst       maketree(1, 0, 0)
#define var          maketree(2, 0, 0)
#define iadd(a, b)   maketree(3, a, b)
#define deref(a)     maketree(4, a, 0)
#define assign(a, b) maketree(5, a, b)

NODEPTR_TYPE maketree (int, NODEPTR_TYPE, NODEPTR_TYPE);
void printcover (NODEPTR_TYPE, int, int);
void printtree (NODEPTR_TYPE);
int treecost (NODEPTR_TYPE, int, int);
void printMatches (NODEPTR_TYPE);
int main (void);

NODEPTR_TYPE maketree(int op, NODEPTR_TYPE left, NODEPTR_TYPE right)
/* create a tree node and connect it to its children */
{
	NODEPTR_TYPE p;

	p = (NODEPTR_TYPE) malloc(sizeof *p);
	p->op = op;
	p->left = left;
	p->right = right;
	return p;
}

void printcover(NODEPTR_TYPE p, int goalnt, int indent)
/* textual output of resulting tree cover with patterns */
{
	int eruleno = burm_rule(STATE_LABEL(p), goalnt);
	short *nts = burm_nts[eruleno];
	NODEPTR_TYPE kids[10];
	int i;
	
	if (eruleno == 0) {
		printf("no cover\n");
		return;
	}
	for (i = 0; i < indent; i++)
		printf(".");
	printf("%s\n", burm_string[eruleno]);
	burm_kids(p, eruleno, kids);
	for (i = 0; nts[i]; i++)
		printcover(kids[i], nts[i], indent+1);
}

void printtree(NODEPTR_TYPE p)
/* textual output of tree */
{
	int op = burm_op_label(p);

	printf("%s", burm_opname[op]);
	switch (burm_arity[op]) {
	case 0:
		break;
	case 1:
		printf("(");
		printtree(burm_child(p, 0));
		printf(")");
		break;
	case 2:
		printf("(");
		printtree(burm_child(p, 0));
		printf(", ");
		printtree(burm_child(p, 1));
		printf(")");
		break;
	}
}

int treecost(NODEPTR_TYPE p, int goalnt, int costindex)
/* compute total cost of tree cover */
{
	int eruleno = burm_rule(STATE_LABEL(p), goalnt);
	int cost = burm_cost[eruleno][costindex], i;
	short *nts = burm_nts[eruleno];
	NODEPTR_TYPE kids[10];

	burm_kids(p, eruleno, kids);
	for (i = 0; nts[i]; i++)
		cost += treecost(kids[i], nts[i], costindex);
	return cost;
}

Generiert mit Camelot | Probleme mit Camelot? | Geändert am: 13.06.2017