summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkr.angelov <kr.angelov@gmail.com>2012-04-18 15:50:55 +0000
committerkr.angelov <kr.angelov@gmail.com>2012-04-18 15:50:55 +0000
commit931066f6fc004c7a193e5200d13ea651c7e02fd1 (patch)
treedbea5ced5c0af774d03802cbf36e7b2db70a1f82
parent17bc8e5c89805f5971e46f8f45c5e4eda970c561 (diff)
yet another fix for parsing literals
-rw-r--r--src/runtime/c/pgf/literals.c131
1 files changed, 83 insertions, 48 deletions
diff --git a/src/runtime/c/pgf/literals.c b/src/runtime/c/pgf/literals.c
index 1959d5c97..985e29f1b 100644
--- a/src/runtime/c/pgf/literals.c
+++ b/src/runtime/c/pgf/literals.c
@@ -14,15 +14,24 @@ static bool
pgf_match_string_lit(PgfConcr* concr, PgfItem* item, PgfToken tok,
PgfExprProb** out_ep, GuPool *pool)
{
- gu_assert(pgf_item_lin_idx(item) == 0);
+ GuPool* tmp_pool = gu_new_pool();
+
+ int lin_idx;
+ PgfSequence seq;
+ pgf_item_sequence(item, &lin_idx, &seq, tmp_pool);
+ gu_assert(lin_idx == 0);
- int n_syms = pgf_item_sequence_length(item);
+ bool accepted = false;
+ int n_syms = gu_seq_length(seq);
if (n_syms == 0) {
*out_ep = NULL;
- return true;
+ accepted = true;
} else if (n_syms == 1) {
PgfExprProb* ep = gu_new(PgfExprProb, pool);
ep->prob = 0;
+
+ PgfSymbolKS* sks =
+ gu_variant_data(gu_seq_get(seq, PgfSymbol, 0));
PgfExprLit *expr_lit =
gu_new_variant(PGF_EXPR_LIT,
@@ -32,14 +41,16 @@ pgf_match_string_lit(PgfConcr* concr, PgfItem* item, PgfToken tok,
gu_new_variant(PGF_LITERAL_STR,
PgfLiteralStr,
&expr_lit->lit, pool);
- lit_str->val = tok;
+ lit_str->val = gu_seq_get(sks->tokens, PgfToken, 0);
*out_ep = ep;
- return false;
+ accepted = false;
} else {
*out_ep = NULL;
- return false;
}
+
+ gu_pool_free(tmp_pool);
+ return accepted;
}
static PgfLiteralCallback pgf_string_literal_callback =
@@ -51,40 +62,52 @@ static bool
pgf_match_int_lit(PgfConcr* concr, PgfItem* item, PgfToken tok,
PgfExprProb** out_ep, GuPool *pool)
{
- gu_assert(pgf_item_lin_idx(item) == 0);
+ GuPool* tmp_pool = gu_new_pool();
+
+ int lin_idx;
+ PgfSequence seq;
+ pgf_item_sequence(item, &lin_idx, &seq, tmp_pool);
+ gu_assert(lin_idx == 0);
- size_t n_syms = pgf_item_sequence_length(item);
+ bool accepted = false;
+ int n_syms = gu_seq_length(seq);
if (n_syms == 0) {
int val;
*out_ep = NULL;
- return gu_string_to_int(tok, &val);
+ accepted = gu_string_to_int(tok, &val);
} 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)) {
*out_ep = NULL;
- return false;
+ } else {
+ PgfExprProb* ep = gu_new(PgfExprProb, pool);
+ ep->prob = 0;
+
+ PgfExprLit *expr_lit =
+ gu_new_variant(PGF_EXPR_LIT,
+ PgfExprLit,
+ &ep->expr, pool);
+ PgfLiteralInt *lit_int =
+ gu_new_variant(PGF_LITERAL_INT,
+ PgfLiteralInt,
+ &expr_lit->lit, pool);
+ lit_int->val = val;
+
+ *out_ep = ep;
}
-
- PgfExprProb* ep = gu_new(PgfExprProb, pool);
- ep->prob = 0;
-
- PgfExprLit *expr_lit =
- gu_new_variant(PGF_EXPR_LIT,
- PgfExprLit,
- &ep->expr, pool);
- PgfLiteralInt *lit_int =
- gu_new_variant(PGF_LITERAL_INT,
- PgfLiteralInt,
- &expr_lit->lit, pool);
- lit_int->val = val;
-
- *out_ep = ep;
- return false;
+
+ accepted = false;
} else {
*out_ep = NULL;
- return false;
}
+
+ gu_pool_free(tmp_pool);
+ return accepted;
}
static PgfLiteralCallback pgf_int_literal_callback =
@@ -96,40 +119,52 @@ static bool
pgf_match_float_lit(PgfConcr* concr, PgfItem* item, PgfToken tok,
PgfExprProb** out_ep, GuPool *pool)
{
- gu_assert(pgf_item_lin_idx(item) == 0);
+ GuPool* tmp_pool = gu_new_pool();
+
+ int lin_idx;
+ PgfSequence seq;
+ pgf_item_sequence(item, &lin_idx, &seq, tmp_pool);
+ gu_assert(lin_idx == 0);
- size_t n_syms = pgf_item_sequence_length(item);
+ bool accepted = false;
+ int n_syms = gu_seq_length(seq);
if (n_syms == 0) {
double val;
*out_ep = NULL;
- return gu_string_to_double(tok, &val);
+ accepted = gu_string_to_double(tok, &val);
} 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)) {
*out_ep = NULL;
- return false;
+ } else {
+ PgfExprProb* ep = gu_new(PgfExprProb, pool);
+ ep->prob = 0;
+
+ PgfExprLit *expr_lit =
+ gu_new_variant(PGF_EXPR_LIT,
+ PgfExprLit,
+ &ep->expr, pool);
+ PgfLiteralFlt *lit_flt =
+ gu_new_variant(PGF_LITERAL_FLT,
+ PgfLiteralFlt,
+ &expr_lit->lit, pool);
+ lit_flt->val = val;
+
+ *out_ep = ep;
}
-
- PgfExprProb* ep = gu_new(PgfExprProb, pool);
- ep->prob = 0;
-
- PgfExprLit *expr_lit =
- gu_new_variant(PGF_EXPR_LIT,
- PgfExprLit,
- &ep->expr, pool);
- PgfLiteralFlt *lit_flt =
- gu_new_variant(PGF_LITERAL_FLT,
- PgfLiteralFlt,
- &expr_lit->lit, pool);
- lit_flt->val = val;
-
- *out_ep = ep;
- return false;
+
+ accepted = false;
} else {
*out_ep = NULL;
- return false;
}
+
+ gu_pool_free(tmp_pool);
+ return accepted;
}
static PgfLiteralCallback pgf_float_literal_callback =