PNode funcs

This commit is contained in:
corey 2023-11-16 12:32:55 -06:00
parent 8cc32f8ab6
commit 506eb67e3b
5 changed files with 39 additions and 24 deletions

6
mem.c
View File

@ -4,9 +4,9 @@ Var var_new(void)
{
Var v={
.name=NULL,
.type=I32,
.location=STACK,
.regnum=0,
/* .type=I32, */
/* .location=STACK, */
/* .regnum=0, */
};
return v;
}

13
mem.h
View File

@ -40,12 +40,19 @@ typedef union Mem
typedef struct Var
{
char*name;
VTYPE type;
VLOC location;
size_t regnum; // REG: which register?
// VTYPE type;
// VLOC location;
// size_t regnum; // REG: which register?
size_t stackloc; // STACK: rsp-???
} Var;
// Variable descriptor
typedef struct Func
{
char*name;
// VTYPE type;
} Func;
Var var_new(void);
void var_free(Var*v);
void var_set_fromtoken(Var*v,Tok*t);

37
pnode.c
View File

@ -26,9 +26,10 @@ void parser_free(Parser*p)
PNode pnode_new(void)
{
PNode n={
.pnodes=vec_new(sizeof(PNode)), // Empty Vec
.tokens=vec_new(sizeof(Tok)), // Empty Vec
.vars=vec_new(sizeof(Var)), // Empty Vec
.pnodes=vec_new(sizeof(PNode)),
.tokens=vec_new(sizeof(Tok)),
.vars=vec_new(sizeof(Var)),
.funcs=vec_new(sizeof(Func)),
.parentnode=NULL,
.type=PEMPTY,
.firstline=0,
@ -42,27 +43,33 @@ void pnode_free(PNode*n)
{
if(!n)return;
for(size_t i=0;i<n->pnodes.size;++i)
pnode_free(vec_at(&n->pnodes,i,PNode*));
if(n->pnodes.buffer)
{
pnode_free(vec_at(&n->pnodes,0,PNode*));
vec_free(&n->pnodes);
}
if(n->tokens.buffer)
{
for(size_t i=0;i<n->tokens.size;++i)
tok_free(vec_at(&n->tokens,i,Tok*));
vec_free(&n->tokens);
}
vec_free(&n->tokens);
if(n->vars.buffer)
{
var_free(vec_at(&n->vars,0,Var*));
vec_free(&n->vars);
for(size_t i=0;i<n->vars.size;++i)
var_free(vec_at(&n->vars,i,Var*));
}
vec_free(&n->vars);
if(n->funcs.buffer)
{
for(size_t i=0;i<n->funcs.size;++i)
var_free(vec_at(&n->funcs,i,Var*));
}
vec_free(&n->funcs);
if(n->funcs.buffer)
vec_free(&n->funcs);
for(size_t i=0;i<n->pnodes.size;++i)
pnode_free(vec_at(&n->pnodes,i,PNode*));
vec_free(&n->pnodes);
}

View File

@ -32,6 +32,7 @@ typedef struct PNode
Vec tokens;
Vec pnodes;
Vec vars;
Vec funcs;
uint32_t type;
size_t firstline;
size_t stacksize;

View File

@ -68,9 +68,9 @@ void gen_x86_64(Gen*gen,const PNode*pn,FILE*file)
((PNode*)gen->stackptr)->stacksize+=4;
Var var={
.name=vec_at(&pn->tokens,0,const Tok*)->str.buffer,
.type=I32,
.location=STACK,
.regnum=0,
/* .type=I32, */
/* .location=STACK, */
/* .regnum=0, */
.stackloc=gen->stackptr->stacksize,
};
vec_push((Vec*)&gen->stackptr->vars,&var);