forked from GitHub/gf-core
simple cleanup in the robust parser
This commit is contained in:
@@ -109,7 +109,6 @@ struct PgfParsing {
|
|||||||
PgfCCatBuf* completed;
|
PgfCCatBuf* completed;
|
||||||
PgfLexCallback* callback;
|
PgfLexCallback* callback;
|
||||||
PgfItemBuf *lexicon_idx;
|
PgfItemBuf *lexicon_idx;
|
||||||
PgfItemBuf *metas;
|
|
||||||
PgfToken tok;
|
PgfToken tok;
|
||||||
int max_fid;
|
int max_fid;
|
||||||
};
|
};
|
||||||
@@ -763,7 +762,7 @@ pgf_parsing_td_predict(PgfParsing* parsing, PgfItem* item,
|
|||||||
|
|
||||||
static void
|
static void
|
||||||
pgf_parsing_bu_predict(PgfParsing* parsing, PgfItem* item,
|
pgf_parsing_bu_predict(PgfParsing* parsing, PgfItem* item,
|
||||||
PgfItemBuf *agenda)
|
PgfItemBuf* metas, PgfItemBuf* agenda)
|
||||||
{
|
{
|
||||||
PgfItemBuf* conts =
|
PgfItemBuf* conts =
|
||||||
pgf_parsing_get_conts(parsing->conts_map,
|
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);
|
n_items = gu_buf_length(item->base->conts);
|
||||||
for (size_t i = 0; i < n_items; i++) {
|
for (size_t i = 0; i < n_items; i++) {
|
||||||
PgfItem *item_ = gu_buf_get(item->base->conts, PgfItem*, 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++) {
|
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_);
|
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
|
static void
|
||||||
pgf_parsing_item(PgfParsing* parsing, PgfItem* item)
|
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);
|
gu_seq_set(toks, PgfToken, 0, parsing->tok);
|
||||||
prev = item->curr_sym;
|
prev = item->curr_sym;
|
||||||
} else {
|
} else {
|
||||||
PgfTokens old_toks =
|
GuVariantInfo i = gu_variant_open(item->curr_sym);
|
||||||
((PgfSymbolKS*) gu_variant_data(item->curr_sym))->tokens;
|
gu_assert(i.tag == PGF_SYMBOL_KS);
|
||||||
|
PgfTokens old_toks = ((PgfSymbolKS*) i.data)->tokens;
|
||||||
prev = pgf_prev_extern_sym(item->curr_sym);
|
prev = pgf_prev_extern_sym(item->curr_sym);
|
||||||
|
|
||||||
size_t n_toks = gu_seq_length(old_toks);
|
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->lexicon_idx = NULL;
|
||||||
parsing->pool = parse_pool;
|
parsing->pool = parse_pool;
|
||||||
parsing->tmp_pool = out_pool;
|
parsing->tmp_pool = out_pool;
|
||||||
parsing->metas = gu_new_buf(PgfItem*, out_pool);
|
|
||||||
parsing->tok = gu_empty_string;
|
parsing->tok = gu_empty_string;
|
||||||
parsing->max_fid = max_fid;
|
parsing->max_fid = max_fid;
|
||||||
return parsing;
|
return parsing;
|
||||||
@@ -1216,7 +1166,7 @@ pgf_parse_token(PgfParse* parse, PgfToken tok, bool robust, GuPool* pool)
|
|||||||
pgf_parsing_item(parsing, item);
|
pgf_parsing_item(parsing, item);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (robust) {
|
if (robust && gu_buf_length(agenda) == 0) {
|
||||||
PgfProduction prod;
|
PgfProduction prod;
|
||||||
PgfProductionExtern* pext =
|
PgfProductionExtern* pext =
|
||||||
gu_new_variant(PGF_PRODUCTION_EXTERN,
|
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->args = gu_new_seq(PgfPArg, 0, parsing->pool);
|
||||||
pext->callback = &pgf_meta_callback;
|
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);
|
gu_map_iter(parsing->conts_map, &clo2.fn, NULL);
|
||||||
|
|
||||||
if (parsing->lexicon_idx != 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,
|
if (!pgf_parsing_has_conts(parsing->conts_map,
|
||||||
item->base->ccat, item->base->lin_idx)) {
|
item->base->ccat, item->base->lin_idx)) {
|
||||||
pgf_parsing_bu_predict(parsing, item, agenda);
|
pgf_parsing_bu_predict(parsing, item, metas, agenda);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// We have unknown word
|
// We have unknown word
|
||||||
|
size_t n_items = gu_buf_length(metas);
|
||||||
size_t n_items = gu_buf_length(parsing->metas);
|
|
||||||
for (size_t i = 0; i < n_items; i++) {
|
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);
|
||||||
|
pgf_parsing_item(parsing, item);
|
||||||
PgfExprProb *ep;
|
|
||||||
bool accepted;
|
|
||||||
pgf_foo(parsing, item, pext->callback, &ep, &accepted);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user