mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-04-18 01:09:32 -06:00
report the right function in the bracket even if there is no lin
This commit is contained in:
@@ -325,11 +325,12 @@ ref<PgfConcrLincat> PgfLinearizer::TreeLinNode::get_lincat(PgfLinearizer *linear
|
||||
return namespace_lookup(linearizer->concr->lincats, &lin->absfun->type->name);
|
||||
}
|
||||
|
||||
PgfLinearizer::TreeLindefNode::TreeLindefNode(PgfLinearizer *linearizer, PgfText *literal)
|
||||
PgfLinearizer::TreeLindefNode::TreeLindefNode(PgfLinearizer *linearizer, PgfText *fun, PgfText *literal)
|
||||
: TreeNode(linearizer)
|
||||
{
|
||||
this->lincat = 0;
|
||||
this->lin_index = 0;
|
||||
this->fun = fun;
|
||||
this->literal = literal;
|
||||
|
||||
TreeNode *prev = linearizer->prev;
|
||||
@@ -391,7 +392,7 @@ void PgfLinearizer::TreeLindefNode::linearize(PgfLinearizationOutputIface *out,
|
||||
if (lincat != 0) {
|
||||
PgfText *field = &*(vector_elem(lincat->fields, lindex)->name);
|
||||
if (linearizer->pre_stack == NULL)
|
||||
out->begin_phrase(&lincat->name, fid, field, linearizer->wild);
|
||||
out->begin_phrase(&lincat->name, fid, field, fun);
|
||||
else {
|
||||
BracketStack *bracket = new BracketStack();
|
||||
bracket->next = linearizer->pre_stack->bracket_stack;
|
||||
@@ -399,7 +400,7 @@ void PgfLinearizer::TreeLindefNode::linearize(PgfLinearizationOutputIface *out,
|
||||
bracket->fid = fid;
|
||||
bracket->cat = &lincat->name;
|
||||
bracket->field = field;
|
||||
bracket->field = linearizer->wild;
|
||||
bracket->fun = fun;
|
||||
linearizer->pre_stack->bracket_stack = bracket;
|
||||
}
|
||||
|
||||
@@ -407,7 +408,7 @@ void PgfLinearizer::TreeLindefNode::linearize(PgfLinearizationOutputIface *out,
|
||||
linearize_seq(out, linearizer, seq);
|
||||
|
||||
if (linearizer->pre_stack == NULL)
|
||||
out->end_phrase(&lincat->name, fid, field, linearizer->wild);
|
||||
out->end_phrase(&lincat->name, fid, field, fun);
|
||||
else {
|
||||
BracketStack *bracket = new BracketStack();
|
||||
bracket->next = linearizer->pre_stack->bracket_stack;
|
||||
@@ -415,7 +416,7 @@ void PgfLinearizer::TreeLindefNode::linearize(PgfLinearizationOutputIface *out,
|
||||
bracket->fid = fid;
|
||||
bracket->cat = &lincat->name;
|
||||
bracket->field = field;
|
||||
bracket->field = linearizer->wild;
|
||||
bracket->fun = fun;
|
||||
linearizer->pre_stack->bracket_stack = bracket;
|
||||
}
|
||||
} else {
|
||||
@@ -726,7 +727,7 @@ PgfExpr PgfLinearizer::elit(PgfLiteral lit)
|
||||
PgfExpr PgfLinearizer::emeta(PgfMetaId meta)
|
||||
{
|
||||
printer.emeta(meta);
|
||||
return (PgfExpr) new TreeLindefNode(this, printer.get_text());
|
||||
return (PgfExpr) new TreeLindefNode(this, NULL, printer.get_text());
|
||||
}
|
||||
|
||||
PgfExpr PgfLinearizer::efun(PgfText *name)
|
||||
@@ -738,14 +739,15 @@ PgfExpr PgfLinearizer::efun(PgfText *name)
|
||||
printer.puts("[");
|
||||
printer.efun(name);
|
||||
printer.puts("]");
|
||||
return (PgfExpr) new TreeLindefNode(this, printer.get_text());
|
||||
return (PgfExpr) new TreeLindefNode(this, textdup(name), printer.get_text());
|
||||
}
|
||||
}
|
||||
|
||||
PgfExpr PgfLinearizer::evar(int index)
|
||||
{
|
||||
printer.evar(index);
|
||||
return (PgfExpr) new TreeLindefNode(this, printer.get_text());
|
||||
PgfText *name = printer.get_text();
|
||||
return (PgfExpr) new TreeLindefNode(this, textdup(name), name);
|
||||
}
|
||||
|
||||
PgfExpr PgfLinearizer::etyped(PgfExpr expr, PgfType ty)
|
||||
|
||||
@@ -66,15 +66,16 @@ class PGF_INTERNAL_DECL PgfLinearizer : public PgfUnmarshaller {
|
||||
struct TreeLindefNode : public TreeNode {
|
||||
ref<PgfConcrLincat> lincat;
|
||||
size_t lin_index;
|
||||
PgfText *fun;
|
||||
PgfText *literal;
|
||||
|
||||
TreeLindefNode(PgfLinearizer *linearizer, PgfText *lit);
|
||||
TreeLindefNode(PgfLinearizer *linearizer, PgfText *fun, PgfText *lit);
|
||||
virtual bool resolve(PgfLinearizer *linearizer);
|
||||
virtual void check_category(PgfLinearizer *linearizer, PgfText *cat);
|
||||
virtual void linearize_arg(PgfLinearizationOutputIface *out, PgfLinearizer *linearizer, size_t d, PgfLParam *r);
|
||||
virtual void linearize(PgfLinearizationOutputIface *out, PgfLinearizer *linearizer, size_t lindex);
|
||||
virtual ref<PgfConcrLincat> get_lincat(PgfLinearizer *linearizer);
|
||||
~TreeLindefNode() { free(literal); };
|
||||
~TreeLindefNode() { free(fun); free(literal); };
|
||||
};
|
||||
|
||||
struct TreeLinrefNode : public TreeNode {
|
||||
|
||||
Reference in New Issue
Block a user