static CNode * parse_string(CNode * n, char **saveptr) { char *q; CNode *m, *last_child=NULL; while ((q = strtok_r(NULL, " ", saveptr))) { switch (token_type(q)) { case CLOSE_TOK : q[strlen(q)-1]='\0'; assert(strcmp(q, n->label)==0, "Constituent tree: Labels do not match."); return n; break; case OPEN_TOK: m = make_CNode(q+1); m = parse_string(m, saveptr); break; case WORD_TOK: m = make_CNode(q); break; default: assert(0, "Constituent tree: Illegal token type"); } if (n->child == NULL) { last_child = n->child = m; } else { last_child->next = m; last_child = m; } } assert(0, "Constituent tree: Constituent did not close"); return NULL; }
static CNode * linkage_constituent_tree(Linkage linkage) { char *p, *q, *saveptr; int len; CNode * root; p = print_flat_constituents(linkage); len = strlen(p); q = strtok_r(p, " ", &saveptr); assert(token_type(q) == OPEN_TOK, "Illegal beginning of string"); root = make_CNode(q+1); root = parse_string(root, &saveptr); assign_spans(root, 0); exfree(p, sizeof(char)*(len+1)); return root; }