summaryrefslogtreecommitdiff
path: root/src/runtime/c
diff options
context:
space:
mode:
Diffstat (limited to 'src/runtime/c')
-rw-r--r--src/runtime/c/pgf/linearizer.c248
-rw-r--r--src/runtime/c/pgf/linearizer.h15
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.