/** @brief Prints node and ALL subnodes in preorder to file @param tree_p Pointer to node @param file File thah will contain nodes @param dump_file File that may contain debug info @return 0 always */ int Node_fprint(Node_t* tree_p, FILE* file, FILE* dump_file) { VALID_NODE(tree_p, "Invalid node in the beginning of Node_fprint", dump_file); assert(file); fprintf(file,"(\"%s\"", tree_p->data); if (tree_p->lft) { Node_fprint(tree_p->lft, file, dump_file); } else { fprintf(file, "(0)"); } if (tree_p->rgt) { Node_fprint(tree_p->rgt, file, dump_file); } else { fprintf(file, "(0)"); } fprintf(file, ")"); VALID_NODE(tree_p, "Invalid node in the end of Node_fprint", dump_file); return 0; }
static void Rule_fprint(FILE *stream, Node *node) { assert(node); assert(Rule == node->type); fprintf(stream, "%s.%d =", node->rule.name, node->rule.id); if (node->rule.expression) Node_fprint(stream, node->rule.expression); else fprintf(stream, " UNDEFINED"); fprintf(stream, " ;\n"); }
static void Node_fprint(FILE *stream, Node *node) { assert(node); switch (node->type) { case Rule: fprintf(stream, " %s", node->rule.name); break; case Variable: fprintf(stream, " %s:", node->variable.name); break; case Name: fprintf(stream, " %s", node->name.rule->rule.name); break; case Dot: fprintf(stream, " ."); break; case Character: fprintf(stream, " '%s'", node->character.value); break; case String: fprintf(stream, " \"%s\"", node->string.value); break; case Class: fprintf(stream, " [%s]", node->cclass.value); break; case Action: fprintf(stream, " { %s }", node->action.text); break; case Predicate: fprintf(stream, " ?{ %s }", node->action.text); break; case Alternate: node= node->alternate.first; fprintf(stream, " ("); Node_fprint(stream, node); while ((node= node->any.next)) { fprintf(stream, " |"); Node_fprint(stream, node); } fprintf(stream, " )"); break; case Sequence: node= node->sequence.first; fprintf(stream, " ("); Node_fprint(stream, node); while ((node= node->any.next)) Node_fprint(stream, node); fprintf(stream, " )"); break; case PeekFor: fprintf(stream, "&"); Node_fprint(stream, node->query.element); break; case PeekNot: fprintf(stream, "!"); Node_fprint(stream, node->query.element); break; case Query: Node_fprint(stream, node->query.element); fprintf(stream, "?"); break; case Star: Node_fprint(stream, node->query.element); fprintf(stream, "*"); break; case Plus: Node_fprint(stream, node->query.element); fprintf(stream, "+"); break; default: fprintf(stream, "\nunknown node type %d\n", node->type); exit(1); } }
void Node_print(Node *node) { Node_fprint(stderr, node); }