Made traversal free
This commit is contained in:
@@ -8,7 +8,7 @@ int main(int argc, char *argv[]) {
|
|||||||
mpc_ast_t *ast, *tree, *child, *child_sub, *ast_next;
|
mpc_ast_t *ast, *tree, *child, *child_sub, *ast_next;
|
||||||
mpc_ast_trav_t *trav;
|
mpc_ast_trav_t *trav;
|
||||||
mpc_result_t r;
|
mpc_result_t r;
|
||||||
int index, lb;
|
int index, lb, i;
|
||||||
|
|
||||||
mpca_lang(MPCA_LANG_PREDICTIVE,
|
mpca_lang(MPCA_LANG_PREDICTIVE,
|
||||||
" node : '(' <node> ',' /foo/ ',' <node> ')' | <leaf>;"
|
" node : '(' <node> ',' /foo/ ',' <node> ')' | <leaf>;"
|
||||||
@@ -79,6 +79,8 @@ int main(int argc, char *argv[]) {
|
|||||||
ast_next = mpc_ast_traverse_next(&trav);
|
ast_next = mpc_ast_traverse_next(&trav);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mpc_ast_traverse_free(&trav);
|
||||||
|
|
||||||
printf("Post order tree traversal.\n");
|
printf("Post order tree traversal.\n");
|
||||||
|
|
||||||
trav = mpc_ast_traverse_start(ast, mpc_ast_trav_order_post);
|
trav = mpc_ast_traverse_start(ast, mpc_ast_trav_order_post);
|
||||||
@@ -92,6 +94,23 @@ int main(int argc, char *argv[]) {
|
|||||||
ast_next = mpc_ast_traverse_next(&trav);
|
ast_next = mpc_ast_traverse_next(&trav);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mpc_ast_traverse_free(&trav);
|
||||||
|
|
||||||
|
printf("Partial traversal.\n");
|
||||||
|
|
||||||
|
trav = mpc_ast_traverse_start(ast, mpc_ast_trav_order_post);
|
||||||
|
|
||||||
|
ast_next = mpc_ast_traverse_next(&trav);
|
||||||
|
|
||||||
|
for(i=0; i<2 && ast_next != NULL; i++) {
|
||||||
|
printf("Tag: %s; Contents: %s\n",
|
||||||
|
ast_next->tag,
|
||||||
|
ast_next->contents);
|
||||||
|
ast_next = mpc_ast_traverse_next(&trav);
|
||||||
|
}
|
||||||
|
|
||||||
|
mpc_ast_traverse_free(&trav);
|
||||||
|
|
||||||
/* Clean up and return */
|
/* Clean up and return */
|
||||||
mpc_cleanup(3, Node, Leaf, Input);
|
mpc_cleanup(3, Node, Leaf, Input);
|
||||||
mpc_ast_delete(ast);
|
mpc_ast_delete(ast);
|
||||||
|
11
mpc.c
11
mpc.c
@@ -2933,6 +2933,17 @@ mpc_ast_t *mpc_ast_traverse_next(mpc_ast_trav_t **trav) {
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void mpc_ast_traverse_free(mpc_ast_trav_t **trav) {
|
||||||
|
mpc_ast_trav_t *n_trav;
|
||||||
|
|
||||||
|
/* Go through parents until all are free */
|
||||||
|
while(*trav != NULL) {
|
||||||
|
n_trav = (*trav)->parent;
|
||||||
|
free(*trav);
|
||||||
|
*trav = n_trav;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
mpc_val_t *mpcf_fold_ast(int n, mpc_val_t **xs) {
|
mpc_val_t *mpcf_fold_ast(int n, mpc_val_t **xs) {
|
||||||
|
|
||||||
int i, j;
|
int i, j;
|
||||||
|
2
mpc.h
2
mpc.h
@@ -298,6 +298,8 @@ mpc_ast_trav_t *mpc_ast_traverse_start(mpc_ast_t *ast,
|
|||||||
|
|
||||||
mpc_ast_t *mpc_ast_traverse_next(mpc_ast_trav_t **trav);
|
mpc_ast_t *mpc_ast_traverse_next(mpc_ast_trav_t **trav);
|
||||||
|
|
||||||
|
void mpc_ast_traverse_free(mpc_ast_trav_t **trav);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Warning: This function currently doesn't test for equality of the `state` member!
|
** Warning: This function currently doesn't test for equality of the `state` member!
|
||||||
*/
|
*/
|
||||||
|
Reference in New Issue
Block a user