Lingua-CollinsParser

 view release on metacpan or  search on metacpan

lib/Lingua/CollinsParser.xs  view on Meta::CPAN

    CODE:
      RETVAL = DISTVFLAG;
    OUTPUT:
      RETVAL

int
get_npflag ()
    CODE:
      RETVAL = get_treebankoutputflag();
    OUTPUT:
      RETVAL

void
_xs_init (self)
    SV   * self
  CODE:
    {
      PERL_UNUSED_VAR(self);
      mymalloc_init();
      mymalloc_char_init();
    }

int
load_events (self, events_file)
    SV   * self
    char * events_file
  CODE:
    {
      FILE *events = fopen(events_file,"r");
      PERL_UNUSED_VAR(self);
      if (events == NULL)
	croak("Can't read %s: %s", events_file, strerror(errno));
      
      hash_make_table(8000007,&new_hash);
      read_events(events,&new_hash,-1);
      RETVAL = 1;
    }
  OUTPUT:
    RETVAL
      

int
load_grammar (self, grammar_file)
    SV   * self
    char * grammar_file
  CODE:
    {
      PERL_UNUSED_VAR(self);
      effhash_make_table(1000003,&eff_hash);
      read_grammar(grammar_file);
      RETVAL = 1;
    }
  OUTPUT:
    RETVAL

void
parse_sentence (self, words_in, tags_in)
    SV    *self
    SV    *words_in
    SV    *tags_in
  PPCODE:
    {
      int i, j, best, numwords;
      sentence_type *s;
      SV *output, **fetched;
      AV *words, *tags;
      PERL_UNUSED_VAR(self);

      words = unpack_aref(words_in);
      tags = unpack_aref(tags_in);

      numwords = av_len(words)+1;
      if (numwords >= PMAXWORDS)
	croak("Too many words given, maximum is %d", PMAXWORDS);
      if (numwords != av_len(tags)+1)
	croak("%d words given, but %d tags given", numwords, av_len(tags)+1);

      /* Fill the sentence_type struct */
      New(0, s, 1, sentence_type);
      s->nws = numwords;
      for (i=0; i<numwords; i++) {
	fetched = av_fetch(words, i, 0);
	if (fetched == NULL)
	  croak("Word %d was missing unexpectedly", i);
	s->words[i] = SvPV_nolen(*fetched);

	fetched = av_fetch(tags, i, 0);
	if (fetched == NULL)
	  croak("Tag %d was missing unexpectedly", i);
	s->tags[i] = SvPV_nolen(*fetched);
      }
      convert_sentence(s);
      
      /* Parse the sentence */
      pthresh = -5000000;
      reset_prior_hashprobs();
      effhash_newsent(&eff_hash);
      init_chart(GMAXNTS);
      set_current(s);
      
      add_sentence_to_chart(s);
      
      for(i=0;i<s->nws_np;i++)
	for(j=i-1;j>=0;j--)
	  {
	    complete(j,i);
	  }
      
      /* See if there was a decent parse - if not, return an empty
	 list (or the undef value) */
      best = best_parse();
      if (best == -1) {
	if (GIMME_V == G_SCALAR) XSRETURN_UNDEF;
	XSRETURN_EMPTY;
      }
      
      /*       printf("PROB %d %g %d \n", best, edges[best].prob, edges[best].stop); */
      /*       print_edge(best, 0); */
      /* print_edges_flat(best); */
      output = edge_as_tree(best);
      Safefree(s);
      XPUSHs(sv_2mortal(output));
    }

void dump_events_hash (self, file)
    SV    *self
    char  *file
  PPCODE:
    {
      PERL_UNUSED_VAR(self);
      hash_dump(&new_hash, file);
    }

void undump_events_hash (self, file)
    SV    *self
    char  *file
  PPCODE:
    {
      hash_table *my_hash;
      PERL_UNUSED_VAR(self);
      hash_undump(&my_hash, file);
      new_hash.num = my_hash->num;
      new_hash.size = my_hash->size;
      new_hash.table = my_hash->table;
    }



( run in 0.487 second using v1.01-cache-2.11-cpan-5511b514fd6 )