%{ #include typedef struct node *NODEPTR_TYPE; struct node { int op, state_label; NODEPTR_TYPE left, right; }; #define OP_LABEL(p) ((p)->op) #define STATE_LABEL(p) ((p)->state_label) #define LEFT_CHILD(p) ((p)->left) #define RIGHT_CHILD(p) ((p)->right) #define PANIC printf %} %start reg %term Assign=1 Constant=2 Fetch=3 Four=4 Mul=5 Plus=6 %% con: Constant = 1 (0); con: Four = 2 (0); addr: con = 3 (0); addr: Plus(con,reg) = 4 (0); addr: Plus(con,Mul(Four,reg)) = 5 (0); reg: Fetch(addr) = 6 (1); reg: Assign(addr,reg) = 7 (1); %% #define Assign 1 #define Constant 2 #define Fetch 3 #define Four 4 #define Mul 5 #define Plus 6 #ifdef __STDC__ #define ARGS(x) x #else #define ARGS(x) () #endif NODEPTR_TYPE buildtree ARGS((int, NODEPTR_TYPE, NODEPTR_TYPE)); void printcover ARGS((NODEPTR_TYPE, int, int)); void printtree ARGS((NODEPTR_TYPE)); int treecost ARGS((NODEPTR_TYPE, int, int)); void printMatches ARGS((NODEPTR_TYPE)); int main ARGS((void)); NODEPTR_TYPE buildtree(op, left, right) int op; NODEPTR_TYPE left; NODEPTR_TYPE right; { NODEPTR_TYPE p; extern void *malloc ARGS((unsigned)); p = (NODEPTR_TYPE) malloc(sizeof *p); p->op = op; p->left = left; p->right = right; return p; } void printcover(p, goalnt, indent) NODEPTR_TYPE p; int goalnt; int indent; { 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(p) NODEPTR_TYPE p; { 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(p, goalnt, costindex) NODEPTR_TYPE p; int goalnt; int costindex; { 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; } void printMatches(p) NODEPTR_TYPE p; { int nt; int eruleno; printf("Node 0x%lx= ", (unsigned long)p); printtree(p); printf(" matched rules:\n"); for (nt = 1; burm_ntname[nt] != (char*)NULL; nt++) if ((eruleno = burm_rule(STATE_LABEL(p), nt)) != 0) printf("\t%s\n", burm_string[eruleno]); } main() { NODEPTR_TYPE p; p = buildtree(Assign, buildtree(Constant, 0, 0), buildtree(Fetch, buildtree(Plus, buildtree(Constant, 0, 0), buildtree(Mul, buildtree(Four, 0, 0), buildtree(Fetch, buildtree(Constant, 0, 0), 0) ) ), 0 ) ); printtree(p); printf("\n\n"); burm_label(p); printcover(p, 1, 0); printf("\nCover cost == %d\n\n", treecost(p, 1, 0)); printMatches(p); return 0; }