From 0882396875e26995ef996890e022acc3662eb70f Mon Sep 17 00:00:00 2001 From: "kr.angelov" Date: Wed, 23 Oct 2013 14:49:28 +0000 Subject: tabular linearization in the C and Java runtimes --- src/runtime/c/pgf/data.h | 1 - src/runtime/c/pgf/linearizer.c | 29 +++++++++++++++++++++++++++++ src/runtime/c/pgf/linearizer.h | 5 +++++ src/runtime/c/pgf/pgf.h | 1 + 4 files changed, 35 insertions(+), 1 deletion(-) (limited to 'src/runtime/c') diff --git a/src/runtime/c/pgf/data.h b/src/runtime/c/pgf/data.h index 0dae42491..163d45d95 100644 --- a/src/runtime/c/pgf/data.h +++ b/src/runtime/c/pgf/data.h @@ -128,7 +128,6 @@ typedef struct { extern GU_DECLARE_TYPE(PgfCncCat, abstract); -typedef GuString PgfToken; typedef GuSeq PgfTokens; bool diff --git a/src/runtime/c/pgf/linearizer.c b/src/runtime/c/pgf/linearizer.c index 0465b6e1c..9a57de5fc 100644 --- a/src/runtime/c/pgf/linearizer.c +++ b/src/runtime/c/pgf/linearizer.c @@ -677,6 +677,35 @@ pgf_lzr_linearize_simple(PgfConcr* concr, PgfCncTree ctree, pgf_lzr_linearize(concr, ctree, lin_idx, &flin.funcs); } +void +pgf_lzr_linearize_table(PgfConcr* concr, PgfCncTree ctree, + size_t* n_lins, GuString** labels) +{ + static GuString s_label = "s"; + + GuVariantInfo cti = gu_variant_open(ctree); + + switch (cti.tag) { + case PGF_CNC_TREE_APP: { + PgfCncTreeApp* fapp = cti.data; + PgfCncCat* cnccat = + gu_map_get(concr->cnccats, fapp->fun->absfun->type->cid, PgfCncCat*); + *n_lins = cnccat->n_lins; + *labels = cnccat->labels; + break; + } + case PGF_CNC_TREE_LIT: + case PGF_CNC_TREE_CHUNKS: { + *n_lins = 1; + *labels = &s_label; + break; + } + default: + gu_impossible(); + } + +} + GuString pgf_get_tokens(PgfSymbols* syms, uint16_t sym_idx, GuPool* pool) { diff --git a/src/runtime/c/pgf/linearizer.h b/src/runtime/c/pgf/linearizer.h index 1cc244575..65c02c48b 100644 --- a/src/runtime/c/pgf/linearizer.h +++ b/src/runtime/c/pgf/linearizer.h @@ -71,6 +71,11 @@ pgf_lzr_linearize(PgfConcr* concr, PgfCncTree ctree, size_t lin_idx, void pgf_lzr_linearize_simple(PgfConcr* concr, PgfCncTree ctree, size_t lin_idx, GuOut* out, GuExn* err); + + +void +pgf_lzr_linearize_table(PgfConcr* concr, PgfCncTree ctree, + size_t* n_lins, GuString** labels); #endif #ifdef PGF_PARSER_H_ diff --git a/src/runtime/c/pgf/pgf.h b/src/runtime/c/pgf/pgf.h index b586eb7b0..9ec63c4d6 100644 --- a/src/runtime/c/pgf/pgf.h +++ b/src/runtime/c/pgf/pgf.h @@ -35,6 +35,7 @@ typedef GuString PgfCId; extern GU_DECLARE_TYPE(PgfCId, typedef); +typedef GuString PgfToken; extern GU_DECLARE_TYPE(PgfExn, abstract); extern GU_DECLARE_TYPE(PgfParseError, abstract); -- cgit v1.2.3