mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-09-13 05:46:00 -06:00
implement pre
This commit is contained in:
@@ -87,10 +87,10 @@ void PgfLinearizer::TreeNode::linearize_var(PgfLinearizationOutputIface *out, Pg
|
|||||||
out->symbol_token(linearizer->printer.get_text());
|
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++) {
|
for (size_t i = 0; i < syms.size(); i++) {
|
||||||
PgfSymbol sym = item->rule->syms[i];
|
PgfSymbol sym = syms[i];
|
||||||
|
|
||||||
switch (ref<PgfSymbol>::get_tag(sym)) {
|
switch (ref<PgfSymbol>::get_tag(sym)) {
|
||||||
case PgfSymbolCat::tag: {
|
case PgfSymbolCat::tag: {
|
||||||
@@ -170,6 +170,7 @@ void PgfLinearizer::TreeNode::linearize_item(PgfLinearizationOutputIface *out, P
|
|||||||
PreStack *pre = new PreStack();
|
PreStack *pre = new PreStack();
|
||||||
pre->next = linearizer->pre_stack;
|
pre->next = linearizer->pre_stack;
|
||||||
pre->node = this;
|
pre->node = this;
|
||||||
|
pre->item = item;
|
||||||
pre->sym_kp = sym_kp;
|
pre->sym_kp = sym_kp;
|
||||||
pre->bind = false;
|
pre->bind = false;
|
||||||
pre->capit = CAPIT_NONE;
|
pre->capit = CAPIT_NONE;
|
||||||
@@ -298,7 +299,8 @@ void PgfLinearizer::TreeLinNode::linearize(PgfLinearizationOutputIface *out, Pgf
|
|||||||
linearizer->pre_stack->bracket_stack = bracket;
|
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)
|
if (linearizer->pre_stack == NULL)
|
||||||
out->end_phrase(cat, fid, field, &lin->name);
|
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);
|
ref<PgfConcrLincat> lincat = args->get_lincat(linearizer);
|
||||||
if (lincat != 0) {
|
if (lincat != 0) {
|
||||||
linearize_item(out, linearizer, item);
|
linearize_item(out, linearizer, item, item->rule->syms.as_vector());
|
||||||
} else {
|
} else {
|
||||||
args->linearize(out, linearizer, lindex);
|
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);
|
ref<PgfAlternative> alt = pre->sym_kp->alts.elem(i);
|
||||||
for (ref<PgfText> prefix : alt->prefixes) {
|
for (ref<PgfText> prefix : alt->prefixes) {
|
||||||
if (cmp(token, &(*prefix))) {
|
if (cmp(token, &(*prefix))) {
|
||||||
// pre->node->linearize_seq(out, this, alt->form);
|
pre->node->linearize_item(out, this, pre->item, alt->form);
|
||||||
goto done;
|
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:
|
done:
|
||||||
if (pre->bracket_stack != NULL)
|
if (pre->bracket_stack != NULL)
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ class PGF_INTERNAL_DECL PgfLinearizer : public PgfUnmarshaller {
|
|||||||
virtual void check_category(PgfLinearizer *linearizer, PgfText *cat)=0;
|
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_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_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 void linearize(PgfLinearizationOutputIface *out, PgfLinearizer *linearizer, size_t lindex)=0;
|
||||||
virtual ref<PgfConcrLincat> get_lincat(PgfLinearizer *linearizer)=0;
|
virtual ref<PgfConcrLincat> get_lincat(PgfLinearizer *linearizer)=0;
|
||||||
virtual ~TreeNode() { free(hoas_vars); };
|
virtual ~TreeNode() { free(hoas_vars); };
|
||||||
@@ -173,6 +173,7 @@ class PGF_INTERNAL_DECL PgfLinearizer : public PgfUnmarshaller {
|
|||||||
struct PreStack {
|
struct PreStack {
|
||||||
PreStack *next;
|
PreStack *next;
|
||||||
TreeNode *node;
|
TreeNode *node;
|
||||||
|
Item *item;
|
||||||
ref<PgfSymbolKP> sym_kp;
|
ref<PgfSymbolKP> sym_kp;
|
||||||
bool bind;
|
bool bind;
|
||||||
CapitState capit;
|
CapitState capit;
|
||||||
|
|||||||
Reference in New Issue
Block a user