-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathTree.c
84 lines (76 loc) · 2.22 KB
/
Tree.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include <stdio.h>
#include "Tree.h"
Tree *TreeNew(char *tag) {
Tree *rzTree = ObjNew(Tree, 1);
rzTree->tag = tag;
rzTree->childs = NULL;
return rzTree;
}
/*
void NodeFree(Tree *node) {
if (node->tag == STRUCT) {
SemStruct *sem = node->sem;
Struct *stru = sem->stru;
StructFree(stru);
} else if (node->tag == METHOD) {
SemMethod *sem = node->sem;
Struct *method = sem->method;
MethodFree(method);
} else if (node->tag == DECL) {
SemDecl *sem = node->sem;
Decl *decl = sem->decl;
DeclFree(decl);
}
ObjFree(node->sem);
}
*/
void TreeFree(Tree *tree) {
if (tree == NULL) return;
if (tree->childs != NULL) {
int i;
for (i=0; i<tree->childs->count; i++) {
TreeFree(tree->childs->item[i]);
}
ArrayFree(tree->childs, NULL);
}
ObjFree(tree->sem);
ObjFree(tree);
}
void TreeAddChild(Tree *tree, Tree *child) { // 在樹中加入一個新的子樹。
ASSERT(tree != NULL && child != NULL);
if (tree->childs == NULL)
tree->childs = ArrayNew(1);
ArrayAdd(tree->childs, child);
}
void TreePrintLevel(Tree *tree, int level) { // 將該樹列印出來。
ASSERT(tree != NULL && tree->tag != NULL);
// printf("address of tree->type=%d, tree->token=%d\n", tree->type, tree->token);
char spaces[MAX_LEN];
ASSERT(level < MAX_LEN);
strFill(spaces, ' ', level);
if (tree->childs == NULL) {
printf("%s+%s:%s:%s\n", spaces, tree->tag, token(tree), strNoNull(tree->type)); // Terminal
} else {
printf("%s+%s:%s\n", spaces, tree->tag, strNoNull(tree->type));
int i;
for (i=0; i<tree->childs->count; i++)
TreePrintLevel(tree->childs->item[i], level + 1);
printf("%s-%s\n", spaces, tree->tag);
}
}
void TreePrint(Tree *tree) {
TreePrintLevel(tree, 0);
}
Tree* child(Tree *node, int i) {
if (node->childs == NULL)
return NULL;
if (i>=0 && i<node->childs->count)
return node->childs->item[i];
else if (i<0 && i>-1*node->childs->count) {
return node->childs->item[node->childs->count+i];
}
return NULL;
}
void debugNode(Tree *node) {
debug("tag=%s type=%s\n", node->tag, node->type);
}