/* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". * * Author: Ceriel J.H. Jacobs */ /* N O D E O F A N A B S T R A C T P A R S E T R E E */ /* $Header$ */ #include "debug.h" #include #include #include #include #include "LLlex.h" #include "def.h" #include "type.h" #include "node.h" t_node * MkNode(class, left, right, token) t_node *left, *right; t_token *token; { /* Create a node and initialize it with the given parameters */ register t_node *nd = new_node(); nd->nd_left = left; nd->nd_right = right; nd->nd_token = *token; nd->nd_class = class; return nd; } t_node * dot2node(class, left, right) t_node *left, *right; { return MkNode(class, left, right, &dot); } t_node * MkLeaf(class, token) t_token *token; { register t_node *nd = new_node(); nd->nd_token = *token; nd->nd_class = class; return nd; } t_node * dot2leaf(class) { return MkLeaf(class, &dot); } FreeLR(nd) register t_node *nd; { FreeNode(nd->nd_left); FreeNode(nd->nd_right); nd->nd_left = nd->nd_right = 0; } FreeNode(nd) register t_node *nd; { /* Put nodes that are no longer needed back onto the free list */ if (!nd) return; FreeLR(nd); free_node(nd); } NodeCrash(expp) t_node *expp; { crash("Illegal node %d", expp->nd_class); } #ifdef DEBUG extern char *symbol2str(); indnt(lvl) { while (lvl--) { print(" "); } } printnode(nd, lvl) register t_node *nd; { indnt(lvl); print("Class: %d; Symbol: %s\n", nd->nd_class, symbol2str(nd->nd_symb)); if (nd->nd_type) { indnt(lvl); print("Type: "); DumpType(nd->nd_type); print("\n"); } } PrNode(nd, lvl) register t_node *nd; { if (! nd) { indnt(lvl); print("\n"); return; } printnode(nd, lvl); PrNode(nd->nd_left, lvl + 1); PrNode(nd->nd_right, lvl + 1); } #endif DEBUG