-
Notifications
You must be signed in to change notification settings - Fork 0
/
sample5.brg
114 lines (103 loc) · 2.79 KB
/
sample5.brg
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
%{
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>
static const char *name[] = { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "no-reg" };
static int busy[sizeof(name)];
static int getReg();
enum {INT=1, VAR=2, ADD=3, MUL=4 };
#define STATE_TYPE void*
typedef struct tree {
char op;
int place;
struct tree *kids[2];
STATE_TYPE state_label;
} *NODEPTR_TYPE;
#define OP_LABEL(p) ((p)->op)
#define LEFT_CHILD(p) ((p)->kids[0])
#define RIGHT_CHILD(p) ((p)->kids[1])
#define STATE_LABEL(p) ((p)->state_label)
%}
%term INT=1 VAR=2 ADD=3 MUL=4
%%
reg: INT 1 {
printf(" load %s = %ld\n", name[p->place = getReg()], (long)LEFT_CHILD(p)); }
reg: VAR 1 {
printf(" load %s = %s\n", name[p->place = getReg()], (char*)LEFT_CHILD(p)); }
reg: ADD(reg,reg) 1 {
printf(" add %s = %s + %s\n",
name[p->place=LEFT_CHILD(p)->place],
name[LEFT_CHILD(p)->place],
name[RIGHT_CHILD(p)->place]);
busy[RIGHT_CHILD(p)->place]=0; }
reg: MUL(reg,reg) 1 {
printf(" mul %s = %s * %s\n",
name[p->place=LEFT_CHILD(p)->place],
name[LEFT_CHILD(p)->place],
name[RIGHT_CHILD(p)->place]);
busy[RIGHT_CHILD(p)->place]=0; }
reg: ADD(reg,MUL(reg,reg)) 1 {
printf(" muladd %s = %s * %s + %s\n",
name[p->place=LEFT_CHILD(p)->place],
name[LEFT_CHILD(RIGHT_CHILD(p))->place],
name[RIGHT_CHILD(RIGHT_CHILD(p))->place],
name[LEFT_CHILD(p)->place]);
busy[LEFT_CHILD(RIGHT_CHILD(p))->place] = 0;
busy[RIGHT_CHILD(RIGHT_CHILD(p))->place] = 0; }
reg: ADD(MUL(reg,reg),reg) 1 {
printf(" muladd %s = %s * %s + %s\n",
name[p->place=RIGHT_CHILD(p)->place],
name[LEFT_CHILD(LEFT_CHILD(p))->place],
name[RIGHT_CHILD(LEFT_CHILD(p))->place],
name[RIGHT_CHILD(p)->place]);
busy[LEFT_CHILD(LEFT_CHILD(p))->place] = 0;
busy[RIGHT_CHILD(LEFT_CHILD(p))->place] = 0; }
%%
static int getReg()
{
unsigned int i;
for(i = 0; i < sizeof(busy); i++)
if (busy[i] == 0) {
busy[i] = 1;
return i;
}
fprintf(stderr,"out of registers\n");
return sizeof(busy) + 1;
}
static NODEPTR_TYPE tree(int op, NODEPTR_TYPE l, NODEPTR_TYPE r) {
NODEPTR_TYPE p = (NODEPTR_TYPE)malloc(sizeof *p);
assert(p);
OP_LABEL(p) = op;
LEFT_CHILD(p) = l;
RIGHT_CHILD(p) = r;
STATE_LABEL(p) = 0;
return p;
}
#define treeInt(val) tree(INT,(NODEPTR_TYPE)val,0)
#define treeVar(name) tree(VAR,(NODEPTR_TYPE)name,0)
int main(void) {
NODEPTR_TYPE p;
printf("*** 3 * z + 12 + x * y * 5 + i\n");
p = tree(ADD,
tree(ADD,
tree(ADD,
tree(MUL,
treeInt(3),
treeVar("z")
),
treeInt(12)
),
tree(MUL,
tree(MUL,
treeVar("x"),
treeVar("y")
),
treeInt(5)
)
),
treeVar("i")
);
yyselect(p);
return 0;
}