support for Int,Float and String

This commit is contained in:
krangelov
2021-12-01 15:54:34 +01:00
parent 15c03816ea
commit 9ca68b1b4b
2 changed files with 81 additions and 69 deletions

View File

@@ -2,12 +2,13 @@
#include "printer.h"
#include "linearizer.h"
PgfLinearizer::TreeNode::TreeNode(PgfLinearizer *linearizer, ref<PgfConcrLin> lin) {
PgfLinearizer::TreeNode::TreeNode(PgfLinearizer *linearizer, ref<PgfConcrLin> lin, PgfText *lit) {
this->next = NULL;
this->next_arg = NULL;
this->args = linearizer->args;
this->lin = lin;
this->literal = lit;
this->lin_index = 0;
this->value = 0;
@@ -60,6 +61,7 @@ bool PgfLinearizer::resolve()
{
TreeNode *node = first;
while (node != NULL) {
if (node->literal == NULL) {
size_t n_args = node->lin->args->len / node->lin->res->len;
while (node->lin_index < node->lin->res->len) {
@@ -137,6 +139,7 @@ bool PgfLinearizer::resolve()
node->var_values[j] = (size_t) -1;
}
}
}
node = node->next;
}
@@ -228,9 +231,13 @@ void PgfLinearizer::linearize(PgfLinearizationOutputIface *out, TreeNode *node,
void PgfLinearizer::linearize(PgfLinearizationOutputIface *out, TreeNode *node, size_t lindex)
{
if (node->literal == NULL) {
size_t n_seqs = node->lin->seqs->len / node->lin->res->len;
ref<Vector<PgfSymbol>> syms = *vector_elem(node->lin->seqs, (node->lin_index-1)*n_seqs + lindex);
linearize(out, node, syms);
} else {
out->symbol_token(node->literal);
}
}
PgfExpr PgfLinearizer::eabs(PgfBindType btype, PgfText *name, PgfExpr body)
@@ -262,7 +269,7 @@ PgfExpr PgfLinearizer::emeta(PgfMetaId meta)
PgfExpr PgfLinearizer::efun(PgfText *name)
{
ref<PgfConcrLin> lin = namespace_lookup(concr->lins, name);
TreeNode *node = new TreeNode(this, lin);
TreeNode *node = new TreeNode(this, lin, NULL);
return (PgfExpr) node;
}
@@ -283,17 +290,21 @@ PgfExpr PgfLinearizer::eimplarg(PgfExpr expr)
PgfLiteral PgfLinearizer::lint(size_t size, uintmax_t *v)
{
return 0;
PgfPrinter printer(NULL,0,NULL);
printer.lint(size,v);
return (PgfExpr) new TreeNode(this, 0, printer.get_text());
}
PgfLiteral PgfLinearizer::lflt(double v)
{
return 0;
PgfPrinter printer(NULL,0,NULL);
printer.lflt(v);
return (PgfExpr) new TreeNode(this, 0, printer.get_text());
}
PgfLiteral PgfLinearizer::lstr(PgfText *v)
{
return 0;
return (PgfExpr) new TreeNode(this, 0, textdup(v));
}
PgfType PgfLinearizer::dtyp(size_t n_hypos, PgfTypeHypo *hypos,

View File

@@ -32,15 +32,16 @@ class PGF_INTERNAL_DECL PgfLinearizer : public PgfUnmarshaller {
TreeNode *next_arg;
TreeNode *args;
ref<PgfConcrLin> lin;
PgfText *literal; // != NULL if literal
ref<PgfConcrLin> lin; // != 0 if function
size_t lin_index;
size_t value;
size_t var_count;
size_t *var_values;
TreeNode(PgfLinearizer *linearizer, ref<PgfConcrLin> lin);
~TreeNode() { free(var_values); };
TreeNode(PgfLinearizer *linearizer, ref<PgfConcrLin> lin, PgfText *lit);
~TreeNode() { free(literal); free(var_values); };
size_t eval_param(PgfLParam *param);
};