forked from OSchip/llvm-project
151 lines
3.1 KiB
Plaintext
151 lines
3.1 KiB
Plaintext
%{
|
|
#include <stdio.h>
|
|
|
|
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;
|
|
}
|
|
|