yo-compiler/node.c
2024-11-03 06:24:26 +09:00

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;
}