-
Notifications
You must be signed in to change notification settings - Fork 0
/
node.c
106 lines (95 loc) · 1.3 KB
/
node.c
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
#include "yo.h"
Node*
mkscope(Node *body)
{
Node *n = mkn(Oscope, nil, body);
return n;
}
Node*
mkunray(int op, Node *l)
{
Node *n = mkn(op, l, nil);
return n;
}
Node*
retalloc(Node *n, Node *nn)
{
if(nn->ty == tnone)
return nil;
*n = (Node){0};
n->op = Oxref;
n->addable = Radr;
n->l = dupn(&retnode);
n->ty = nn->ty;
return n;
}
Node*
dupn(Node *n)
{
Node *nn = new(sizeof(Node));
*nn = *n;
if(n->l)
nn->l = dupn(nn->l);
if(n->r)
nn->r = dupn(nn->r);
return nn;
}
void*
new(int s)
{
void *r = calloc(1, s);
assert(r != 0);
return r;
}
Node*
mkn(int op, Node *l, Node *r)
{
Node *n = new(sizeof(Node));
n->op = op;
n->l = l;
n->r = r;
return n;
}
Node*
mksconst(Sym *s)
{
Node *n = mkn(Oconst, NULL, NULL);
n->ty = tstring;
n->decl = mkdecl(Dconst, tstring);
n->decl->sym = s;
return n;
}
Node*
mkbool(int v)
{
Node *n = mkn(Oconst, nil, nil);
n->ty = tbool;
n->val = v != 0;
return n;
}
Node*
mkconst(int v)
{
Node *n = mkn(Oconst, NULL, NULL);
n->ty = tint;
n->val = v;
return n;
}
Node*
mkname(Sym *s)
{
Node *n = mkn(Oname, nil, nil);
if(s->unbound == nil){
s->unbound = mkdecl(Dunbound, nil);
s->unbound->sym = s;
}
n->decl = s->unbound;
return n;
}
Node*
fndecl(Node *n, Type *t, Node *body)
{
Node *fn = mkn(Ofn, n, body);
fn->ty = t;
return fn;
}