From c60a019b70e751d30d287f45fb321f80caa267a0 Mon Sep 17 00:00:00 2001 From: "kr.angelov" Date: Mon, 28 Oct 2013 13:54:06 +0000 Subject: [PATCH] another fix for 'pre' --- src/runtime/c/pgf/parser.c | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/src/runtime/c/pgf/parser.c b/src/runtime/c/pgf/parser.c index b857ae7d0..644a0c5d9 100644 --- a/src/runtime/c/pgf/parser.c +++ b/src/runtime/c/pgf/parser.c @@ -1419,6 +1419,22 @@ pgf_parsing_meta_predict(GuMapItor* fn, const void* key, void* value, GuExn* err } } +static void +pgf_parsing_symbol(PgfParsing* ps, PgfItem* item, PgfSymbol sym); + +static void +pgf_parsing_pre(PgfParsing* ps, PgfItem* item, PgfSymbols* syms) +{ + if (item->alt_idx < gu_seq_length(syms)) { + PgfSymbol sym = gu_seq_get(syms, PgfSymbol, item->alt_idx); + pgf_parsing_symbol(ps, item, sym); + } else { + item->alt = 0; + pgf_item_advance(item, ps->pool); + gu_buf_heap_push(ps->before->agenda, pgf_item_prob_order, &item); + } +} + static void pgf_parsing_symbol(PgfParsing* ps, PgfItem* item, PgfSymbol sym) { @@ -1453,8 +1469,7 @@ pgf_parsing_symbol(PgfParsing* ps, PgfItem* item, PgfSymbol sym) new_item = pgf_item_copy(item, ps); new_item->alt = 1; new_item->alt_idx = 0; - sym = gu_seq_get(skp->default_form, PgfSymbol, new_item->alt_idx); - pgf_parsing_symbol(ps, new_item, sym); + pgf_parsing_pre(ps, new_item, skp->default_form); for (size_t i = 0; i < skp->n_forms; i++) { PgfSymbols* syms = skp->forms[i].form; @@ -1468,23 +1483,14 @@ pgf_parsing_symbol(PgfParsing* ps, PgfItem* item, PgfSymbol sym) new_item = pgf_item_copy(item, ps); new_item->alt = i+2; new_item->alt_idx = 0; - sym = gu_seq_get(syms, PgfSymbol, new_item->alt_idx); - pgf_parsing_symbol(ps, new_item, sym); + pgf_parsing_pre(ps, new_item, syms); } } } else { PgfSymbols* syms = (item->alt == 1) ? skp->default_form : skp->forms[item->alt-2].form; - - if (item->alt_idx < gu_seq_length(syms)) { - sym = gu_seq_get(syms, PgfSymbol, item->alt_idx); - pgf_parsing_symbol(ps, item, sym); - } else { - item->alt = 0; - pgf_item_advance(item, ps->pool); - gu_buf_heap_push(ps->before->agenda, pgf_item_prob_order, &item); - } + pgf_parsing_pre(ps, item, syms); } } break;