106 lines
1.3 KiB
C
106 lines
1.3 KiB
C
#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;
|
|
} |