summaryrefslogtreecommitdiff
path: root/src/runtime/c
diff options
context:
space:
mode:
Diffstat (limited to 'src/runtime/c')
-rw-r--r--src/runtime/c/pgf/data.h1
-rw-r--r--src/runtime/c/pgf/linearizer.c3
-rw-r--r--src/runtime/c/pgf/parser.c30
-rw-r--r--src/runtime/c/pgf/printer.c4
-rw-r--r--src/runtime/c/pgf/reader.c7
5 files changed, 44 insertions, 1 deletions
diff --git a/src/runtime/c/pgf/data.h b/src/runtime/c/pgf/data.h
index 9bc73dd0a..131201132 100644
--- a/src/runtime/c/pgf/data.h
+++ b/src/runtime/c/pgf/data.h
@@ -167,6 +167,7 @@ typedef enum {
PGF_SYMBOL_KS,
PGF_SYMBOL_KP,
PGF_SYMBOL_BIND,
+ PGF_SYMBOL_SOFT_BIND,
PGF_SYMBOL_NE
} PgfSymbolTag;
diff --git a/src/runtime/c/pgf/linearizer.c b/src/runtime/c/pgf/linearizer.c
index 698bab939..732bce75a 100644
--- a/src/runtime/c/pgf/linearizer.c
+++ b/src/runtime/c/pgf/linearizer.c
@@ -723,7 +723,8 @@ pgf_lzr_linearize_symbols(PgfConcr* concr, PgfCncTreeApp* fapp,
}
break;
}
- case PGF_SYMBOL_BIND: {
+ case PGF_SYMBOL_BIND:
+ case PGF_SYMBOL_SOFT_BIND: {
if ((*fnsp)->symbol_bind) {
(*fnsp)->symbol_bind(fnsp);
}
diff --git a/src/runtime/c/pgf/parser.c b/src/runtime/c/pgf/parser.c
index 46cfe5614..66d77175d 100644
--- a/src/runtime/c/pgf/parser.c
+++ b/src/runtime/c/pgf/parser.c
@@ -145,6 +145,7 @@ pgf_prev_extern_sym(PgfSymbol sym)
case PGF_SYMBOL_VAR:
return *((PgfSymbol*) (((PgfSymbolVar*) i.data)+1));
case PGF_SYMBOL_BIND:
+ case PGF_SYMBOL_SOFT_BIND:
return *((PgfSymbol*) (((PgfSymbolBIND*) i.data)+1));
case PGF_SYMBOL_NE:
return *((PgfSymbol*) (((PgfSymbolNE*) i.data)+1));
@@ -1137,6 +1138,10 @@ pgf_symbols_cmp(GuString* psent, size_t sent_len, BIND_TYPE* pbind, PgfSymbols*
*pbind = BIND_HARD;
break;
}
+ case PGF_SYMBOL_SOFT_BIND: {
+ *pbind = BIND_SOFT;
+ break;
+ }
case PGF_SYMBOL_NE: {
return -2;
}
@@ -1635,6 +1640,31 @@ pgf_parsing_symbol(PgfParsing* ps, PgfItem* item, PgfSymbol sym)
}
break;
}
+ case PGF_SYMBOL_SOFT_BIND: {
+ if (ps->before->start_offset == ps->before->end_offset) {
+ if (ps->before->needs_bind) {
+ PgfParseState* state =
+ pgf_new_parse_state(ps, ps->before->end_offset, BIND_HARD);
+ if (state != NULL) {
+ if (state->next == NULL) {
+ state->viterbi_prob =
+ item->inside_prob+item->conts->outside_prob;
+ }
+
+ pgf_item_advance(item, ps->pool);
+ gu_buf_heap_push(state->agenda, pgf_item_prob_order, &item);
+ } else {
+ pgf_item_free(ps, item);
+ }
+ } else {
+ pgf_item_free(ps, item);
+ }
+ } else {
+ pgf_item_advance(item, ps->pool);
+ gu_buf_heap_push(ps->before->agenda, pgf_item_prob_order, &item);
+ }
+ break;
+ }
default:
gu_impossible();
}
diff --git a/src/runtime/c/pgf/printer.c b/src/runtime/c/pgf/printer.c
index 78c2b74db..8b737266e 100644
--- a/src/runtime/c/pgf/printer.c
+++ b/src/runtime/c/pgf/printer.c
@@ -280,6 +280,10 @@ pgf_print_symbol(PgfSymbol sym, GuOut *out, GuExn *err)
gu_puts("BIND", out, err);
break;
}
+ case PGF_SYMBOL_SOFT_BIND: {
+ gu_puts("SOFT_BIND", out, err);
+ break;
+ }
default:
gu_impossible();
}
diff --git a/src/runtime/c/pgf/reader.c b/src/runtime/c/pgf/reader.c
index 477adc069..c40781e26 100644
--- a/src/runtime/c/pgf/reader.c
+++ b/src/runtime/c/pgf/reader.c
@@ -723,6 +723,13 @@ pgf_read_symbol(PgfReader* rdr)
gu_return_on_exn(rdr->err, gu_null_variant);
break;
}
+ case PGF_SYMBOL_SOFT_BIND: {
+ gu_new_variant(PGF_SYMBOL_SOFT_BIND,
+ PgfSymbolBIND,
+ &sym, rdr->opool);
+ gu_return_on_exn(rdr->err, gu_null_variant);
+ break;
+ }
default:
pgf_read_tag_error(rdr);
}