syntax_tree.c 1.72 KB
Newer Older
lyz's avatar
lyz committed
1 2 3 4 5
#include <stdlib.h>
#include <string.h>

#include "syntax_tree.h"

lxq's avatar
lxq committed
6 7 8 9 10 11 12 13 14
syntax_tree_node *new_syntax_tree_node(const char *name) {
    syntax_tree_node *new_node =
        (syntax_tree_node *)malloc(sizeof(syntax_tree_node));
    if (name)
        strncpy(new_node->name, name, SYNTAX_TREE_NODE_NAME_MAX);
    else
        new_node->name[0] = '\0';
    new_node->children_num = 0;
    return new_node;
lyz's avatar
lyz committed
15 16
}

lxq's avatar
lxq committed
17 18 19 20 21
int syntax_tree_add_child(syntax_tree_node *parent, syntax_tree_node *child) {
    if (!parent || !child)
        return -1;
    parent->children[parent->children_num++] = child;
    return parent->children_num;
lyz's avatar
lyz committed
22 23
}

lxq's avatar
lxq committed
24 25 26
void del_syntax_tree_node(syntax_tree_node *node, int recursive) {
    if (!node)
        return;
lyz's avatar
lyz committed
27

lxq's avatar
lxq committed
28 29 30 31 32 33 34
    int i;
    if (recursive) {
        for (i = 0; i < node->children_num; i++) {
            del_syntax_tree_node(node->children[i], 1);
        }
    }
    free(node);
lyz's avatar
lyz committed
35 36
}

lxq's avatar
lxq committed
37 38
syntax_tree *new_syntax_tree() {
    return (syntax_tree *)malloc(sizeof(syntax_tree));
lyz's avatar
lyz committed
39 40
}

lxq's avatar
lxq committed
41 42 43
void del_syntax_tree(syntax_tree *tree) {
    if (!tree)
        return;
lyz's avatar
lyz committed
44

lxq's avatar
lxq committed
45 46 47 48
    if (tree->root) {
        del_syntax_tree_node(tree->root, 1);
    }
    free(tree);
lyz's avatar
lyz committed
49 50
}

lxq's avatar
lxq committed
51 52
void print_syntax_tree_node(FILE *fout, syntax_tree_node *node, int level) {
    // assume fout valid now
lyz's avatar
lyz committed
53

lxq's avatar
lxq committed
54 55 56 57 58 59 60 61 62 63
    // check if "node" empty pointer
    if (!node)
        return;

    // print myself
    int i;
    for (i = 0; i < level; i++) {
        fprintf(fout, "|  ");
    }
    fprintf(fout, ">--%s %s\n", (node->children_num ? "+" : "*"), node->name);
lyz's avatar
lyz committed
64

lxq's avatar
lxq committed
65 66 67
    for (i = 0; i < node->children_num; i++) {
        print_syntax_tree_node(fout, node->children[i], level + 1);
    }
lyz's avatar
lyz committed
68 69
}

lxq's avatar
lxq committed
70 71 72 73 74 75
void print_syntax_tree(FILE *fout, syntax_tree *tree) {
    if (!fout)
        return;

    print_syntax_tree_node(fout, tree->root, 0);
}