static void pgf_print_productions(GuMapItor* fn, const void* key, void* value, GuExn* err) { PgfPrintFn* clo = (PgfPrintFn*) fn; int fid = *((int *) key); PgfCCat* ccat = *((PgfCCat**) value); GuWriter *wtr = clo->wtr; if (!gu_seq_is_null(ccat->prods)) { size_t n_prods = gu_seq_length(ccat->prods); for (size_t i = 0; i < n_prods; i++) { PgfProduction prod = gu_seq_get(ccat->prods, PgfProduction, i); gu_printf(wtr,err," C%d -> ",fid); GuVariantInfo i = gu_variant_open(prod); switch (i.tag) { case PGF_PRODUCTION_APPLY: { PgfProductionApply* papp = i.data; gu_printf(wtr,err,"F%d[",papp->fun->funid); size_t n_args = gu_seq_length(papp->args); for (size_t j = 0; j < n_args; j++) { if (j > 0) gu_putc(',',wtr,err); PgfPArg arg = gu_seq_get(papp->args, PgfPArg, j); if (arg.hypos != NULL) { size_t n_hypos = gu_list_length(arg.hypos); for (size_t k = 0; k < n_hypos; k++) { if (k > 0) gu_putc(' ',wtr,err); PgfCCat *hypo = gu_list_index(arg.hypos, k); gu_printf(wtr,err,"C%d",hypo->fid); } } gu_printf(wtr,err,"C%d",arg.ccat->fid); } gu_printf(wtr,err,"]\n"); break; } case PGF_PRODUCTION_COERCE: { PgfProductionCoerce* pcoerce = i.data; gu_printf(wtr,err,"_[C%d]\n",pcoerce->coerce->fid); break; } default: gu_impossible(); } } } }
bool pgf_tokens_equal(PgfTokens t1, PgfTokens t2) { size_t len1 = gu_seq_length(t1); size_t len2 = gu_seq_length(t2); if (len1 != len2) { return false; } for (size_t i = 0; i < len1; i++) { GuString s1 = gu_seq_get(t1, PgfToken, i); GuString s2 = gu_seq_get(t2, PgfToken, i); if (!gu_string_eq(s1, s2)) { return false; } } return true; }
static void pgf_print_tokens(PgfTokens tokens, GuWriter *wtr, GuExn *err) { gu_putc('"', wtr, err); size_t n_toks = gu_seq_length(tokens); for (size_t i = 0; i < n_toks; i++) { if (i > 0) gu_putc(' ', wtr, err); PgfToken tok = gu_seq_get(tokens, PgfToken, i); gu_string_write(tok, wtr, err); } gu_putc('"', wtr, err); }
static void pgf_metrics_lzn_symbol_tokens(PgfLinFuncs** funcs, PgfTokens toks) { 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, state->pool); state->pos++; } }
static void pgf_print_sequence(size_t seqid, PgfSequence seq, GuWriter *wtr, GuExn *err) { gu_printf(wtr,err," S%d := ", seqid); int n_syms = gu_seq_length(seq); for (int i = 0; i < n_syms; i++) { if (i > 0) gu_putc(' ', wtr, err); PgfSymbol sym = gu_seq_get(seq, PgfSymbol, i); pgf_print_symbol(sym, wtr, err); } gu_putc('\n', wtr, err); }
static void pgf_lookup_index_syms(GuMap* lexicon_idx, PgfSymbols* syms, PgfAbsFun* absfun, GuPool* pool) { size_t n_syms = gu_seq_length(syms); for (size_t j = 0; j < n_syms; j++) { PgfSymbol sym = gu_seq_get(syms, PgfSymbol, j); GuVariantInfo i = gu_variant_open(sym); switch (i.tag) { case PGF_SYMBOL_KP: { PgfSymbolKP* skp = (PgfSymbolKP*) i.data; pgf_lookup_index_syms(lexicon_idx, skp->default_form, absfun, pool); for (size_t k = 0; k < skp->n_forms; k++) { pgf_lookup_index_syms(lexicon_idx, skp->forms[k].form, absfun, pool); } break; } case PGF_SYMBOL_KS: { PgfSymbolKS* sks = (PgfSymbolKS*) i.data; GuBuf* funs = gu_map_get(lexicon_idx, sks->token, GuBuf*); if (funs == NULL) { funs = gu_new_buf(PgfAbsFun*, pool); gu_map_put(lexicon_idx, sks->token, GuBuf*, funs); } bool found = false; size_t n_funs = gu_buf_length(funs); for (size_t l = 0; l < n_funs; l++) { PgfAbsFun* absfun1 = gu_buf_get(funs, PgfAbsFun*, l); if (absfun1 == absfun) { found = true; break; } } if (!found) gu_buf_push(funs, PgfAbsFun*, absfun); break; } } }