+++ /dev/null
-%{
-#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;
-}
-