diff options
Diffstat (limited to 'src/runtime/c')
| -rw-r--r-- | src/runtime/c/pgf/linearizer.c | 248 | ||||
| -rw-r--r-- | src/runtime/c/pgf/linearizer.h | 15 |
2 files changed, 92 insertions, 171 deletions
diff --git a/src/runtime/c/pgf/linearizer.c b/src/runtime/c/pgf/linearizer.c index 2284b10dd..12b047b13 100644 --- a/src/runtime/c/pgf/linearizer.c +++ b/src/runtime/c/pgf/linearizer.c @@ -130,13 +130,6 @@ pgf_print_cnc_tree(PgfCncTree ctree, GuOut* out, GuExn* err) if (clit->n_vars > 0) gu_putc(')', out, err); break; } - case PGF_CNC_TREE_LINDEF: { - PgfCncTreeLinDef* clindef = ti.data; - gu_putc('(', out, err); - pgf_print_cnc_tree_vars(clindef->n_vars, clindef->context, out, err); - gu_printf(out, err, "F%d[%s] %s)", clindef->fun->funid, clindef->str); - break; - } case GU_VARIANT_NULL: gu_puts("null", out, err); break; @@ -182,8 +175,9 @@ redo:; gu_buf_get(buf, PgfProductionApply*, index); gu_assert(n_args == gu_seq_length(papply->args)); - capp->fun = papply->fun; - capp->fid = 0; + capp->abs_id = papply->fun->absfun->name; + capp->fun = papply->fun; + capp->fid = 0; capp->n_args = n_args; for (size_t i = 0; i < n_args; i++) { @@ -232,29 +226,42 @@ pgf_cnc_resolve_def(PgfCnc* cnc, PgfCId abs_id, PgfCCat* ccat, GuString s, GuPool* pool) { PgfCncTree ret = gu_null_variant; - PgfCncFun* fun = NULL; - - if (ccat->lindefs != NULL) { - int index = - gu_choice_next(cnc->ch, gu_seq_length(ccat->lindefs)); - if (index < 0) { - return ret; - } - - fun = gu_seq_get(ccat->lindefs, PgfCncFun*, index); + PgfCncTree lit = gu_null_variant; + + PgfCncTreeLit* clit = + gu_new_variant(PGF_CNC_TREE_LIT, + PgfCncTreeLit, + &lit, pool); + clit->n_vars = 0; + clit->context = context; + clit->fid = -1; // don't report the literal in the bracket + PgfLiteralStr* lit_str = + gu_new_flex_variant(PGF_LITERAL_STR, + PgfLiteralStr, + val, strlen(s)+1, + &clit->lit, pool); + strcpy((char*) lit_str->val, (char*) s); + + if (ccat == NULL || ccat->lindefs == NULL) + return lit; + + int index = + gu_choice_next(cnc->ch, gu_seq_length(ccat->lindefs)); + if (index < 0) { + return ret; } - - PgfCncTreeLinDef* clindef = - gu_new_variant(PGF_CNC_TREE_LINDEF, - PgfCncTreeLinDef, - &ret, pool); - clindef->abs_id = abs_id; - clindef->ccat = ccat; - clindef->fun = fun; - clindef->fid = cnc->fid++; - clindef->n_vars = n_vars; - clindef->context = context; - clindef->str = s; + PgfCncTreeApp* capp = + gu_new_flex_variant(PGF_CNC_TREE_APP, + PgfCncTreeApp, + args, 1, &ret, pool); + capp->ccat = ccat; + capp->abs_id= abs_id; + capp->fun = gu_seq_get(ccat->lindefs, PgfCncFun*, index); + capp->fid = cnc->fid++; + capp->n_vars = n_vars; + capp->context = context; + capp->n_args = 1; + capp->args[0] = lit; return ret; } @@ -290,7 +297,7 @@ pgf_lzr_wrap_linref(PgfCncTree ctree, GuPool* pool) PgfCncTreeApp* capp = cti.data; assert(gu_seq_length(capp->ccat->linrefs) > 0); - + // here we must apply the linref function PgfCncTree new_ctree; PgfCncTreeApp* new_capp = @@ -298,6 +305,7 @@ pgf_lzr_wrap_linref(PgfCncTree ctree, GuPool* pool) PgfCncTreeApp, args, 1, &new_ctree, pool); new_capp->ccat = NULL; + new_capp->abs_id = NULL; new_capp->fun = gu_seq_get(capp->ccat->linrefs, PgfCncFun*, 0); new_capp->fid = -1; new_capp->n_vars = 0; @@ -309,7 +317,7 @@ pgf_lzr_wrap_linref(PgfCncTree ctree, GuPool* pool) break; } } - + return ctree; } @@ -391,6 +399,17 @@ pgf_cnc_resolve(PgfCnc* cnc, goto done; } + PgfCId abs_id = "?"; + if (emeta->id > 0) { + GuPool* tmp_pool = gu_local_pool(); + GuExn* err = gu_new_exn(tmp_pool); + GuStringBuf* sbuf = gu_new_string_buf(tmp_pool); + GuOut* out = gu_string_buf_out(sbuf); + + gu_printf(out, err, "?%d", emeta->id); + abs_id = gu_string_buf_freeze(sbuf, pool); + } + int index = gu_choice_next(cnc->ch, gu_seq_length(ccat->lindefs)); if (index < 0) { @@ -401,6 +420,7 @@ pgf_cnc_resolve(PgfCnc* cnc, PgfCncTreeApp, args, 1, &ret, pool); capp->ccat = ccat; + capp->abs_id = abs_id; capp->fun = gu_seq_get(ccat->lindefs, PgfCncFun*, index); capp->fid = cnc->fid++; capp->n_vars = 0; @@ -428,25 +448,9 @@ pgf_cnc_resolve(PgfCnc* cnc, gu_putc('[', out, err); gu_string_write(efun->fun, out, err); gu_putc(']', out, err); - GuString s = gu_string_buf_freeze(sbuf, pool); - - if (ccat != NULL) { - ret = pgf_cnc_resolve_def(cnc, n_vars, context, efun->fun, ccat, s, pool); - } else { - PgfCncTreeLit* clit = - gu_new_variant(PGF_CNC_TREE_LIT, - PgfCncTreeLit, - &ret, pool); - clit->n_vars = 0; - clit->context = context; - clit->fid = cnc->fid++; - PgfLiteralStr* lit = - gu_new_flex_variant(PGF_LITERAL_STR, - PgfLiteralStr, - val, strlen(s)+1, - &clit->lit, pool); - strcpy(lit->val, s); - } + GuString s = gu_string_buf_freeze(sbuf, tmp_pool); + + ret = pgf_cnc_resolve_def(cnc, n_vars, context, efun->fun, ccat, s, pool); gu_pool_free(tmp_pool); goto done; @@ -494,28 +498,7 @@ redo:; index--; } - if (ccat != NULL && ccat->lindefs == NULL) { - goto done; - } - - if (ccat != NULL) { - ret = pgf_cnc_resolve_def(cnc, n_vars, context, ctxt->name, ccat, ctxt->name, pool); - } else { - PgfCncTreeLit* clit = - gu_new_variant(PGF_CNC_TREE_LIT, - PgfCncTreeLit, - &ret, pool); - clit->n_vars = 0; - clit->context = context; - clit->fid = cnc->fid++; - PgfLiteralStr* lit = - gu_new_flex_variant(PGF_LITERAL_STR, - PgfLiteralStr, - val, strlen(ctxt->name)+1, - &clit->lit, pool); - strcpy(lit->val, ctxt->name); - } - + ret = pgf_cnc_resolve_def(cnc, n_vars, context, ctxt->name, ccat, ctxt->name, pool); goto done; } case PGF_EXPR_TYPED: { @@ -629,7 +612,7 @@ typedef struct { typedef struct { PgfLinFuncs* funcs; - PgfCncTree ctree; + PgfCncTreeApp* app; PgfSymbolKP* kp; GuBuf* events; PgfLzr* lzr; @@ -637,7 +620,7 @@ typedef struct { } PgfLzrCache; static void -pgf_lzr_linearize_symbols(PgfLzr* lzr, PgfCncTree ctree, +pgf_lzr_linearize_symbols(PgfLzr* lzr, PgfCncTreeApp* fapp, PgfSymbols* syms, uint16_t sym_idx); static void @@ -647,7 +630,7 @@ static void pgf_lzr_cache_flush(PgfLzrCache* cache, PgfSymbols* form) { cache->lzr->funcs = cache->prev; - pgf_lzr_linearize_symbols(cache->lzr, cache->ctree, form, 0); + pgf_lzr_linearize_symbols(cache->lzr, cache->app, form, 0); size_t n_cached = gu_buf_length(cache->events); for (size_t i = 0; i < n_cached; i++) { @@ -821,12 +804,6 @@ pgf_lzr_linearize_var(PgfLzr* lzr, PgfCncTree ctree, size_t var_idx) context = flit->context; break; } - case PGF_CNC_TREE_LINDEF: { - PgfCncTreeLinDef* flindef = cti.data; - n_vars = flindef->n_vars; - context = flindef->context; - break; - } default: gu_impossible(); } @@ -843,7 +820,7 @@ pgf_lzr_linearize_var(PgfLzr* lzr, PgfCncTree ctree, size_t var_idx) } static void -pgf_lzr_linearize_symbols(PgfLzr* lzr, PgfCncTree ctree, +pgf_lzr_linearize_symbols(PgfLzr* lzr, PgfCncTreeApp* fapp, PgfSymbols* syms, uint16_t sym_idx) { size_t nsyms = gu_seq_length(syms); @@ -852,40 +829,26 @@ pgf_lzr_linearize_symbols(PgfLzr* lzr, PgfCncTree ctree, GuVariantInfo sym_i = gu_variant_open(sym); switch (sym_i.tag) { case PGF_SYMBOL_CAT: - case PGF_SYMBOL_LIT: - case PGF_SYMBOL_VAR: { - if (gu_variant_is_null(ctree)) + case PGF_SYMBOL_LIT: { + if (fapp == NULL) return; PgfSymbolIdx* sidx = sym_i.data; + gu_assert((unsigned) sidx->d < fapp->n_args); - GuVariantInfo tree_i = gu_variant_open(ctree); - switch (tree_i.tag) { - case PGF_CNC_TREE_APP: { - PgfCncTreeApp* papp = tree_i.data; - - gu_assert((unsigned) sidx->d < papp->n_args); - - PgfCncTree argf = papp->args[sidx->d]; - if (sym_i.tag == PGF_SYMBOL_VAR) - pgf_lzr_linearize_var(lzr, argf, sidx->r); - else - pgf_lzr_linearize_tree(lzr, argf, sidx->r); - break; - } - case PGF_CNC_TREE_LINDEF: { - PgfCncTreeLinDef* plindef = tree_i.data; + PgfCncTree argf = fapp->args[sidx->d]; + pgf_lzr_linearize_tree(lzr, argf, sidx->r); + break; + } + case PGF_SYMBOL_VAR: { + if (fapp == NULL) + return; - gu_assert(sidx->d == 0); + PgfSymbolIdx* sidx = sym_i.data; + gu_assert((unsigned) sidx->d < fapp->n_args); - if ((*lzr->funcs)->symbol_token) { - (*lzr->funcs)->symbol_token(lzr->funcs, plindef->str); - } - break; - } - default: - gu_impossible(); - } + PgfCncTree argf = fapp->args[sidx->d]; + pgf_lzr_linearize_var(lzr, argf, sidx->r); break; } case PGF_SYMBOL_KS: { @@ -900,12 +863,12 @@ pgf_lzr_linearize_symbols(PgfLzr* lzr, PgfCncTree ctree, PgfSymbolKP* kp = sym_i.data; //gu_buf_push(pres, PgfSymbolKP*, kp); PgfLzrCache* cache = gu_new(PgfLzrCache, lzr->tmp_pool); - cache->funcs = &pgf_lzr_cache_funcs; - cache->ctree = ctree; - cache->kp = kp; - cache->events = gu_new_buf(PgfLzrCached, lzr->tmp_pool); - cache->lzr = lzr; - cache->prev = lzr->funcs; + cache->funcs = &pgf_lzr_cache_funcs; + cache->app = fapp; + cache->kp = kp; + cache->events= gu_new_buf(PgfLzrCached, lzr->tmp_pool); + cache->lzr = lzr; + cache->prev = lzr->funcs; lzr->funcs = &cache->funcs; break; } @@ -954,19 +917,19 @@ pgf_lzr_linearize_tree(PgfLzr* lzr, PgfCncTree ctree, size_t lin_idx) if ((*lzr->funcs)->begin_phrase && fapp->ccat != NULL) { (*lzr->funcs)->begin_phrase(lzr->funcs, - fun->absfun->type->cid, + fapp->ccat->cnccat->abscat->name, fapp->fid, lin_idx, - fun->absfun->name); + fapp->abs_id); } gu_require(lin_idx < fun->n_lins); - pgf_lzr_linearize_symbols(lzr, ctree, fun->lins[lin_idx]->syms, 0); - + pgf_lzr_linearize_symbols(lzr, fapp, fun->lins[lin_idx]->syms, 0); + if ((*lzr->funcs)->end_phrase && fapp->ccat != NULL) { (*lzr->funcs)->end_phrase(lzr->funcs, - fun->absfun->type->cid, + fapp->ccat->cnccat->abscat->name, fapp->fid, lin_idx, - fun->absfun->name); + fapp->abs_id); } break; } @@ -992,7 +955,7 @@ pgf_lzr_linearize_tree(PgfLzr* lzr, PgfCncTree ctree, size_t lin_idx) PgfCId cat = pgf_literal_cat(lzr->concr, flit->lit)->cnccat->abscat->name; - if ((*lzr->funcs)->begin_phrase) { + if ((*lzr->funcs)->begin_phrase && flit->fid >= 0) { (*lzr->funcs)->begin_phrase(lzr->funcs, cat, flit->fid, 0, ""); @@ -1024,7 +987,7 @@ pgf_lzr_linearize_tree(PgfLzr* lzr, PgfCncTree ctree, size_t lin_idx) (*lzr->funcs)->symbol_token(lzr->funcs, tok); } - if ((*lzr->funcs)->end_phrase) { + if ((*lzr->funcs)->end_phrase && flit->fid >= 0) { (*lzr->funcs)->end_phrase(lzr->funcs, cat, flit->fid, 0, ""); @@ -1032,29 +995,6 @@ pgf_lzr_linearize_tree(PgfLzr* lzr, PgfCncTree ctree, size_t lin_idx) break; } - case PGF_CNC_TREE_LINDEF: { - PgfCncTreeLinDef* flindef = cti.data; - PgfCncFun* fun = flindef->fun; - - if ((*lzr->funcs)->begin_phrase) { - (*lzr->funcs)->begin_phrase(lzr->funcs, - "", - flindef->fid, lin_idx, - flindef->abs_id); - } - - gu_require(lin_idx < fun->n_lins); - pgf_lzr_linearize_symbols(lzr, ctree, fun->lins[lin_idx]->syms, 0); - - if ((*lzr->funcs)->end_phrase) { - (*lzr->funcs)->end_phrase(lzr->funcs, - "", - flindef->fid, lin_idx, - flindef->abs_id); - } - - break; - } default: gu_impossible(); } @@ -1224,16 +1164,10 @@ pgf_lzr_get_table(PgfConcr* concr, PgfCncTree ctree, *labels = &s_label; break; } - case PGF_CNC_TREE_LINDEF: { - static GuString s = "s"; - - *n_lins = 1; - *labels = &s; - break; - } default: gu_impossible(); } + } PGF_API void @@ -1274,7 +1208,7 @@ pgf_get_tokens(PgfSymbols* syms, uint16_t sym_idx, GuPool* pool) }; PgfLzr* lzr = pgf_new_lzr(NULL, &flin.funcs, tmp_pool); - pgf_lzr_linearize_symbols(lzr, gu_null_variant, syms, sym_idx); + pgf_lzr_linearize_symbols(lzr, NULL, syms, sym_idx); while (lzr->funcs != &flin.funcs) { PgfLzrCache* cache = gu_container(lzr->funcs, PgfLzrCache, funcs); diff --git a/src/runtime/c/pgf/linearizer.h b/src/runtime/c/pgf/linearizer.h index 78ac092b6..790dd5800 100644 --- a/src/runtime/c/pgf/linearizer.h +++ b/src/runtime/c/pgf/linearizer.h @@ -18,11 +18,11 @@ typedef enum { PGF_CNC_TREE_APP, PGF_CNC_TREE_CHUNKS, PGF_CNC_TREE_LIT, - PGF_CNC_TREE_LINDEF } PgfCncTreeTag; typedef struct { PgfCCat* ccat; + PgfCId abs_id; PgfCncFun* fun; int fid; @@ -51,19 +51,6 @@ typedef struct { PgfLiteral lit; } PgfCncTreeLit; -typedef struct { - PgfCId abs_id; - - PgfCCat* ccat; - PgfCncFun* fun; - int fid; - - size_t n_vars; - PgfPrintContext* context; - - GuString str; -} PgfCncTreeLinDef; - #endif /// An enumeration of #PgfCncTree trees. |
