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 )