From a66a620990f601c3013a9cab5b3063ece063ddc7 Mon Sep 17 00:00:00 2001 From: Krasimir Angelov Date: Wed, 6 May 2026 14:29:28 +0200 Subject: [PATCH] implement pre --- src/runtime/c/pgf/linearizer.cxx | 16 +++++++++------- src/runtime/c/pgf/linearizer.h | 3 ++- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/runtime/c/pgf/linearizer.cxx b/src/runtime/c/pgf/linearizer.cxx index 6626676cb..c6e2f487c 100644 --- a/src/runtime/c/pgf/linearizer.cxx +++ b/src/runtime/c/pgf/linearizer.cxx @@ -87,10 +87,10 @@ void PgfLinearizer::TreeNode::linearize_var(PgfLinearizationOutputIface *out, Pg out->symbol_token(linearizer->printer.get_text()); } -void PgfLinearizer::TreeNode::linearize_item(PgfLinearizationOutputIface *out, PgfLinearizer *linearizer, Item *item) +void PgfLinearizer::TreeNode::linearize_item(PgfLinearizationOutputIface *out, PgfLinearizer *linearizer, Item *item, vector syms) { - for (size_t i = 0; i < item->rule->syms.size(); i++) { - PgfSymbol sym = item->rule->syms[i]; + for (size_t i = 0; i < syms.size(); i++) { + PgfSymbol sym = syms[i]; switch (ref::get_tag(sym)) { case PgfSymbolCat::tag: { @@ -170,6 +170,7 @@ void PgfLinearizer::TreeNode::linearize_item(PgfLinearizationOutputIface *out, P PreStack *pre = new PreStack(); pre->next = linearizer->pre_stack; pre->node = this; + pre->item = item; pre->sym_kp = sym_kp; pre->bind = false; pre->capit = CAPIT_NONE; @@ -298,7 +299,8 @@ void PgfLinearizer::TreeLinNode::linearize(PgfLinearizationOutputIface *out, Pgf linearizer->pre_stack->bracket_stack = bracket; } - linearize_item(out, linearizer, items[lindex]); + linearize_item(out, linearizer, + items[lindex],items[lindex]->rule->syms.as_vector()); if (linearizer->pre_stack == NULL) out->end_phrase(cat, fid, field, &lin->name); @@ -537,7 +539,7 @@ void PgfLinearizer::TreeLinrefNode::linearize(PgfLinearizationOutputIface *out, { ref lincat = args->get_lincat(linearizer); if (lincat != 0) { - linearize_item(out, linearizer, item); + linearize_item(out, linearizer, item, item->rule->syms.as_vector()); } else { args->linearize(out, linearizer, lindex); } @@ -690,14 +692,14 @@ void PgfLinearizer::flush_pre_stack(PgfLinearizationOutputIface *out, PgfText *t ref alt = pre->sym_kp->alts.elem(i); for (ref prefix : alt->prefixes) { if (cmp(token, &(*prefix))) { -// pre->node->linearize_seq(out, this, alt->form); + pre->node->linearize_item(out, this, pre->item, alt->form); goto done; } } } } -// pre->node->linearize_seq(out, this, pre->sym_kp->default_form); + pre->node->linearize_item(out, this, pre->item, pre->sym_kp->default_form); done: if (pre->bracket_stack != NULL) diff --git a/src/runtime/c/pgf/linearizer.h b/src/runtime/c/pgf/linearizer.h index 2c6185259..f9f49c8e2 100644 --- a/src/runtime/c/pgf/linearizer.h +++ b/src/runtime/c/pgf/linearizer.h @@ -85,7 +85,7 @@ class PGF_INTERNAL_DECL PgfLinearizer : public PgfUnmarshaller { virtual void check_category(PgfLinearizer *linearizer, PgfText *cat)=0; virtual void linearize_arg(PgfLinearizationOutputIface *out, PgfLinearizer *linearizer, size_t d, size_t r); virtual void linearize_var(PgfLinearizationOutputIface *out, PgfLinearizer *linearizer, size_t d, size_t r); - virtual void linearize_item(PgfLinearizationOutputIface *out, PgfLinearizer *linearizer, Item *item); + virtual void linearize_item(PgfLinearizationOutputIface *out, PgfLinearizer *linearizer, Item *item, vector syms); virtual void linearize(PgfLinearizationOutputIface *out, PgfLinearizer *linearizer, size_t lindex)=0; virtual ref get_lincat(PgfLinearizer *linearizer)=0; virtual ~TreeNode() { free(hoas_vars); }; @@ -173,6 +173,7 @@ class PGF_INTERNAL_DECL PgfLinearizer : public PgfUnmarshaller { struct PreStack { PreStack *next; TreeNode *node; + Item *item; ref sym_kp; bool bind; CapitState capit;