From 2b643c729baec91d4c51b89135c575dc33d5079a Mon Sep 17 00:00:00 2001 From: petermlm Date: Sun, 17 Apr 2016 00:17:45 +0100 Subject: [PATCH] Made functions to get child nodes of AST by tag --- mpc.c | 32 ++++++++++++++++++++++++++++++++ mpc.h | 5 +++++ 2 files changed, 37 insertions(+) diff --git a/mpc.c b/mpc.c index 9e84a47..e5c350e 100644 --- a/mpc.c +++ b/mpc.c @@ -2776,6 +2776,38 @@ void mpc_ast_print_to(mpc_ast_t *a, FILE *fp) { mpc_ast_print_depth(a, 0, fp); } +int mpc_ast_get_index(mpc_ast_t *ast, char *tag) { + return mpc_ast_get_index_lb(ast, tag, 0); +} + +int mpc_ast_get_index_lb(mpc_ast_t *ast, char *tag, int lb) { + int i; + + for(i=lb; ichildren_num; i++) { + if(strcmp(ast->children[i]->tag, tag) == 0) { + return i; + } + } + + return -1; +} + +mpc_ast_t *mpc_ast_get_child(mpc_ast_t *ast, char *tag) { + return mpc_ast_get_child_lb(ast, tag, 0); +} + +mpc_ast_t *mpc_ast_get_child_lb(mpc_ast_t *ast, char *tag, int lb) { + int i; + + for(i=lb; ichildren_num; i++) { + if(strcmp(ast->children[i]->tag, tag) == 0) { + return ast->children[i]; + } + } + + return NULL; +} + mpc_val_t *mpcf_fold_ast(int n, mpc_val_t **xs) { int i, j; diff --git a/mpc.h b/mpc.h index a9d8a72..02a6b4e 100644 --- a/mpc.h +++ b/mpc.h @@ -276,6 +276,11 @@ void mpc_ast_delete(mpc_ast_t *a); void mpc_ast_print(mpc_ast_t *a); void mpc_ast_print_to(mpc_ast_t *a, FILE *fp); +int mpc_ast_get_index(mpc_ast_t *ast, char *tag); +int mpc_ast_get_index_lb(mpc_ast_t *ast, char *tag, int lb); +mpc_ast_t *mpc_ast_get_child(mpc_ast_t *ast, char *tag); +mpc_ast_t *mpc_ast_get_child_lb(mpc_ast_t *ast, char *tag, int lb); + /* ** Warning: This function currently doesn't test for equality of the `state` member! */