#include #include #include #include "ltree.h" static const char* node_type(tree* t); void release_tree(tree* t) { if (t == NULL) return; if (t->right != NULL) release_tree(t->right); if (t->left != NULL) release_tree(t->left); release_node(t); } tree* allocate_node() { tree* t = (tree*) malloc(sizeof(tree)); memset(t, 0, sizeof(tree)); return t; } void release_node(tree *node) { if (node != NULL) free(node); } void print_tree(tree* t, int level) { int i; if (t == NULL) return; for (i = 0; i < level; ++i) printf(" "); if (t->type == NAME_NODE) { printf( "%s \"%s\"\n", node_type(t), t->name ); } else if (t->type == ICON_NODE) { printf( "%s %d\n", node_type(t), t->int_value ); } else { printf( "%s\n", node_type(t) ); } if (t->left != NULL) print_tree(t->left, level+1); if (t->right != NULL) print_tree(t->right, level+1); } static const char* node_type(tree* t) { const char *type = "NULL"; if (t == NULL) return type; switch (t->type) { case NAME_NODE: type = "NAME_NODE"; break; case ICON_NODE: type = "ICON_NODE"; break; case EXPR_NODE: type = "EXPR_NODE"; break; case LNOT_NODE: type = "LNOT_NODE"; break; case LAND_NODE: type = "LAND_NODE"; break; case LOR_NODE: type = "LOR_NODE"; break; case EQUOP_NODE: type = "EQUOP_NODE"; break; case RELOP_NODE: type = "RELOP_NODE"; break; }; return type; } static char value[256]; const char* node_value(tree *t) { value[0] = 0; if (t->type == NAME_NODE) return t->name; if (t->type == ICON_NODE) sprintf(value, "%d", t->int_value); return value; }