Linkage linkage_create(int k, Sentence sent, Parse_Options opts) { Linkage linkage; assert((k < sent->num_linkages_post_processed) && (k >= 0), "index out of range"); /* Using exalloc since this is external to the parser itself. */ linkage = (Linkage) exalloc(sizeof(struct Linkage_s)); linkage->num_words = sent->length; linkage->word = (char **) exalloc(linkage->num_words*sizeof(char *)); linkage->current = 0; linkage->num_sublinkages=0; linkage->sublinkage = NULL; linkage->unionized = FALSE; linkage->sent = sent; linkage->opts = opts; linkage->info = sent->link_info[k]; extract_links(sent->link_info[k].index, sent->null_count, sent->parse_info); compute_chosen_words(sent, linkage); if (set_has_fat_down(sent)) { extract_fat_linkage(sent, opts, linkage); } else { extract_thin_linkage(sent, opts, linkage); } if (sent->dict->postprocessor != NULL) { linkage_post_process(linkage, sent->dict->postprocessor); } return linkage; }
Linkage linkage_create(LinkageIdx k, Sentence sent, Parse_Options opts) { Linkage linkage; if (opts->use_sat_solver) { linkage = sat_create_linkage(k, sent, opts); if (!linkage) return NULL; } else { /* Cannot create a Linkage for a discarded linkage. */ if (sent->num_linkages_post_processed <= k) return NULL; linkage = &sent->lnkages[k]; } /* Perform remaining initialization we haven't done yet...*/ compute_chosen_words(sent, linkage, opts); linkage->is_sent_long = (linkage->num_words >= opts->twopass_length); return linkage; }