summaryrefslogtreecommitdiff
path: root/src/runtime/c/pgf/linearize.c
diff options
context:
space:
mode:
authorkr.angelov <kr.angelov@gmail.com>2012-10-25 14:42:53 +0000
committerkr.angelov <kr.angelov@gmail.com>2012-10-25 14:42:53 +0000
commitd18593895294b3d2203f7e6fab253f1b5835ff85 (patch)
tree8c82ebafdc0a72ec75edc532c4b69cb101811390 /src/runtime/c/pgf/linearize.c
parent619c341ee9971bb6f8c263df2e8e84b4e06923ec (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.c95
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 {