This repository was archived by the owner on Nov 10, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathparse_tree.c
202 lines (169 loc) · 4.82 KB
/
parse_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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
/*
* File: parse_tree.c
* Creator: Adam Kaplan
* Time-stamp: October 19, 2016
* Project 2
*/
#include "parse_tree.h"
/*
Memory allocation functions
*/
TreeNode* tnalloc() {
return (TreeNode*)(malloc(sizeof(TreeNode)));
}
Tree* talloc() {
return (Tree*)(malloc(sizeof(Tree)));
}
/*
Init and free functions
*/
TreeNode* TreeNode_new(BOOL isTerminal, char *label, char *terminal) {
//Allocate the memory for the node
TreeNode *node = tnalloc();
//Set all of the parameters
node->isTerminal = isTerminal;
node->label = label;
node->terminal = terminal;
//Set all of the children to NULL
node->left = NULL;
node->center = NULL;
node->right = NULL;
//Return the node
return node;
}
TreeNode* TreeNode_new_empty() {
TreeNode *node = tnalloc();
//Set all of the children to NULL
node->left = NULL;
node->center = NULL;
node->right = NULL;
return node;
}
Tree* Tree_new(BOOL isTerminal, char *label, char *terminal) {
//Allocate the memory for a tree
Tree *tree = talloc();
//Create the root node
tree->root = TreeNode_new(isTerminal, label, terminal);
//Return the tree
return tree;
}
Tree* Tree_new_empty() {
//Allocate the memory for a tree
Tree *tree = talloc();
//Create the root node
tree->root = NULL;
//Return the tree
return tree;
}
void TreeNode_free(TreeNode *node) {
//Free all of the children
free(node->left);
free(node->center);
free(node->right);
//Free the node itself
free(node);
}
void Tree_free(Tree *tree) {
//Recursively free all of the nodes in the tree
TreeNode_free(tree->root);
//Free the tree itself
free(tree);
}
/*
Pre-functions for adding children
*/
void Tree_addLeftChild(TreeNode *parent, BOOL isTerminal, char *label, char *terminal) {
//Check whether the left node is free, if so put the TreeNode as a child there
if(parent->left == NULL)
parent->left = TreeNode_new(isTerminal, label, terminal);
}
void Tree_addCenterChild(TreeNode *parent, BOOL isTerminal, char *label, char *terminal) {
//Check whether the center node is free, if so put the TreeNode as a child there
if(parent->center == NULL)
parent->center = TreeNode_new(isTerminal, label, terminal);
}
void Tree_addRightChild(TreeNode *parent, BOOL isTerminal, char *label, char *terminal) {
//Check whether the right node is free, if so put the TreeNode as a child there
if(parent->right == NULL)
parent->right = TreeNode_new(isTerminal, label, terminal);
}
void Tree_addLeftSubTree(TreeNode *parent, Tree *tree) {
//Check whether the left node is free, if so put the tree as a child there
if(parent->left == NULL) {
parent->left = tree->root;
}
}
void Tree_addCenterSubTree(TreeNode *parent, Tree *tree) {
//Check whether the center node is free, if so put the tree as a child there
if(parent->center == NULL) {
parent->center = tree->root;
}
}
void Tree_addRightSubTree(TreeNode *parent, Tree *tree) {
//Check whether the right node is free, if so put the tree as a child there
if(parent->right == NULL)
parent->right = tree->root;
}
/*
Actual functions for adding children
*/
void Tree_addChild(TreeNode *parent, BOOL isTerminal, char *label, char *terminal) {
//Check which one of the children are free and add the new node there
if(parent->left == NULL)
Tree_addLeftChild(parent, isTerminal, label, terminal);
else if(parent->center == NULL)
Tree_addCenterChild(parent, isTerminal, label, terminal);
else if(parent->right == NULL)
Tree_addRightChild(parent, isTerminal, label, terminal);
}
void Tree_addChildNode(TreeNode *parent, TreeNode *node) {
//Check which one of the children are free and add the new node there
if(parent->left == NULL)
Tree_addLeftChild(parent, node->isTerminal, node->label, node->terminal);
else if(parent->center == NULL)
Tree_addCenterChild(parent, node->isTerminal, node->label, node->terminal);
else if(parent->right == NULL)
Tree_addRightChild(parent, node->isTerminal, node->label, node->terminal);
}
void Tree_addSubTree(TreeNode *parent, Tree *tree) {
//Check which one of the children are free and add the new tree there
if(parent->left == NULL)
Tree_addLeftSubTree(parent, tree);
else if(parent->center == NULL)
Tree_addCenterSubTree(parent, tree);
else if(parent->right == NULL)
Tree_addRightSubTree(parent, tree);
}
/*
Pre-functions for printing the tree in postorder
*/
void Tree_printFromNode(TreeNode *node, int level) {
for(int i = 0; i < level; i++)
printf("%3c", ' ');
printf("(%s", node->label);
if(node->left != NULL) {
printf("\n");
Tree_printFromNode(node->left, ++level);
}
level--;
if(node->center != NULL) {
printf("\n");
Tree_printFromNode(node->center, ++level);
}
level--;
if(node->right != NULL) {
printf("\n");
Tree_printFromNode(node->right, ++level);
}
level--;
printf(")");
}
/*
Printing the tree in postorder
*/
void Tree_print(Tree *tree) {
if(tree != NULL) {
Tree_printFromNode(tree->root, 0);
printf("\n\n");
}
}