a simple fix for the linearizer

This commit is contained in:
Krasimir Angelov
2018-06-20 22:21:10 +02:00
parent b86373438b
commit 68db7695f5
2 changed files with 35 additions and 56 deletions

View File

@@ -175,6 +175,7 @@ redo:;
gu_buf_get(buf, PgfProductionApply*, index); gu_buf_get(buf, PgfProductionApply*, index);
gu_assert(n_args == gu_seq_length(papply->args)); gu_assert(n_args == gu_seq_length(papply->args));
capp->abs_id = papply->fun->absfun->name;
capp->fun = papply->fun; capp->fun = papply->fun;
capp->fid = 0; capp->fid = 0;
capp->n_args = n_args; capp->n_args = n_args;
@@ -222,10 +223,10 @@ redo:;
static PgfCncTree static PgfCncTree
pgf_cnc_resolve_def(PgfCnc* cnc, pgf_cnc_resolve_def(PgfCnc* cnc,
size_t n_vars, PgfPrintContext* context, size_t n_vars, PgfPrintContext* context,
PgfCCat* ccat, GuString s, GuPool* pool) PgfCId abs_id, PgfCCat* ccat, GuString s, GuPool* pool)
{ {
PgfCncTree lit = gu_null_variant;
PgfCncTree ret = gu_null_variant; PgfCncTree ret = gu_null_variant;
PgfCncTree lit = gu_null_variant;
PgfCncTreeLit* clit = PgfCncTreeLit* clit =
gu_new_variant(PGF_CNC_TREE_LIT, gu_new_variant(PGF_CNC_TREE_LIT,
@@ -233,7 +234,7 @@ pgf_cnc_resolve_def(PgfCnc* cnc,
&lit, pool); &lit, pool);
clit->n_vars = 0; clit->n_vars = 0;
clit->context = context; clit->context = context;
clit->fid = cnc->fid++; clit->fid = -1; // don't report the literal in the bracket
PgfLiteralStr* lit_str = PgfLiteralStr* lit_str =
gu_new_flex_variant(PGF_LITERAL_STR, gu_new_flex_variant(PGF_LITERAL_STR,
PgfLiteralStr, PgfLiteralStr,
@@ -241,7 +242,7 @@ pgf_cnc_resolve_def(PgfCnc* cnc,
&clit->lit, pool); &clit->lit, pool);
strcpy((char*) lit_str->val, (char*) s); strcpy((char*) lit_str->val, (char*) s);
if (ccat->lindefs == NULL) if (ccat == NULL || ccat->lindefs == NULL)
return lit; return lit;
int index = int index =
@@ -254,6 +255,7 @@ pgf_cnc_resolve_def(PgfCnc* cnc,
PgfCncTreeApp, PgfCncTreeApp,
args, 1, &ret, pool); args, 1, &ret, pool);
capp->ccat = ccat; capp->ccat = ccat;
capp->abs_id= abs_id;
capp->fun = gu_seq_get(ccat->lindefs, PgfCncFun*, index); capp->fun = gu_seq_get(ccat->lindefs, PgfCncFun*, index);
capp->fid = cnc->fid++; capp->fid = cnc->fid++;
capp->n_vars = n_vars; capp->n_vars = n_vars;
@@ -303,6 +305,7 @@ pgf_lzr_wrap_linref(PgfCncTree ctree, GuPool* pool)
PgfCncTreeApp, PgfCncTreeApp,
args, 1, &new_ctree, pool); args, 1, &new_ctree, pool);
new_capp->ccat = NULL; new_capp->ccat = NULL;
new_capp->abs_id = NULL;
new_capp->fun = gu_seq_get(capp->ccat->linrefs, PgfCncFun*, 0); new_capp->fun = gu_seq_get(capp->ccat->linrefs, PgfCncFun*, 0);
new_capp->fid = -1; new_capp->fid = -1;
new_capp->n_vars = 0; new_capp->n_vars = 0;
@@ -396,6 +399,17 @@ pgf_cnc_resolve(PgfCnc* cnc,
goto done; 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 = int index =
gu_choice_next(cnc->ch, gu_seq_length(ccat->lindefs)); gu_choice_next(cnc->ch, gu_seq_length(ccat->lindefs));
if (index < 0) { if (index < 0) {
@@ -406,6 +420,7 @@ pgf_cnc_resolve(PgfCnc* cnc,
PgfCncTreeApp, PgfCncTreeApp,
args, 1, &ret, pool); args, 1, &ret, pool);
capp->ccat = ccat; capp->ccat = ccat;
capp->abs_id = abs_id;
capp->fun = gu_seq_get(ccat->lindefs, PgfCncFun*, index); capp->fun = gu_seq_get(ccat->lindefs, PgfCncFun*, index);
capp->fid = cnc->fid++; capp->fid = cnc->fid++;
capp->n_vars = 0; capp->n_vars = 0;
@@ -435,23 +450,7 @@ pgf_cnc_resolve(PgfCnc* cnc,
gu_putc(']', out, err); gu_putc(']', out, err);
GuString s = gu_string_buf_freeze(sbuf, tmp_pool); GuString s = gu_string_buf_freeze(sbuf, tmp_pool);
if (ccat != NULL) { ret = pgf_cnc_resolve_def(cnc, n_vars, context, efun->fun, ccat, s, pool);
ret = pgf_cnc_resolve_def(cnc, n_vars, context, 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);
}
gu_pool_free(tmp_pool); gu_pool_free(tmp_pool);
goto done; goto done;
@@ -499,28 +498,7 @@ redo:;
index--; index--;
} }
if (ccat != NULL && ccat->lindefs == NULL) { ret = pgf_cnc_resolve_def(cnc, n_vars, context, ctxt->name, ccat, ctxt->name, pool);
goto done;
}
if (ccat != NULL) {
ret = pgf_cnc_resolve_def(cnc, n_vars, context, 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);
}
goto done; goto done;
} }
case PGF_EXPR_TYPED: { case PGF_EXPR_TYPED: {
@@ -939,9 +917,9 @@ pgf_lzr_linearize_tree(PgfLzr* lzr, PgfCncTree ctree, size_t lin_idx)
if ((*lzr->funcs)->begin_phrase && fapp->ccat != NULL) { if ((*lzr->funcs)->begin_phrase && fapp->ccat != NULL) {
(*lzr->funcs)->begin_phrase(lzr->funcs, (*lzr->funcs)->begin_phrase(lzr->funcs,
fun->absfun->type->cid, fapp->ccat->cnccat->abscat->name,
fapp->fid, lin_idx, fapp->fid, lin_idx,
fun->absfun->name); fapp->abs_id);
} }
gu_require(lin_idx < fun->n_lins); gu_require(lin_idx < fun->n_lins);
@@ -949,9 +927,9 @@ pgf_lzr_linearize_tree(PgfLzr* lzr, PgfCncTree ctree, size_t lin_idx)
if ((*lzr->funcs)->end_phrase && fapp->ccat != NULL) { if ((*lzr->funcs)->end_phrase && fapp->ccat != NULL) {
(*lzr->funcs)->end_phrase(lzr->funcs, (*lzr->funcs)->end_phrase(lzr->funcs,
fun->absfun->type->cid, fapp->ccat->cnccat->abscat->name,
fapp->fid, lin_idx, fapp->fid, lin_idx,
fun->absfun->name); fapp->abs_id);
} }
break; break;
} }
@@ -977,7 +955,7 @@ pgf_lzr_linearize_tree(PgfLzr* lzr, PgfCncTree ctree, size_t lin_idx)
PgfCId cat = PgfCId cat =
pgf_literal_cat(lzr->concr, flit->lit)->cnccat->abscat->name; 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, (*lzr->funcs)->begin_phrase(lzr->funcs,
cat, flit->fid, 0, cat, flit->fid, 0,
""); "");
@@ -1009,7 +987,7 @@ pgf_lzr_linearize_tree(PgfLzr* lzr, PgfCncTree ctree, size_t lin_idx)
(*lzr->funcs)->symbol_token(lzr->funcs, tok); (*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, (*lzr->funcs)->end_phrase(lzr->funcs,
cat, flit->fid, 0, cat, flit->fid, 0,
""); "");

View File

@@ -22,6 +22,7 @@ typedef enum {
typedef struct { typedef struct {
PgfCCat* ccat; PgfCCat* ccat;
PgfCId abs_id;
PgfCncFun* fun; PgfCncFun* fun;
int fid; int fid;