diff options
| author | kr.angelov <kr.angelov@gmail.com> | 2012-10-25 14:42:53 +0000 |
|---|---|---|
| committer | kr.angelov <kr.angelov@gmail.com> | 2012-10-25 14:42:53 +0000 |
| commit | d18593895294b3d2203f7e6fab253f1b5835ff85 (patch) | |
| tree | 8c82ebafdc0a72ec75edc532c4b69cb101811390 /src/runtime/c/pgf/linearize.c | |
| parent | 619c341ee9971bb6f8c263df2e8e84b4e06923ec (diff) | |
a major refactoring in the robust parser: bottom-up filtering and garbage collection for the chart
Diffstat (limited to 'src/runtime/c/pgf/linearize.c')
| -rw-r--r-- | src/runtime/c/pgf/linearize.c | 95 |
1 files changed, 61 insertions, 34 deletions
diff --git a/src/runtime/c/pgf/linearize.c b/src/runtime/c/pgf/linearize.c index e77eb13b9..a8b2c4d60 100644 --- a/src/runtime/c/pgf/linearize.c +++ b/src/runtime/c/pgf/linearize.c @@ -151,47 +151,74 @@ pgf_lzr_add_infer_entry( }; gu_buf_push(entries, PgfLinInferEntry, entry); } - -void -pgf_lzr_index(PgfConcr* concr, PgfCCat* ccat, PgfProduction prod, - GuPool *pool) +typedef struct { + GuMapItor fn; + PgfConcr* concr; + GuPool* pool; +} PgfLzrIndexFn; + +static void +pgf_lzr_index_iter(GuMapItor* fn, const void* key, void* value, GuExn* err) { - void* data = gu_variant_data(prod); - switch (gu_variant_tag(prod)) { - case PGF_PRODUCTION_APPLY: { - PgfProductionApply* papply = data; - PgfInferMap* infer = - gu_map_get(concr->fun_indices, &papply->fun->name, - PgfInferMap*); - gu_debug("index: %s -> %d", papply->fun->name, ccat->fid); - if (!infer) { - infer = gu_map_type_new(PgfInferMap, pool); - gu_map_put(concr->fun_indices, - &papply->fun->name, PgfInferMap*, infer); + (void) (key && err); + + PgfLzrIndexFn* clo = (PgfLzrIndexFn*) fn; + PgfCCat* ccat = *((PgfCCat**) value); + PgfConcr *concr = clo->concr; + GuPool *pool = clo->pool; + + if (gu_seq_is_null(ccat->prods)) + return; + + size_t n_prods = gu_seq_length(ccat->prods); + for (size_t i = 0; i < n_prods; i++) { + PgfProduction prod = gu_seq_get(ccat->prods, PgfProduction, i); + + void* data = gu_variant_data(prod); + switch (gu_variant_tag(prod)) { + case PGF_PRODUCTION_APPLY: { + PgfProductionApply* papply = data; + PgfInferMap* infer = + gu_map_get(concr->fun_indices, &papply->fun->name, + PgfInferMap*); + gu_debug("index: %s -> %d", papply->fun->name, ccat->fid); + if (!infer) { + infer = gu_map_type_new(PgfInferMap, pool); + gu_map_put(concr->fun_indices, + &papply->fun->name, PgfInferMap*, infer); + } + pgf_lzr_add_infer_entry(infer, ccat, papply, pool); + break; } - pgf_lzr_add_infer_entry(infer, ccat, papply, pool); - break; - } - case PGF_PRODUCTION_COERCE: { - PgfProductionCoerce* pcoerce = data; - PgfCCatBuf* cats = gu_map_get(concr->coerce_idx, pcoerce->coerce, - PgfCCatBuf*); - if (!cats) { - cats = gu_new_buf(PgfCCat*, pool); - gu_map_put(concr->coerce_idx, - pcoerce->coerce, PgfCCatBuf*, cats); + case PGF_PRODUCTION_COERCE: { + PgfProductionCoerce* pcoerce = data; + PgfCCatBuf* cats = gu_map_get(concr->coerce_idx, pcoerce->coerce, + PgfCCatBuf*); + if (!cats) { + cats = gu_new_buf(PgfCCat*, pool); + gu_map_put(concr->coerce_idx, + pcoerce->coerce, PgfCCatBuf*, cats); + } + gu_debug("coerce_idx: %d -> %d", pcoerce->coerce->fid, ccat->fid); + gu_buf_push(cats, PgfCCat*, ccat); + break; } - gu_debug("coerce_idx: %d -> %d", pcoerce->coerce->fid, ccat->fid); - gu_buf_push(cats, PgfCCat*, ccat); - break; - } - default: - // Display warning? - break; + default: + // Display warning? + break; + } + } } +void +pgf_lzr_index(PgfConcr* concr, GuPool *pool) +{ + PgfLzrIndexFn clo = { { pgf_lzr_index_iter }, concr, pool }; + gu_map_iter(concr->ccats, &clo.fn, NULL); +} + typedef struct PgfLzn PgfLzn; struct PgfLzn { |
