summaryrefslogtreecommitdiff
path: root/src/runtime/c
diff options
context:
space:
mode:
Diffstat (limited to 'src/runtime/c')
-rw-r--r--src/runtime/c/pgf/data.h16
-rw-r--r--src/runtime/c/pgf/graphviz.c17
-rw-r--r--src/runtime/c/pgf/linearizer.c110
-rw-r--r--src/runtime/c/pgf/linearizer.h2
-rw-r--r--src/runtime/c/pgf/literals.c11
-rw-r--r--src/runtime/c/pgf/parser.c230
-rw-r--r--src/runtime/c/pgf/parseval.c31
-rw-r--r--src/runtime/c/pgf/printer.c34
-rw-r--r--src/runtime/c/pgf/reader.c31
9 files changed, 218 insertions, 264 deletions
diff --git a/src/runtime/c/pgf/data.h b/src/runtime/c/pgf/data.h
index 7717f89f9..2d7fc450e 100644
--- a/src/runtime/c/pgf/data.h
+++ b/src/runtime/c/pgf/data.h
@@ -131,8 +131,11 @@ extern GU_DECLARE_TYPE(PgfCncCat, abstract);
bool
pgf_tokens_equal(PgfTokens* t1, PgfTokens* t2);
+typedef GuSeq PgfSequence; // -> PgfSymbol
+typedef GuSeq PgfSequences;
+
typedef struct {
- PgfTokens* form;
+ PgfSequence* form;
/**< The form of this variant as a list of tokens. */
GuStrings* prefixes;
@@ -175,7 +178,8 @@ typedef enum {
PGF_SYMBOL_VAR,
PGF_SYMBOL_KS,
PGF_SYMBOL_KP,
- PGF_SYMBOL_NE
+ PGF_SYMBOL_NE,
+ PGF_SYMBOL_BIND
} PgfSymbolTag;
typedef struct {
@@ -186,14 +190,14 @@ typedef struct {
typedef PgfSymbolIdx PgfSymbolCat, PgfSymbolLit, PgfSymbolVar;
typedef struct {
- PgfTokens* tokens;
+ PgfToken token;
} PgfSymbolKS;
typedef struct PgfSymbolKP
/** A prefix-dependent symbol. The form that this symbol takes
* depends on the form of a prefix of the following symbol. */
{
- PgfTokens* default_form;
+ PgfSequence* default_form;
/**< Default form that this symbol takes if none of of the
* variant forms is triggered. */
@@ -206,8 +210,8 @@ typedef struct PgfSymbolKP
typedef struct {
} PgfSymbolNE;
-typedef GuSeq PgfSequence; // -> PgfSymbol
-typedef GuSeq PgfSequences;
+typedef struct {
+} PgfSymbolBIND;
typedef struct {
PgfAbsFun* absfun;
diff --git a/src/runtime/c/pgf/graphviz.c b/src/runtime/c/pgf/graphviz.c
index 5190d2fee..1003c4e8e 100644
--- a/src/runtime/c/pgf/graphviz.c
+++ b/src/runtime/c/pgf/graphviz.c
@@ -116,18 +116,15 @@ typedef struct {
} PgfBracketLznState;
static void
-pgf_bracket_lzn_symbol_tokens(PgfLinFuncs** funcs, PgfTokens* toks)
+pgf_bracket_lzn_symbol_token(PgfLinFuncs** funcs, PgfToken tok)
{
PgfBracketLznState* state = gu_container(funcs, PgfBracketLznState, funcs);
- size_t len = gu_seq_length(toks);
- for (size_t i = 0; i < len; i++) {
- PgfParseNode* node = gu_new(PgfParseNode, state->pool);
- node->id = 100000 + gu_buf_length(state->leaves);
- node->parent = state->parent;
- node->label = gu_seq_get(toks, PgfToken, i);
- gu_buf_push(state->leaves, PgfParseNode*, node);
- }
+ PgfParseNode* node = gu_new(PgfParseNode, state->pool);
+ node->id = 100000 + gu_buf_length(state->leaves);
+ node->parent = state->parent;
+ node->label = tok;
+ gu_buf_push(state->leaves, PgfParseNode*, node);
}
static void
@@ -214,7 +211,7 @@ pgf_bracket_lzn_end_phrase(PgfLinFuncs** funcs, PgfCId cat, int fid, int lindex,
}
static PgfLinFuncs pgf_bracket_lin_funcs = {
- .symbol_tokens = pgf_bracket_lzn_symbol_tokens,
+ .symbol_token = pgf_bracket_lzn_symbol_token,
.expr_literal = pgf_bracket_lzn_expr_literal,
.begin_phrase = pgf_bracket_lzn_begin_phrase,
.end_phrase = pgf_bracket_lzn_end_phrase
diff --git a/src/runtime/c/pgf/linearizer.c b/src/runtime/c/pgf/linearizer.c
index 0a29db824..6a3eb8c9d 100644
--- a/src/runtime/c/pgf/linearizer.c
+++ b/src/runtime/c/pgf/linearizer.c
@@ -454,6 +454,50 @@ pgf_lzr_concretize(PgfConcr* concr, PgfExpr expr, GuPool* pool)
}
void
+pgf_lzr_linearize_sequence(PgfConcr* concr,
+ PgfCncTreeApp* fapp, PgfSequence* seq,
+ PgfLinFuncs** fnsp)
+{
+ size_t nsyms = gu_seq_length(seq);
+ PgfSymbol* syms = gu_seq_data(seq);
+ for (size_t i = 0; i < nsyms; i++) {
+ PgfSymbol sym = syms[i];
+ GuVariantInfo sym_i = gu_variant_open(sym);
+ switch (sym_i.tag) {
+ case PGF_SYMBOL_CAT:
+ case PGF_SYMBOL_VAR:
+ case PGF_SYMBOL_LIT: {
+ PgfSymbolIdx* sidx = sym_i.data;
+ gu_assert((unsigned) sidx->d < fapp->n_args);
+
+ PgfCncTree argf = fapp->args[sidx->d];
+ pgf_lzr_linearize(concr, argf, sidx->r, fnsp);
+ break;
+ }
+ case PGF_SYMBOL_KS: {
+ PgfSymbolKS* ks = sym_i.data;
+ if ((*fnsp)->symbol_token) {
+ (*fnsp)->symbol_token(fnsp, ks->token);
+ }
+ break;
+ }
+ case PGF_SYMBOL_KP: {
+ // TODO: correct prefix-dependencies
+ PgfSymbolKP* kp = sym_i.data;
+ pgf_lzr_linearize_sequence(concr, fapp, kp->default_form, fnsp);
+ break;
+ }
+ case PGF_SYMBOL_NE: {
+ // Nothing to be done here
+ break;
+ }
+ default:
+ gu_impossible();
+ }
+ }
+}
+
+void
pgf_lzr_linearize(PgfConcr* concr, PgfCncTree ctree, size_t lin_idx, PgfLinFuncs** fnsp)
{
PgfLinFuncs* fns = *fnsp;
@@ -472,47 +516,9 @@ pgf_lzr_linearize(PgfConcr* concr, PgfCncTree ctree, size_t lin_idx, PgfLinFuncs
}
gu_require(lin_idx < fun->n_lins);
+
PgfSequence* seq = fun->lins[lin_idx];
- size_t nsyms = gu_seq_length(seq);
- PgfSymbol* syms = gu_seq_data(seq);
- for (size_t i = 0; i < nsyms; i++) {
- PgfSymbol sym = syms[i];
- GuVariantInfo sym_i = gu_variant_open(sym);
- switch (sym_i.tag) {
- case PGF_SYMBOL_CAT:
- case PGF_SYMBOL_VAR:
- case PGF_SYMBOL_LIT: {
- PgfSymbolIdx* sidx = sym_i.data;
- gu_assert((unsigned) sidx->d < fapp->n_args);
-
- PgfCncTree argf = fapp->args[sidx->d];
- pgf_lzr_linearize(concr, argf, sidx->r, fnsp);
- break;
- }
- case PGF_SYMBOL_KS: {
- PgfSymbolKS* ks = sym_i.data;
- if (fns->symbol_tokens) {
- fns->symbol_tokens(fnsp, ks->tokens);
- }
- break;
- }
- case PGF_SYMBOL_KP: {
- // TODO: correct prefix-dependencies
- PgfSymbolKP* kp = sym_i.data;
- if (fns->symbol_tokens) {
- fns->symbol_tokens(fnsp,
- kp->default_form);
- }
- break;
- }
- case PGF_SYMBOL_NE: {
- // Nothing to be done here
- break;
- }
- default:
- gu_impossible();
- }
- }
+ pgf_lzr_linearize_sequence(concr, fapp, seq, fnsp);
if (fns->end_phrase) {
fns->end_phrase(fnsp,
@@ -572,22 +578,18 @@ struct PgfSimpleLin {
};
static void
-pgf_file_lzn_symbol_tokens(PgfLinFuncs** funcs, PgfTokens* toks)
+pgf_file_lzn_symbol_token(PgfLinFuncs** funcs, PgfToken tok)
{
PgfSimpleLin* flin = gu_container(funcs, PgfSimpleLin, funcs);
if (!gu_ok(flin->err)) {
return;
}
- size_t len = gu_seq_length(toks);
- for (size_t i = 0; i < len; i++) {
- if (flin->n_tokens > 0)
- gu_putc(' ', flin->out, flin->err);
+ if (flin->n_tokens > 0)
+ gu_putc(' ', flin->out, flin->err);
- PgfToken tok = gu_seq_get(toks, PgfToken, i);
- gu_string_write(tok, flin->out, flin->err);
-
- flin->n_tokens++;
- }
+ gu_string_write(tok, flin->out, flin->err);
+
+ flin->n_tokens++;
}
static void
@@ -626,10 +628,10 @@ pgf_file_lzn_expr_literal(PgfLinFuncs** funcs, PgfLiteral lit)
}
static PgfLinFuncs pgf_file_lin_funcs = {
- .symbol_tokens = pgf_file_lzn_symbol_tokens,
- .expr_literal = pgf_file_lzn_expr_literal,
- .begin_phrase = NULL,
- .end_phrase = NULL,
+ .symbol_token = pgf_file_lzn_symbol_token,
+ .expr_literal = pgf_file_lzn_expr_literal,
+ .begin_phrase = NULL,
+ .end_phrase = NULL,
};
void
diff --git a/src/runtime/c/pgf/linearizer.h b/src/runtime/c/pgf/linearizer.h
index bd143c1c2..ea240dc32 100644
--- a/src/runtime/c/pgf/linearizer.h
+++ b/src/runtime/c/pgf/linearizer.h
@@ -51,7 +51,7 @@ typedef struct PgfLinFuncs PgfLinFuncs;
struct PgfLinFuncs
{
/// Output tokens
- void (*symbol_tokens)(PgfLinFuncs** self, PgfTokens* toks);
+ void (*symbol_token)(PgfLinFuncs** self, PgfToken tok);
/// Output literal
void (*expr_literal)(PgfLinFuncs** self, PgfLiteral lit);
diff --git a/src/runtime/c/pgf/literals.c b/src/runtime/c/pgf/literals.c
index a11097781..7e0c664c6 100644
--- a/src/runtime/c/pgf/literals.c
+++ b/src/runtime/c/pgf/literals.c
@@ -42,7 +42,7 @@ pgf_match_string_lit(PgfConcr* concr, PgfItem* item, PgfToken tok,
gu_new_variant(PGF_LITERAL_STR,
PgfLiteralStr,
&expr_lit->lit, pool);
- lit_str->val = gu_seq_get(sks->tokens, PgfToken, 0);
+ lit_str->val = sks->token;
*out_ep = ep;
accepted = false;
@@ -80,10 +80,9 @@ pgf_match_int_lit(PgfConcr* concr, PgfItem* item, PgfToken tok,
} else if (n_syms == 1) {
PgfSymbolKS* sks =
gu_variant_data(gu_seq_get(seq, PgfSymbol, 0));
- PgfToken tok = gu_seq_get(sks->tokens, PgfToken, 0);
int val;
- if (!gu_string_to_int(tok, &val)) {
+ if (!gu_string_to_int(sks->token, &val)) {
*out_ep = NULL;
} else {
PgfExprProb* ep = gu_new(PgfExprProb, pool);
@@ -137,10 +136,9 @@ pgf_match_float_lit(PgfConcr* concr, PgfItem* item, PgfToken tok,
} else if (n_syms == 1) {
PgfSymbolKS* sks =
gu_variant_data(gu_seq_get(seq, PgfSymbol, 0));
- PgfToken tok = gu_seq_get(sks->tokens, PgfToken, 0);
double val;
- if (!gu_string_to_double(tok, &val)) {
+ if (!gu_string_to_double(sks->token, &val)) {
*out_ep = NULL;
} else {
PgfExprProb* ep = gu_new(PgfExprProb, pool);
@@ -209,9 +207,8 @@ pgf_match_name_lit(PgfConcr* concr, PgfItem* item, PgfToken tok,
PgfSymbol sym = gu_seq_get(seq, PgfSymbol, i);
gu_assert(gu_variant_tag(sym) == PGF_SYMBOL_KS);
PgfSymbolKS* sks = gu_variant_data(sym);
- PgfToken tok = gu_seq_get(sks->tokens, PgfToken, 0);
- gu_string_write(tok, out, err);
+ gu_string_write(sks->token, out, err);
}
PgfExprProb* ep = gu_new(PgfExprProb, pool);
diff --git a/src/runtime/c/pgf/parser.c b/src/runtime/c/pgf/parser.c
index 92c689fae..188672dd3 100644
--- a/src/runtime/c/pgf/parser.c
+++ b/src/runtime/c/pgf/parser.c
@@ -133,8 +133,8 @@ struct PgfItem {
PgfPArgs* args;
PgfSymbol curr_sym;
uint16_t seq_idx;
- uint8_t tok_idx;
- uint8_t alt;
+ uint8_t alt_idx; // position in the pre alternative
+ uint8_t alt; // the number of the alternative
prob_t inside_prob;
};
@@ -694,7 +694,7 @@ pgf_new_item(PgfItemConts* conts, PgfProduction prod,
item->prod = prod;
item->curr_sym = gu_null_variant;
item->seq_idx = 0;
- item->tok_idx = 0;
+ item->alt_idx = 0;
item->alt = 0;
conts->ref_count++;
@@ -758,8 +758,12 @@ pgf_item_update_arg(PgfItem* item, size_t d, PgfCCat *new_ccat,
static void
pgf_item_advance(PgfItem* item, GuPool* pool)
{
- item->seq_idx++;
- pgf_item_set_curr_symbol(item, pool);
+ if (GU_LIKELY(item->alt == 0)) {
+ item->seq_idx++;
+ pgf_item_set_curr_symbol(item, pool);
+ }
+ else
+ item->alt_idx++;
}
static void
@@ -1133,8 +1137,7 @@ pgf_parsing_meta_scan(PgfParseState* before, PgfParseState* after,
gu_alignof(PgfSymbolKS),
&item->curr_sym, after->ps->pool);
*((PgfSymbol*)(sks+1)) = prev;
- sks->tokens = gu_new_seq(PgfToken, 1, after->ps->pool);
- gu_seq_set(sks->tokens, PgfToken, 0, tok);
+ sks->token = tok;
gu_buf_heap_push(before->agenda, &pgf_item_prob_order, &item);
}
@@ -1218,76 +1221,54 @@ pgf_parsing_symbol(PgfParseState* before, PgfParseState* after,
case PGF_SYMBOL_KS: {
if (after != NULL) {
PgfSymbolKS* sks = gu_variant_data(sym);
- gu_assert(item->tok_idx < gu_seq_length(sks->tokens));
- PgfToken tok =
- gu_seq_get(sks->tokens, PgfToken, item->tok_idx++);
- if (item->tok_idx == gu_seq_length(sks->tokens)) {
- item->tok_idx = 0;
- pgf_item_advance(item, after->ps->pool);
- }
- pgf_parsing_add_transition(before, after, tok, item);
+ pgf_item_advance(item, after->ps->pool);
+ pgf_parsing_add_transition(before, after, sks->token, item);
}
break;
}
case PGF_SYMBOL_KP: {
if (after != NULL) {
PgfSymbolKP* skp = gu_variant_data(sym);
- size_t idx = item->tok_idx;
- uint8_t alt = item->alt;
- gu_assert(idx < gu_seq_length(skp->default_form));
- if (idx == 0) {
- PgfToken tok;
+
+ PgfSymbol sym;
+ if (item->alt == 0) {
PgfItem* new_item;
-
- tok = gu_seq_get(skp->default_form, PgfToken, 0);
+
new_item = pgf_item_copy(item, after->ps->pool, after->ps);
- new_item->tok_idx++;
- if (new_item->tok_idx == gu_seq_length(skp->default_form)) {
- new_item->tok_idx = 0;
- pgf_item_advance(new_item, after->ps->pool);
- }
- pgf_parsing_add_transition(before, after, tok, new_item);
+ new_item->alt = 1;
+ new_item->alt_idx = 0;
+ sym = gu_seq_get(skp->default_form, PgfSymbol, new_item->alt_idx);
+ pgf_parsing_symbol(before, after, new_item, sym);
for (size_t i = 0; i < skp->n_forms; i++) {
- // XXX: do nubbing properly
- PgfTokens* toks = skp->forms[i].form;
- PgfTokens* toks2 = skp->default_form;
- bool skip = pgf_tokens_equal(toks, toks2);
+ PgfSequence* syms = skp->forms[i].form;
+ PgfSequence* syms2 = skp->default_form;
+ bool skip = false; /*pgf_tokens_equal(toks, toks2);
for (size_t j = 0; j < i; j++) {
PgfTokens* toks2 = skp->forms[j].form;
skip |= pgf_tokens_equal(toks, toks2);
- }
+ }*/
if (!skip) {
- tok = gu_seq_get(toks, PgfToken, 0);
new_item = pgf_item_copy(item, after->ps->pool, after->ps);
- new_item->tok_idx++;
- new_item->alt = i;
- if (new_item->tok_idx == gu_seq_length(toks)) {
- new_item->tok_idx = 0;
- pgf_item_advance(new_item, after->ps->pool);
- }
- pgf_parsing_add_transition(before, after, tok, new_item);
+ new_item->alt = i+2;
+ new_item->alt_idx = 0;
+ sym = gu_seq_get(syms, PgfSymbol, new_item->alt_idx);
+ pgf_parsing_symbol(before, after, new_item, sym);
}
}
- } else if (alt == 0) {
- PgfToken tok =
- gu_seq_get(skp->default_form, PgfToken, idx);
- item->tok_idx++;
- if (item->tok_idx == gu_seq_length(skp->default_form)) {
- item->tok_idx = 0;
- pgf_item_advance(item, after->ps->pool);
- }
- pgf_parsing_add_transition(before, after, tok, item);
} else {
- gu_assert(alt <= skp->n_forms);
- PgfTokens* toks = skp->forms[alt - 1].form;
- PgfToken tok = gu_seq_get(toks, PgfToken, idx);
- item->tok_idx++;
- if (item->tok_idx == gu_seq_length(toks)) {
- item->tok_idx = 0;
+ PgfSequence* syms =
+ (item->alt == 1) ? skp->default_form :
+ skp->forms[item->alt-2].form;
+
+ if (item->alt_idx < gu_seq_length(syms)) {
+ sym = gu_seq_get(syms, PgfSymbol, item->alt_idx);
+ pgf_parsing_symbol(before, after, item, sym);
+ } else {
+ item->alt = 0;
pgf_item_advance(item, after->ps->pool);
+ gu_buf_heap_push(before->agenda, &pgf_item_prob_order, &item);
}
- pgf_parsing_add_transition(before, after, tok, item);
}
}
break;
@@ -1357,7 +1338,7 @@ pgf_parsing_symbol(PgfParseState* before, PgfParseState* after,
// XXX TODO proper support
break;
case PGF_SYMBOL_NE: {
- // Nothing to be done here
+ pgf_item_free(before, after, item);
break;
}
default:
@@ -1450,8 +1431,7 @@ pgf_parsing_item(PgfParseState* before, PgfParseState* after, PgfItem* item)
gu_alignof(PgfSymbolKS),
&item->curr_sym, after->ps->pool);
*((PgfSymbol*)(sks+1)) = prev;
- sks->tokens = gu_new_seq(PgfToken, 1, after->ps->pool);
- gu_seq_set(sks->tokens, PgfToken, 0, tok);
+ sks->token = tok;
item->seq_idx++;
pgf_parsing_add_transition(before, after, tok, item);
@@ -1755,9 +1735,7 @@ typedef struct {
} PgfPrefixTokenState;
static GuString
-pgf_get_tokens(PgfSequence* seq,
- uint16_t seq_idx, uint8_t tok_idx,
- GuPool* pool)
+pgf_get_tokens(PgfSequence* seq, uint16_t seq_idx, GuPool* pool)
{
GuPool* tmp_pool = gu_new_pool();
GuExn* err = gu_new_exn(NULL, gu_kind(type), tmp_pool);
@@ -1773,17 +1751,7 @@ pgf_get_tokens(PgfSequence* seq,
switch (i.tag) {
case PGF_SYMBOL_KS: {
PgfSymbolKS* symks = i.data;
- size_t len = gu_seq_length(symks->tokens);
- for (size_t i = tok_idx; i < len; i++) {
- if (i > 0) {
- gu_putc(' ', out, err);
- }
-
- PgfToken tok = gu_seq_get(symks->tokens, PgfToken, i);
- gu_string_write(tok, out, err);
- }
-
- tok_idx = 0;
+ gu_string_write(symks->token, out, err);
}
default:
goto end;
@@ -1809,18 +1777,9 @@ pgf_prefix_match_token(PgfTokenState* ts0, PgfToken tok, PgfItem* item)
PgfSequence* seq;
pgf_item_sequence(item, &lin_idx, &seq, ts->pool);
- uint16_t seq_idx = item->seq_idx;
- uint8_t tok_idx = item->tok_idx;
-
- // go one token back
- if (tok_idx > 0)
- tok_idx--;
- else
- seq_idx--;
-
ts->tp = gu_new(PgfTokenProb, ts->pool);
ts->tp->tok =
- pgf_get_tokens(seq, seq_idx, tok_idx, ts->pool);
+ pgf_get_tokens(seq, item->seq_idx-1, ts->pool);
ts->tp->cat = item->conts->ccat->cnccat->abscat->name;
ts->tp->prob = item->inside_prob+item->conts->outside_prob;
}
@@ -2346,17 +2305,15 @@ pgf_morpho_iter(GuMapItor* fn, const void* key, void* value, GuExn* err)
switch (i.tag) {
case PGF_SYMBOL_KS: {
PgfSymbolKS* symks = i.data;
- size_t len = gu_seq_length(symks->tokens);
- for (size_t i = 0; i < len; i++) {
- if (pos >= gu_seq_length(clo->tokens))
- goto cont;
-
- PgfToken tok1 = gu_seq_get(symks->tokens, PgfToken, i);
- PgfToken tok2 = gu_seq_get(clo->tokens, PgfToken, pos++);
-
- if (!gu_string_eq(tok1, tok2))
- goto cont;
- }
+
+ if (pos >= gu_seq_length(clo->tokens))
+ goto cont;
+
+ PgfToken tok1 = symks->token;
+ PgfToken tok2 = gu_seq_get(clo->tokens, PgfToken, pos++);
+
+ if (!gu_string_eq(tok1, tok2))
+ goto cont;
}
default:
continue;
@@ -2443,7 +2400,7 @@ pgf_fullform_iter(GuMapItor* fn, const void* key, void* value, GuExn* err)
PgfProductionApply* papp = i.data;
PgfSequence* seq = papp->fun->lins[cfc.lin_idx];
- GuString tokens = pgf_get_tokens(seq, 0, 0, st->pool);
+ GuString tokens = pgf_get_tokens(seq, 0, st->pool);
// create a new production index with keys that
// are multiword units
@@ -2531,12 +2488,10 @@ pgf_fullform_get_analyses(PgfFullFormEntry* entry,
static void
pgf_parser_index_token(PgfConcr* concr,
- PgfTokens* tokens,
+ PgfToken tok,
PgfCCat* ccat, size_t lin_idx, PgfProduction prod,
GuPool *pool)
{
- PgfToken tok = gu_seq_get(tokens, PgfToken, 0);
-
PgfProductionIdx* set =
gu_map_get(concr->leftcorner_tok_idx, &tok, PgfProductionIdx*);
if (set == NULL) {
@@ -2570,6 +2525,47 @@ pgf_parser_index_epsilon(PgfConcr* concr,
gu_buf_push(prods, PgfProduction, prod);
}
+static void
+pgf_parser_index_symbol(PgfConcr* concr, PgfSymbol sym,
+ PgfCCat* ccat, size_t lin_idx, PgfProduction prod,
+ GuPool *pool)
+{
+ GuVariantInfo i = gu_variant_open(sym);
+ switch (i.tag) {
+ case PGF_SYMBOL_KS: {
+ PgfSymbolKS* sks = i.data;
+ pgf_parser_index_token(concr,
+ sks->token,
+ ccat, lin_idx, prod,
+ pool);
+ break;
+ }
+ case PGF_SYMBOL_KP: {
+ PgfSymbolKP* skp = i.data;
+ PgfSymbol sym =
+ gu_seq_get(skp->default_form, PgfSymbol, 0);
+ pgf_parser_index_symbol(concr, sym,
+ ccat, lin_idx, prod,
+ pool);
+ for (size_t i = 0; i < skp->n_forms; i++) {
+ sym = gu_seq_get(skp->forms[i].form, PgfSymbol, 0);
+ pgf_parser_index_symbol(concr, sym,
+ ccat, lin_idx, prod,
+ pool);
+ }
+ break;
+ }
+ case PGF_SYMBOL_CAT:
+ case PGF_SYMBOL_LIT:
+ case PGF_SYMBOL_NE:
+ case PGF_SYMBOL_VAR:
+ // Nothing to be done here
+ break;
+ default:
+ gu_impossible();
+ }
+}
+
void
pgf_parser_index(PgfConcr* concr,
PgfCCat* ccat, PgfProduction prod,
@@ -2586,39 +2582,9 @@ pgf_parser_index(PgfConcr* concr,
PgfSequence* seq = papp->fun->lins[lin_idx];
if (gu_seq_length(seq) > 0) {
- GuVariantInfo i = gu_variant_open(gu_seq_get(seq, PgfSymbol, 0));
- switch (i.tag) {
- case PGF_SYMBOL_KS: {
- PgfSymbolKS* sks = i.data;
- pgf_parser_index_token(concr,
- sks->tokens,
- ccat, lin_idx, prod,
- pool);
- break;
- }
- case PGF_SYMBOL_KP: {
- PgfSymbolKP* skp = i.data;
- pgf_parser_index_token(concr,
- skp->default_form,
- ccat, lin_idx, prod,
- pool);
- for (size_t i = 0; i < skp->n_forms; i++) {
- pgf_parser_index_token(concr,
- skp->forms[i].form,
- ccat, lin_idx, prod,
- pool);
- }
- break;
- }
- case PGF_SYMBOL_CAT:
- case PGF_SYMBOL_LIT:
- case PGF_SYMBOL_NE:
- case PGF_SYMBOL_VAR:
- // Nothing to be done here
- break;
- default:
- gu_impossible();
- }
+ pgf_parser_index_symbol(concr, gu_seq_get(seq, PgfSymbol, 0),
+ ccat, lin_idx, prod,
+ pool);
} else {
pgf_parser_index_epsilon(concr,
ccat, lin_idx, prod,
diff --git a/src/runtime/c/pgf/parseval.c b/src/runtime/c/pgf/parseval.c
index 84d93b346..8b38d252d 100644
--- a/src/runtime/c/pgf/parseval.c
+++ b/src/runtime/c/pgf/parseval.c
@@ -19,19 +19,14 @@ typedef struct {
} PgfMetricsLznState;
static void
-pgf_metrics_lzn_symbol_tokens(PgfLinFuncs** funcs, PgfTokens* toks)
+pgf_metrics_lzn_symbol_token(PgfLinFuncs** funcs, PgfToken tok)
{
PgfMetricsLznState* state = gu_container(funcs, PgfMetricsLznState, funcs);
-
- size_t len = gu_seq_length(toks);
- for (size_t i = 0; i < len; i++) {
- PgfToken tok = gu_seq_get(toks, PgfToken, i);
-
- if (state->ps != NULL)
- state->ps = pgf_parser_next_state(state->ps, tok);
+
+ if (state->ps != NULL)
+ state->ps = pgf_parser_next_state(state->ps, tok);
- state->pos++;
- }
+ state->pos++;
}
static void
@@ -128,17 +123,17 @@ pgf_metrics_lzn_end_phrase2(PgfLinFuncs** funcs, PgfCId cat, int fid, int lin_id
}
static PgfLinFuncs pgf_metrics_lin_funcs1 = {
- .symbol_tokens = pgf_metrics_lzn_symbol_tokens,
- .expr_literal = pgf_metrics_lzn_expr_literal,
- .begin_phrase = pgf_metrics_lzn_begin_phrase,
- .end_phrase = pgf_metrics_lzn_end_phrase1
+ .symbol_token = pgf_metrics_lzn_symbol_token,
+ .expr_literal = pgf_metrics_lzn_expr_literal,
+ .begin_phrase = pgf_metrics_lzn_begin_phrase,
+ .end_phrase = pgf_metrics_lzn_end_phrase1
};
static PgfLinFuncs pgf_metrics_lin_funcs2 = {
- .symbol_tokens = pgf_metrics_lzn_symbol_tokens,
- .expr_literal = pgf_metrics_lzn_expr_literal,
- .begin_phrase = pgf_metrics_lzn_begin_phrase,
- .end_phrase = pgf_metrics_lzn_end_phrase2
+ .symbol_token = pgf_metrics_lzn_symbol_token,
+ .expr_literal = pgf_metrics_lzn_expr_literal,
+ .begin_phrase = pgf_metrics_lzn_begin_phrase,
+ .end_phrase = pgf_metrics_lzn_end_phrase2
};
bool
diff --git a/src/runtime/c/pgf/printer.c b/src/runtime/c/pgf/printer.c
index 79aac5afd..82ce0bf45 100644
--- a/src/runtime/c/pgf/printer.c
+++ b/src/runtime/c/pgf/printer.c
@@ -196,19 +196,16 @@ pgf_print_cncfun(PgfCncFun *cncfun, PgfSequences* sequences,
}
static void
-pgf_print_tokens(PgfTokens* tokens, GuOut *out, GuExn *err)
+pgf_print_token(PgfToken tok, GuOut *out, GuExn *err)
{
gu_putc('"', out, err);
- size_t n_toks = gu_seq_length(tokens);
- for (size_t i = 0; i < n_toks; i++) {
- if (i > 0) gu_putc(' ', out, err);
-
- PgfToken tok = gu_seq_get(tokens, PgfToken, i);
- gu_string_write(tok, out, err);
- }
+ gu_string_write(tok, out, err);
gu_putc('"', out, err);
}
+static void
+pgf_print_sequence(PgfSequence* seq, GuOut *out, GuExn *err);
+
void
pgf_print_symbol(PgfSymbol sym, GuOut *out, GuExn *err)
{
@@ -220,18 +217,18 @@ pgf_print_symbol(PgfSymbol sym, GuOut *out, GuExn *err)
}
case PGF_SYMBOL_KS: {
PgfSymbolKS* sks = gu_variant_data(sym);
- pgf_print_tokens(sks->tokens, out, err);
+ pgf_print_token(sks->token, out, err);
break;
}
case PGF_SYMBOL_KP: {
PgfSymbolKP* skp = gu_variant_data(sym);
gu_puts("pre {", out, err);
- pgf_print_tokens(skp->default_form, out, err);
+ pgf_print_sequence(skp->default_form, out, err);
for (size_t i = 0; i < skp->n_forms; i++) {
gu_puts("; ", out, err);
- pgf_print_tokens(skp->forms[i].form, out, err);
+ pgf_print_sequence(skp->forms[i].form, out, err);
gu_puts(" / ", out, err);
size_t n_prefixes = gu_seq_length(skp->forms[i].prefixes);
@@ -262,16 +259,18 @@ pgf_print_symbol(PgfSymbol sym, GuOut *out, GuExn *err)
gu_puts("nonExist", out, err);
break;
}
+ case PGF_SYMBOL_BIND: {
+ gu_puts("BIND", out, err);
+ break;
+ }
default:
gu_impossible();
}
}
static void
-pgf_print_sequence(size_t seqid, PgfSequence* seq, GuOut *out, GuExn *err)
+pgf_print_sequence(PgfSequence* seq, GuOut *out, GuExn *err)
{
- gu_printf(out,err," S%d := ", seqid);
-
int n_syms = gu_seq_length(seq);
for (int i = 0; i < n_syms; i++) {
if (i > 0) gu_putc(' ', out, err);
@@ -279,8 +278,6 @@ pgf_print_sequence(size_t seqid, PgfSequence* seq, GuOut *out, GuExn *err)
PgfSymbol sym = gu_seq_get(seq, PgfSymbol, i);
pgf_print_symbol(sym, out, err);
}
-
- gu_putc('\n', out, err);
}
static void
@@ -342,7 +339,10 @@ pgf_print_concrete(PgfCId cncname, PgfConcr* concr,
size_t n_seqs = gu_seq_length(concr->sequences);
for (size_t i = 0; i < n_seqs; i++) {
PgfSequence* seq = gu_seq_get(concr->sequences, PgfSequence*, i);
- pgf_print_sequence(i, seq, out, err);
+
+ gu_printf(out,err," S%d := ", i);
+ pgf_print_sequence(seq, out, err);
+ gu_putc('\n', out, err);
}
gu_puts(" categories\n", out, err);
diff --git a/src/runtime/c/pgf/reader.c b/src/runtime/c/pgf/reader.c
index 95b5a4c04..ebc5050e4 100644
--- a/src/runtime/c/pgf/reader.c
+++ b/src/runtime/c/pgf/reader.c
@@ -586,27 +586,13 @@ pgf_read_printnames(PgfReader* rdr)
return printnames;
}
-static PgfTokens*
-pgf_read_tokens(PgfReader* rdr)
-{
- size_t len = pgf_read_len(rdr);
- gu_return_on_exn(rdr->err, NULL);
-
- PgfTokens* tokens = gu_new_seq(PgfToken, len, rdr->opool);
- for (size_t i = 0; i < len; i++) {
- PgfToken token = pgf_read_string(rdr);
- gu_return_on_exn(rdr->err, NULL);
-
- gu_seq_set(tokens, PgfToken, i, token);
- }
-
- return tokens;
-}
+static PgfSequence*
+pgf_read_sequence(PgfReader* rdr);
static void
pgf_read_alternative(PgfReader* rdr, PgfAlternative* alt)
{
- alt->form = pgf_read_tokens(rdr);
+ alt->form = pgf_read_sequence(rdr);
gu_return_on_exn(rdr->err,);
size_t n_prefixes = pgf_read_len(rdr);
@@ -672,12 +658,12 @@ pgf_read_symbol(PgfReader* rdr)
gu_new_variant(PGF_SYMBOL_KS,
PgfSymbolKS,
&sym, rdr->opool);
- sym_ks->tokens = pgf_read_tokens(rdr);
+ sym_ks->token = pgf_read_string(rdr);
gu_return_on_exn(rdr->err, gu_null_variant);
break;
}
case PGF_SYMBOL_KP: {
- PgfTokens* default_form = pgf_read_tokens(rdr);
+ PgfSequence* default_form = pgf_read_sequence(rdr);
gu_return_on_exn(rdr->err, gu_null_variant);
size_t n_forms = pgf_read_len(rdr);
@@ -703,6 +689,13 @@ pgf_read_symbol(PgfReader* rdr)
gu_return_on_exn(rdr->err, gu_null_variant);
break;
}
+ case PGF_SYMBOL_BIND: {
+ gu_new_variant(PGF_SYMBOL_BIND,
+ PgfSymbolBIND,
+ &sym, rdr->opool);
+ gu_return_on_exn(rdr->err, gu_null_variant);
+ break;
+ }
default:
pgf_read_tag_error(rdr);
}