diff options
| author | kr.angelov <kr.angelov@gmail.com> | 2012-02-18 16:22:40 +0000 |
|---|---|---|
| committer | kr.angelov <kr.angelov@gmail.com> | 2012-02-18 16:22:40 +0000 |
| commit | 47e5e8c9663c35495419ae59ab4d1cd9709ec0e2 (patch) | |
| tree | 2c23b846c5ae78d4417ffbfe7d8fca6a0a695bef /src/runtime/c/pgf/reader.c | |
| parent | aed7cc429afb6dfec2db4599f3f6cdf274fde7a1 (diff) | |
libpgf: now the linearization index is created during the grammar loading which also makes the types PgfLzr and PgfParser redundant.
Diffstat (limited to 'src/runtime/c/pgf/reader.c')
| -rw-r--r-- | src/runtime/c/pgf/reader.c | 31 |
1 files changed, 26 insertions, 5 deletions
diff --git a/src/runtime/c/pgf/reader.c b/src/runtime/c/pgf/reader.c index 400ffee9a..0fd6297ba 100644 --- a/src/runtime/c/pgf/reader.c +++ b/src/runtime/c/pgf/reader.c @@ -655,13 +655,32 @@ pgf_ccat_set_cnccat(PgfCCat* ccat) return ccat->cnccat; } +typedef struct { + GuMapItor fn; + PgfConcr* concr; + GuPool *pool; +} PgfIndexFn; + +void +pgf_lzr_index(PgfConcr* concr, PgfCCat* cat, PgfProduction prod, + GuPool *pool); static void pgf_read_ccat_cb(GuMapItor* fn, const void* key, void* value, GuExn* err) { (void) (key && err); - PgfCCat** ccatp = value; - pgf_ccat_set_cnccat(*ccatp); + PgfIndexFn* clo = (PgfIndexFn*) fn; + PgfCCat* ccat = *((PgfCCat**) value); + + pgf_ccat_set_cnccat(ccat); + + if (!gu_seq_is_null(ccat->prods)) { + 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); + pgf_lzr_index(clo->concr, ccat, prod, clo->pool); + } + } } static void* @@ -684,14 +703,16 @@ pgf_read_new_PgfConcr(GuType* type, PgfReader* rdr, GuPool* pool, GuMapType* ccats_t = gu_type_cast(gu_type(PgfCCatMap), GuMap); concr->ccats = gu_new_int_map(PgfCCat*, &gu_null_struct, pool); + concr->fun_indices = gu_map_type_new(PgfFunIndices, pool); + concr->coerce_idx = gu_map_type_new(PgfCoerceIdx, pool); rdr->curr_ccats = concr->ccats; - pgf_read_into_map(ccats_t, rdr, concr->ccats, rdr->opool); + pgf_read_into_map(ccats_t, rdr, concr->ccats, rdr->opool); concr->cnccats = pgf_read_new(rdr, gu_type(PgfCncCatMap), rdr->opool, NULL); concr->max_fid = pgf_read_int(rdr); - GuMapItor fn = { pgf_read_ccat_cb }; - gu_map_iter(concr->ccats, &fn, NULL); + PgfIndexFn clo = { { pgf_read_ccat_cb }, concr, pool }; + gu_map_iter(concr->ccats, &clo.fn, NULL); return concr; } |
