#include "rc.h" #include "parse.h" static Tree *nodes; Tree* maketree(void) { Tree *node = emalloc(sizeof(*node)); node->link = nodes; nodes = node; return node; } void freeparsetree(void) { Tree *t, *nt; for(t = nodes; t; t = nt) { nt = t->link; if(t->type == Tword && t->str) efree(t->str); efree(t); } nodes = nil; } Tree* maketree1(int type, Tree *c0) { return maketree2(type, c0, nil); } Tree* maketree2(int type, Tree *c0, Tree *c1) { return maketree3(type, c0, c1, nil); } Tree* maketree3(int type, Tree *c0, Tree *c1, Tree *c2) { Tree *node = maketree(); node->type = type; node->child[0] = c0; node->child[1] = c1; node->child[2] = c2; return node; } Tree* hangchild1(Tree *node, Tree *c, int i) { node->child[i] = c; return node; } Tree* hangchild2(Tree *node, Tree *c1, int i1, Tree *c2, int i2) { node->child[i1] = c1; node->child[i2] = c2; return node; } Tree* hangchild3(Tree *node, Tree *c0, Tree *c1, Tree *c2) { node->child[0] = c0; node->child[1] = c1; node->child[2] = c2; return node; } Tree* hangepilog(Tree *cmd, Tree *epi) { Tree *p; if(!epi) return cmd; for(p = epi; p->child[1]; p = p->child[1]) ; p->child[1] = cmd; return epi; } Tree* token(int type, char *s) { Tree *node = maketree(); node->type = type; node->str = strdup(s); return node; } /* Tree* basic(Tree *node) { return maketree1(Tbasic, node); } */