forked from GitHub/gf-core
bugfix: the linearizer should not generate extra space at the end of the sentence
This commit is contained in:
@@ -478,6 +478,7 @@ typedef struct PgfSimpleLin PgfSimpleLin;
|
|||||||
|
|
||||||
struct PgfSimpleLin {
|
struct PgfSimpleLin {
|
||||||
PgfLinFuncs* funcs;
|
PgfLinFuncs* funcs;
|
||||||
|
int n_tokens;
|
||||||
GuWriter* wtr;
|
GuWriter* wtr;
|
||||||
GuExn* err;
|
GuExn* err;
|
||||||
};
|
};
|
||||||
@@ -491,9 +492,13 @@ pgf_file_lzn_symbol_tokens(PgfLinFuncs** funcs, PgfTokens toks)
|
|||||||
}
|
}
|
||||||
size_t len = gu_seq_length(toks);
|
size_t len = gu_seq_length(toks);
|
||||||
for (size_t i = 0; i < len; i++) {
|
for (size_t i = 0; i < len; i++) {
|
||||||
|
if (flin->n_tokens > 0)
|
||||||
|
gu_putc(' ', flin->wtr, flin->err);
|
||||||
|
|
||||||
PgfToken tok = gu_seq_get(toks, PgfToken, i);
|
PgfToken tok = gu_seq_get(toks, PgfToken, i);
|
||||||
gu_string_write(tok, flin->wtr, flin->err);
|
gu_string_write(tok, flin->wtr, flin->err);
|
||||||
gu_putc(' ', flin->wtr, flin->err);
|
|
||||||
|
flin->n_tokens++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -504,28 +509,32 @@ pgf_file_lzn_expr_literal(PgfLinFuncs** funcs, PgfLiteral lit)
|
|||||||
if (!gu_ok(flin->err)) {
|
if (!gu_ok(flin->err)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (flin->n_tokens > 0)
|
||||||
|
gu_putc(' ', flin->wtr, flin->err);
|
||||||
|
|
||||||
GuVariantInfo i = gu_variant_open(lit);
|
GuVariantInfo i = gu_variant_open(lit);
|
||||||
switch (i.tag) {
|
switch (i.tag) {
|
||||||
case PGF_LITERAL_STR: {
|
case PGF_LITERAL_STR: {
|
||||||
PgfLiteralStr* lstr = i.data;
|
PgfLiteralStr* lstr = i.data;
|
||||||
gu_string_write(lstr->val, flin->wtr, flin->err);
|
gu_string_write(lstr->val, flin->wtr, flin->err);
|
||||||
gu_putc(' ', flin->wtr, flin->err);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case PGF_LITERAL_INT: {
|
case PGF_LITERAL_INT: {
|
||||||
PgfLiteralInt* lint = i.data;
|
PgfLiteralInt* lint = i.data;
|
||||||
gu_printf(flin->wtr, flin->err, "%d ", lint->val);
|
gu_printf(flin->wtr, flin->err, "%d", lint->val);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case PGF_LITERAL_FLT: {
|
case PGF_LITERAL_FLT: {
|
||||||
PgfLiteralFlt* lflt = i.data;
|
PgfLiteralFlt* lflt = i.data;
|
||||||
gu_printf(flin->wtr, flin->err, "%lf ", lflt->val);
|
gu_printf(flin->wtr, flin->err, "%lf", lflt->val);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
gu_impossible();
|
gu_impossible();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
flin->n_tokens++;
|
||||||
}
|
}
|
||||||
|
|
||||||
static PgfLinFuncs pgf_file_lin_funcs = {
|
static PgfLinFuncs pgf_file_lin_funcs = {
|
||||||
@@ -539,6 +548,7 @@ pgf_lzr_linearize_simple(PgfConcr* concr, PgfCncTree ctree,
|
|||||||
{
|
{
|
||||||
PgfSimpleLin flin = {
|
PgfSimpleLin flin = {
|
||||||
.funcs = &pgf_file_lin_funcs,
|
.funcs = &pgf_file_lin_funcs,
|
||||||
|
.n_tokens = 0,
|
||||||
.wtr = wtr,
|
.wtr = wtr,
|
||||||
.err = err
|
.err = err
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user