diff options
Diffstat (limited to 'llvm/utils/Burg/sample.gr')
| -rw-r--r-- | llvm/utils/Burg/sample.gr | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/llvm/utils/Burg/sample.gr b/llvm/utils/Burg/sample.gr new file mode 100644 index 00000000000..e1f7283b6d6 --- /dev/null +++ b/llvm/utils/Burg/sample.gr @@ -0,0 +1,150 @@ +%{ +#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; +} + |

