int z(LST_Node *node, void *data){ if(lst_node_is_root(node))return 1; LST_String *s1=lst_node_get_string(node,0); const char *p1=lst_string_print(s1); if(!strcmp(p1,"<eos>"))return 1; strcpy(k,p1); puts(p1+lst_node_get_string_length(lst_node_get_parent(node))); return 1; }
void lst_debug_print_tree(LST_STree *tree) { LST_Edge *edge; struct lst_stree_qi *qi, *dummy_qi; TAILQ_HEAD(tailhead, lst_stree_qi) queue; dummy_qi = lst_debug_qi_new(NULL); qi = lst_debug_qi_new(tree->root_node); TAILQ_INIT(&queue); TAILQ_INSERT_HEAD(&queue, qi, entries); TAILQ_INSERT_TAIL(&queue, dummy_qi, entries); while (queue.tqh_first) { qi = queue.tqh_first; TAILQ_REMOVE(&queue, queue.tqh_first, entries); if (qi->node == NULL) { if (queue.tqh_first) { dummy_qi = lst_debug_qi_new(NULL); TAILQ_INSERT_TAIL(&queue, dummy_qi, entries); } continue; } /* Output current node: */ fprintf(stderr, "[%u (%u)", qi->node->id, qi->node->visitors); if (qi->node->suffix_link_node) fprintf(stderr, " -> %u]\n", qi->node->suffix_link_node->id); else fprintf(stderr, "]\n"); /* Now output edge labels and adjacent-node ids: */ if (!qi->node->kids.lh_first) { fprintf(stderr, "\t(leaf)\n"); } else { for (edge = qi->node->kids.lh_first; edge; edge = edge->siblings.le_next) { if (edge->dst_node->kids.lh_first) { fprintf(stderr, "\t'%s' %u (%s)\n", edge->range.string->sclass->print_func(&edge->range), edge->dst_node->id, lst_string_print(edge->range.string)); qi = lst_debug_qi_new(edge->dst_node); TAILQ_INSERT_TAIL(&queue, qi, entries); } else { fprintf(stderr, "\t'%s' [%i] %u%c%c (%s)\n", edge->range.string->sclass->print_func(&edge->range), edge->dst_node->index, edge->dst_node->id, (edge->range.end_index == &edge->range.end_index_local) ? 'l' : 't', (edge->range.end_index == tree->phase) ? 'c' : ' ', lst_string_print(edge->range.string)); } } } } }