diff --git a/src/runtime/c/pgf/parser.c b/src/runtime/c/pgf/parser.c index 9b9496345..bcf6d2c92 100644 --- a/src/runtime/c/pgf/parser.c +++ b/src/runtime/c/pgf/parser.c @@ -109,7 +109,6 @@ struct PgfParsing { PgfCCatBuf* completed; PgfLexCallback* callback; PgfItemBuf *lexicon_idx; - PgfItemBuf *metas; PgfToken tok; int max_fid; }; @@ -763,7 +762,7 @@ pgf_parsing_td_predict(PgfParsing* parsing, PgfItem* item, static void pgf_parsing_bu_predict(PgfParsing* parsing, PgfItem* item, - PgfItemBuf *agenda) + PgfItemBuf* metas, PgfItemBuf* agenda) { PgfItemBuf* conts = pgf_parsing_get_conts(parsing->conts_map, @@ -781,12 +780,12 @@ pgf_parsing_bu_predict(PgfParsing* parsing, PgfItem* item, n_items = gu_buf_length(item->base->conts); for (size_t i = 0; i < n_items; i++) { PgfItem *item_ = gu_buf_get(item->base->conts, PgfItem*, i); - pgf_parsing_bu_predict(parsing, item_, conts); + pgf_parsing_bu_predict(parsing, item_, metas, conts); } - n_items = gu_buf_length(parsing->metas); + n_items = gu_buf_length(metas); for (size_t i = 0; i < n_items; i++) { - PgfItem *item_ = gu_buf_get(parsing->metas, PgfItem*, i); + PgfItem *item_ = gu_buf_get(metas, PgfItem*, i); gu_buf_push(conts, PgfItem*, item_); } } @@ -935,55 +934,6 @@ pgf_parsing_symbol(PgfParsing* parsing, PgfItem* item, PgfSymbol sym) { } } -static void -pgf_foo(PgfParsing* parsing, PgfItem* item, - PgfLiteralCallback* callback, - PgfExprProb** out_ep, - bool* out_accepted) -{ - PgfTokens toks; - if (gu_variant_is_null(item->curr_sym)) { - toks = gu_new_seq(PgfToken, 1, parsing->pool); - gu_seq_set(toks, PgfToken, 0, parsing->tok); - } else { - GuVariantInfo i = gu_variant_open(item->curr_sym); - gu_assert(i.tag == PGF_SYMBOL_KS); - PgfTokens old_toks = ((PgfSymbolKS*) i.data)->tokens; - - size_t n_toks = gu_seq_length(old_toks); - toks = gu_new_seq(PgfToken, n_toks+1, parsing->pool); - for (size_t i = 0; i < n_toks; i++) { - gu_seq_set(toks, PgfToken, i, - gu_seq_get(old_toks, PgfToken, i)); - } - gu_seq_set(toks, PgfToken, n_toks, parsing->tok); - } - - PgfExprProb *ep = NULL; - bool accepted = - callback->match(callback, - item->base->lin_idx, toks, &ep, - parsing->pool); - - if (accepted) { - if (gu_variant_is_null(item->curr_sym)) - item->seq_idx = 1; - - PgfSymbolKS* sks = (PgfSymbolKS*) - gu_alloc_variant(PGF_SYMBOL_KS, - sizeof(PgfSymbolKS)+sizeof(PgfSymbol), - gu_alignof(PgfSymbolKS), - &item->curr_sym, parsing->pool); - *((PgfSymbol*)(sks+1)) = gu_null_variant; - sks->tokens = toks; - - pgf_parsing_add_transition(parsing, parsing->tok, item); - } - - *out_ep = ep; - *out_accepted = accepted; -} - static void pgf_parsing_item(PgfParsing* parsing, PgfItem* item) { @@ -1051,8 +1001,9 @@ pgf_parsing_item(PgfParsing* parsing, PgfItem* item) gu_seq_set(toks, PgfToken, 0, parsing->tok); prev = item->curr_sym; } else { - PgfTokens old_toks = - ((PgfSymbolKS*) gu_variant_data(item->curr_sym))->tokens; + GuVariantInfo i = gu_variant_open(item->curr_sym); + gu_assert(i.tag == PGF_SYMBOL_KS); + PgfTokens old_toks = ((PgfSymbolKS*) i.data)->tokens; prev = pgf_prev_extern_sym(item->curr_sym); size_t n_toks = gu_seq_length(old_toks); @@ -1108,7 +1059,6 @@ pgf_new_parsing(PgfConcr* concr, PgfLexCallback* callback, int max_fid, parsing->lexicon_idx = NULL; parsing->pool = parse_pool; parsing->tmp_pool = out_pool; - parsing->metas = gu_new_buf(PgfItem*, out_pool); parsing->tok = gu_empty_string; parsing->max_fid = max_fid; return parsing; @@ -1216,7 +1166,7 @@ pgf_parse_token(PgfParse* parse, PgfToken tok, bool robust, GuPool* pool) pgf_parsing_item(parsing, item); } - if (robust) { + if (robust && gu_buf_length(agenda) == 0) { PgfProduction prod; PgfProductionExtern* pext = gu_new_variant(PGF_PRODUCTION_EXTERN, @@ -1226,7 +1176,8 @@ pgf_parse_token(PgfParse* parse, PgfToken tok, bool robust, GuPool* pool) pext->args = gu_new_seq(PgfPArg, 0, parsing->pool); pext->callback = &pgf_meta_callback; - PgfGetMetaFn clo2 = { { pgf_parsing_get_metas }, prod, parsing->metas, pool }; + PgfItemBuf *metas = gu_new_buf(PgfItem*, parsing->pool); + PgfGetMetaFn clo2 = { { pgf_parsing_get_metas }, prod, metas, pool }; gu_map_iter(parsing->conts_map, &clo2.fn, NULL); if (parsing->lexicon_idx != NULL) { @@ -1236,19 +1187,15 @@ pgf_parse_token(PgfParse* parse, PgfToken tok, bool robust, GuPool* pool) if (!pgf_parsing_has_conts(parsing->conts_map, item->base->ccat, item->base->lin_idx)) { - pgf_parsing_bu_predict(parsing, item, agenda); + pgf_parsing_bu_predict(parsing, item, metas, agenda); } } } else { // We have unknown word - - size_t n_items = gu_buf_length(parsing->metas); + size_t n_items = gu_buf_length(metas); for (size_t i = 0; i < n_items; i++) { - PgfItem* item = gu_buf_get(parsing->metas, PgfItem*, i); - - PgfExprProb *ep; - bool accepted; - pgf_foo(parsing, item, pext->callback, &ep, &accepted); + PgfItem* item = gu_buf_get(metas, PgfItem*, i); + pgf_parsing_item(parsing, item); } } }