summaryrefslogtreecommitdiff
path: root/src/runtime/c
diff options
context:
space:
mode:
authorkr.angelov <kr.angelov@gmail.com>2013-10-30 12:53:36 +0000
committerkr.angelov <kr.angelov@gmail.com>2013-10-30 12:53:36 +0000
commit042243f08a321cd8ed5918ba94e83f22a8552adb (patch)
treee7c1e17cebe2d7d674f8df54ffda14a829e0ff21 /src/runtime/c
parent122c40bb3b4cc4ca077f00ab3b484ae9066fd2be (diff)
added the linref construction in GF. The PGF version number is now bumped
Diffstat (limited to 'src/runtime/c')
-rw-r--r--src/runtime/c/pgf/data.h1
-rw-r--r--src/runtime/c/pgf/parser.c2
-rw-r--r--src/runtime/c/pgf/printer.c34
-rw-r--r--src/runtime/c/pgf/reader.c46
4 files changed, 75 insertions, 8 deletions
diff --git a/src/runtime/c/pgf/data.h b/src/runtime/c/pgf/data.h
index ea932d111..5b0401764 100644
--- a/src/runtime/c/pgf/data.h
+++ b/src/runtime/c/pgf/data.h
@@ -299,6 +299,7 @@ typedef struct {
struct PgfCCat {
PgfCncCat* cnccat;
PgfCncFuns* lindefs;
+ PgfCncFuns* linrefs;
size_t n_synprods;
PgfProductionSeq* prods;
float viterbi_prob;
diff --git a/src/runtime/c/pgf/parser.c b/src/runtime/c/pgf/parser.c
index 644a0c5d9..0b8fe59dc 100644
--- a/src/runtime/c/pgf/parser.c
+++ b/src/runtime/c/pgf/parser.c
@@ -611,6 +611,8 @@ pgf_parsing_create_completed(PgfParsing* ps, PgfParseState* state,
{
PgfCCat* cat = gu_new_flex(ps->pool, PgfCCat, fin, 1);
cat->cnccat = conts->ccat->cnccat;
+ cat->lindefs = conts->ccat->lindefs;
+ cat->linrefs = conts->ccat->linrefs;
cat->viterbi_prob = viterbi_prob;
cat->fid = ps->max_fid++;
cat->conts = conts;
diff --git a/src/runtime/c/pgf/printer.c b/src/runtime/c/pgf/printer.c
index 9ce74d495..da7c70d7c 100644
--- a/src/runtime/c/pgf/printer.c
+++ b/src/runtime/c/pgf/printer.c
@@ -165,8 +165,32 @@ pgf_print_lindefs(GuMapItor* fn, const void* key, void* value,
}
static void
+pgf_print_linrefs(GuMapItor* fn, const void* key, void* value,
+ GuExn* err)
+{
+ PgfPrintFn* clo = (PgfPrintFn*) fn;
+ int fid = *((int *) key);
+ PgfCCat* ccat = *((PgfCCat**) value);
+ GuOut *out = clo->out;
+
+ if (ccat->linrefs != NULL) {
+ gu_puts(" ",out,err);
+
+ size_t n_linrefs = gu_seq_length(ccat->linrefs);
+ for (size_t i = 0; i < n_linrefs; i++) {
+ if (i > 0) gu_putc(' ', out, err);
+
+ PgfCncFun* fun = gu_seq_get(ccat->linrefs, PgfCncFun*, i);
+ gu_printf(out,err,"F%d",fun->funid);
+ }
+
+ gu_printf(out,err," -> C%d\n",fid);
+ }
+}
+
+static void
pgf_print_cncfun(PgfCncFun *cncfun, PgfSequences* sequences,
- GuOut *out, GuExn *err)
+ GuOut *out, GuExn *err)
{
gu_printf(out,err," F%d := (", cncfun->funid);
@@ -321,6 +345,10 @@ pgf_print_concrete(PgfCId cncname, PgfConcr* concr,
PgfPrintFn clo3 = { { pgf_print_lindefs }, out };
gu_map_iter(concr->ccats, &clo3.fn, err);
+ gu_puts(" linrefs\n", out, err);
+ PgfPrintFn clo4 = { { pgf_print_linrefs }, out };
+ gu_map_iter(concr->ccats, &clo4.fn, err);
+
gu_puts(" lin\n", out, err);
size_t n_funs = gu_seq_length(concr->cncfuns);
for (size_t i = 0; i < n_funs; i++) {
@@ -338,8 +366,8 @@ pgf_print_concrete(PgfCId cncname, PgfConcr* concr,
}
gu_puts(" categories\n", out, err);
- PgfPrintFn clo4 = { { pgf_print_cnccat }, out };
- gu_map_iter(concr->cnccats, &clo4.fn, err);
+ PgfPrintFn clo5 = { { pgf_print_cnccat }, out };
+ gu_map_iter(concr->cnccats, &clo5.fn, err);
gu_puts("}\n", out, err);
}
diff --git a/src/runtime/c/pgf/reader.c b/src/runtime/c/pgf/reader.c
index 41619a0b8..d215f25e1 100644
--- a/src/runtime/c/pgf/reader.c
+++ b/src/runtime/c/pgf/reader.c
@@ -830,6 +830,7 @@ pgf_read_fid(PgfReader* rdr, PgfConcr* concr)
ccat = gu_new(PgfCCat, rdr->opool);
ccat->cnccat = NULL;
ccat->lindefs = NULL;
+ ccat->linrefs = NULL;
ccat->n_synprods = 0;
ccat->prods = NULL;
ccat->viterbi_prob = 0;
@@ -858,7 +859,7 @@ pgf_read_funid(PgfReader* rdr, PgfConcr* concr)
}
static void
-pgf_read_lindefs(PgfReader* rdr, PgfConcr* concr)
+pgf_read_lindefs(PgfReader* rdr, PgfAbsFun* abs_lin_fun, PgfConcr* concr)
{
size_t len = pgf_read_len(rdr);
gu_return_on_exn(rdr->err, );
@@ -872,12 +873,34 @@ pgf_read_lindefs(PgfReader* rdr, PgfConcr* concr)
ccat->lindefs = gu_new_seq(PgfCncFun*, n_funs, rdr->opool);
for (size_t j = 0; j < n_funs; j++) {
PgfCncFun* fun = pgf_read_funid(rdr, concr);
+ fun->absfun = abs_lin_fun;
gu_seq_set(ccat->lindefs, PgfCncFun*, j, fun);
}
}
}
static void
+pgf_read_linrefs(PgfReader* rdr, PgfAbsFun* abs_lin_fun, PgfConcr* concr)
+{
+ size_t len = pgf_read_len(rdr);
+ gu_return_on_exn(rdr->err, );
+
+ for (size_t i = 0; i < len; i++) {
+ PgfCCat* ccat = pgf_read_fid(rdr, concr);
+
+ size_t n_funs = pgf_read_len(rdr);
+ gu_return_on_exn(rdr->err, );
+
+ ccat->linrefs = gu_new_seq(PgfCncFun*, n_funs, rdr->opool);
+ for (size_t j = 0; j < n_funs; j++) {
+ PgfCncFun* fun = pgf_read_funid(rdr, concr);
+ fun->absfun = abs_lin_fun;
+ gu_seq_set(ccat->linrefs, PgfCncFun*, j, fun);
+ }
+ }
+}
+
+static void
pgf_read_parg(PgfReader* rdr, PgfConcr* concr, PgfPArg* parg)
{
size_t n_hoas = pgf_read_len(rdr);
@@ -1000,6 +1023,7 @@ pgf_read_cnccat(PgfReader* rdr, PgfAbstr* abstr, PgfConcr* concr, PgfCId name)
ccat = gu_new(PgfCCat, rdr->opool);
ccat->cnccat = NULL;
ccat->lindefs = NULL;
+ ccat->linrefs = NULL;
ccat->n_synprods = 0;
ccat->prods = NULL;
ccat->viterbi_prob = 0;
@@ -1123,7 +1147,7 @@ pgf_read_ccat_cb(GuMapItor* fn, const void* key, void* value, GuExn* err)
}
static PgfConcr*
-pgf_read_concrete(PgfReader* rdr, PgfAbstr* abstr)
+pgf_read_concrete(PgfReader* rdr, PgfAbstr* abstr, PgfAbsFun* abs_lin_fun)
{
PgfConcr* concr = gu_new(PgfConcr, rdr->opool);
@@ -1153,7 +1177,8 @@ pgf_read_concrete(PgfReader* rdr, PgfAbstr* abstr)
gu_new_int_map(PgfCCat*, &gu_null_struct, rdr->opool);
concr->fun_indices = gu_map_type_new(PgfCncFunOverloadMap, rdr->opool);
concr->coerce_idx = gu_map_type_new(PgfCncOverloadMap, rdr->opool);
- pgf_read_lindefs(rdr, concr);
+ pgf_read_lindefs(rdr, abs_lin_fun, concr);
+ pgf_read_linrefs(rdr, abs_lin_fun, concr);
pgf_read_ccats(rdr, concr);
concr->cnccats = pgf_read_cnccats(rdr, abstr, concr);
concr->callbacks = pgf_new_callbacks_map(concr, rdr->opool);
@@ -1177,10 +1202,21 @@ pgf_read_concretes(PgfReader* rdr, PgfAbstr* abstr)
size_t len = pgf_read_len(rdr);
gu_return_on_exn(rdr->err, NULL);
+ PgfAbsFun* abs_lin_fun = gu_new(PgfAbsFun, rdr->opool);
+ abs_lin_fun->name = "_";
+ abs_lin_fun->type = gu_new(PgfType, rdr->opool);
+ abs_lin_fun->type->hypos = NULL;
+ abs_lin_fun->type->cid = "_";
+ abs_lin_fun->type->n_exprs = 0;
+ abs_lin_fun->arity = 0;
+ abs_lin_fun->defns = NULL;
+ abs_lin_fun->ep.prob = INFINITY;
+ abs_lin_fun->ep.expr = gu_null_variant;
+
for (size_t i = 0; i < len; i++) {
- PgfConcr* concr = pgf_read_concrete(rdr, abstr);
+ PgfConcr* concr = pgf_read_concrete(rdr, abstr, abs_lin_fun);
gu_return_on_exn(rdr->err, NULL);
-
+
gu_map_put(concretes, concr->name, PgfConcr*, concr);
}