int sentence_parse(Sentence sent, Parse_Options opts) { int rc; verbosity = opts->verbosity; debug = opts->debug; test = opts->test; sent->num_valid_linkages = 0; /* If the sentence has not yet been split, do so now. * This is for backwards compatibility, for existing programs * that do not explicitly call the splitter. */ if (0 == sent->length) { rc = sentence_split(sent, opts); if (rc) return -1; } /* Check for bad sentence length */ if (MAX_SENTENCE <= sent->length) { prt_error("Error: sentence too long, contains more than %d words\n", MAX_SENTENCE); return -2; } /* Initialize/free any leftover garbage */ free_sentence_disjuncts(sent); /* Is this really needed ??? */ resources_reset_space(opts->resources); if (resources_exhausted(opts->resources)) return 0; /* Expressions were previously set up during the tokenize stage. */ expression_prune(sent); print_time(opts, "Finished expression pruning"); if (opts->use_sat_solver) { sat_parse(sent, opts); } else { chart_parse(sent, opts); } print_time(opts, "Finished parse"); if ((verbosity > 0) && (PARSE_NUM_OVERFLOW < sent->num_linkages_found)) { prt_error("WARNING: Combinatorial explosion! nulls=%zu cnt=%d\n" "Consider retrying the parse with the max allowed disjunct cost set lower.\n" "At the command line, use !cost-max\n", sent->null_count, sent->num_linkages_found); } return sent->num_valid_linkages; }
int sentence_parse(Sentence sent, Parse_Options opts) { int nl; verbosity = opts->verbosity; free_sentence_disjuncts(sent); resources_reset_space(opts->resources); if (resources_exhausted(opts->resources)) { sent->num_valid_linkages = 0; return 0; } expression_prune(sent); print_time(opts, "Finished expression pruning"); prepare_to_parse(sent, opts); init_fast_matcher(sent); init_table(sent); /* A parse set may have been already been built for this sentence, if it was previously parsed. If so we free it up before building another. */ free_parse_set(sent); init_x_table(sent); for (nl = opts->min_null_count; (nl<=opts->max_null_count) && (!resources_exhausted(opts->resources)); ++nl) { sent->null_count = nl; sent->num_linkages_found = parse(sent, sent->null_count, opts); print_time(opts, "Counted parses"); post_process_linkages(sent, opts); if (sent->num_valid_linkages > 0) break; } free_table(sent); free_fast_matcher(sent); print_time(opts, "Finished parse"); return sent->num_valid_linkages; }