implement pre

This commit is contained in:
Krasimir Angelov
2026-05-06 14:29:28 +02:00
parent 96492e698a
commit a66a620990
2 changed files with 11 additions and 8 deletions
+9 -7
View File
@@ -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<PgfSymbol> 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<PgfSymbol>::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<PgfConcrLincat> 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<PgfAlternative> alt = pre->sym_kp->alts.elem(i);
for (ref<PgfText> 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)
+2 -1
View File
@@ -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<PgfSymbol> syms);
virtual void linearize(PgfLinearizationOutputIface *out, PgfLinearizer *linearizer, size_t lindex)=0;
virtual ref<PgfConcrLincat> 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<PgfSymbolKP> sym_kp;
bool bind;
CapitState capit;