2 tre-ast.c - Abstract syntax tree (AST) routines
4 This software is released under a BSD-style license.
5 See the file LICENSE for details and copyright.
11 #endif /* HAVE_CONFIG_H */
18 tre_ast_new_node(tre_mem_t mem, tre_ast_type_t type, size_t size)
22 node = tre_mem_calloc(mem, sizeof(*node));
25 node->obj = tre_mem_calloc(mem, size);
30 node->submatch_id = -1;
36 tre_ast_new_literal(tre_mem_t mem, int code_min, int code_max, int position)
41 node = tre_ast_new_node(mem, LITERAL, sizeof(tre_literal_t));
45 lit->code_min = code_min;
46 lit->code_max = code_max;
47 lit->position = position;
53 tre_ast_new_iter(tre_mem_t mem, tre_ast_node_t *arg, int min, int max,
57 tre_iteration_t *iter;
59 node = tre_ast_new_node(mem, ITERATION, sizeof(tre_iteration_t));
66 iter->minimal = minimal;
67 node->num_submatches = arg->num_submatches;
73 tre_ast_new_union(tre_mem_t mem, tre_ast_node_t *left, tre_ast_node_t *right)
77 node = tre_ast_new_node(mem, UNION, sizeof(tre_union_t));
80 ((tre_union_t *)node->obj)->left = left;
81 ((tre_union_t *)node->obj)->right = right;
82 node->num_submatches = left->num_submatches + right->num_submatches;
88 tre_ast_new_catenation(tre_mem_t mem, tre_ast_node_t *left,
89 tre_ast_node_t *right)
93 node = tre_ast_new_node(mem, CATENATION, sizeof(tre_catenation_t));
96 ((tre_catenation_t *)node->obj)->left = left;
97 ((tre_catenation_t *)node->obj)->right = right;
98 node->num_submatches = left->num_submatches + right->num_submatches;
106 tre_findent(FILE *stream, int i)
113 tre_print_params(int *params)
118 DPRINT(("params ["));
119 for (i = 0; i < TRE_PARAM_LAST; i++)
121 if (params[i] == TRE_PARAM_UNSET)
123 else if (params[i] == TRE_PARAM_DEFAULT)
126 DPRINT(("%d", params[i]));
127 if (i < TRE_PARAM_LAST - 1)
135 tre_do_print(FILE *stream, tre_ast_node_t *ast, int indent)
137 int code_min, code_max, pos;
138 int num_tags = ast->num_tags;
140 tre_iteration_t *iter;
142 tre_findent(stream, indent);
147 code_min = lit->code_min;
148 code_max = lit->code_max;
152 fprintf(stream, "literal empty\n");
154 else if (IS_ASSERTION(lit))
157 char *assertions[] = { "bol", "eol", "bracket",
158 "bow", "eow", "wb", "!wb", "backref" };
159 if (code_max >= ASSERT_LAST << 1)
161 fprintf(stream, "assertions: ");
162 for (i = 0; (1 << i) <= ASSERT_LAST; i++)
163 if (code_max & (1 << i))
164 fprintf(stream, "%s ", assertions[i]);
165 fprintf(stream, "\n");
167 else if (IS_TAG(lit))
169 fprintf(stream, "tag %d\n", code_max);
171 else if (IS_BACKREF(lit))
173 fprintf(stream, "backref %d, pos %d\n", code_max, pos);
175 else if (IS_PARAMETER(lit))
177 tre_print_params(lit->u.params);
178 fprintf(stream, "\n");
182 fprintf(stream, "literal (%c, %c) (%d, %d), pos %d, sub %d, "
183 "%d tags\n", code_min, code_max, code_min, code_max, pos,
184 ast->submatch_id, num_tags);
189 fprintf(stream, "iteration {%d, %d}, sub %d, %d tags, %s\n",
190 iter->min, iter->max, ast->submatch_id, num_tags,
191 iter->minimal ? "minimal" : "greedy");
192 tre_do_print(stream, iter->arg, indent + 2);
195 fprintf(stream, "union, sub %d, %d tags\n", ast->submatch_id, num_tags);
196 tre_do_print(stream, ((tre_union_t *)ast->obj)->left, indent + 2);
197 tre_do_print(stream, ((tre_union_t *)ast->obj)->right, indent + 2);
200 fprintf(stream, "catenation, sub %d, %d tags\n", ast->submatch_id,
202 tre_do_print(stream, ((tre_catenation_t *)ast->obj)->left, indent + 2);
203 tre_do_print(stream, ((tre_catenation_t *)ast->obj)->right, indent + 2);
212 tre_ast_fprint(FILE *stream, tre_ast_node_t *ast)
214 tre_do_print(stream, ast, 0);
218 tre_ast_print(tre_ast_node_t *tree)
221 tre_ast_fprint(stdout, tree);
224 #endif /* TRE_DEBUG */