summaryrefslogtreecommitdiffstats
path: root/llvm/utils/Burg/sample.gr
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/utils/Burg/sample.gr')
-rw-r--r--llvm/utils/Burg/sample.gr150
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;
+}
+
OpenPOWER on IntegriCloud