summaryrefslogtreecommitdiff
path: root/src/runtime/c/pgf/literals.c
diff options
context:
space:
mode:
authorkr.angelov <kr.angelov@gmail.com>2012-04-12 06:55:25 +0000
committerkr.angelov <kr.angelov@gmail.com>2012-04-12 06:55:25 +0000
commit17bc8e5c89805f5971e46f8f45c5e4eda970c561 (patch)
tree57037efbd35ab9ec309a2e0d7183464e235a9e90 /src/runtime/c/pgf/literals.c
parent26ffcdbde8129b0a3695c41a59af52c73ce4aeea (diff)
some fixes in the robust parser and a new API for literals
Diffstat (limited to 'src/runtime/c/pgf/literals.c')
-rw-r--r--src/runtime/c/pgf/literals.c84
1 files changed, 43 insertions, 41 deletions
diff --git a/src/runtime/c/pgf/literals.c b/src/runtime/c/pgf/literals.c
index ffc5687fb..1959d5c97 100644
--- a/src/runtime/c/pgf/literals.c
+++ b/src/runtime/c/pgf/literals.c
@@ -1,4 +1,5 @@
#include <gu/read.h>
+#include <pgf/parser.h>
#include <pgf/literals.h>
#include <wctype.h>
@@ -10,18 +11,19 @@ GU_DEFINE_TYPE(PgfCallbacksMap, GuMap,
static bool
-pgf_match_string_lit(PgfLiteralCallback* self, int lin_idx, PgfTokens toks,
+pgf_match_string_lit(PgfConcr* concr, PgfItem* item, PgfToken tok,
PgfExprProb** out_ep, GuPool *pool)
{
- gu_assert(lin_idx == 0);
+ gu_assert(pgf_item_lin_idx(item) == 0);
- if (gu_seq_length(toks) == 1) {
+ int n_syms = pgf_item_sequence_length(item);
+ if (n_syms == 0) {
*out_ep = NULL;
return true;
- } else if (gu_seq_length(toks) == 2) {
+ } else if (n_syms == 1) {
PgfExprProb* ep = gu_new(PgfExprProb, pool);
ep->prob = 0;
-
+
PgfExprLit *expr_lit =
gu_new_variant(PGF_EXPR_LIT,
PgfExprLit,
@@ -30,7 +32,7 @@ pgf_match_string_lit(PgfLiteralCallback* self, int lin_idx, PgfTokens toks,
gu_new_variant(PGF_LITERAL_STR,
PgfLiteralStr,
&expr_lit->lit, pool);
- lit_str->val = gu_seq_get(toks, PgfToken, 0);
+ lit_str->val = tok;
*out_ep = ep;
return false;
@@ -46,22 +48,18 @@ static PgfLiteralCallback pgf_string_literal_callback =
static bool
-pgf_match_int_lit(PgfLiteralCallback* self, int lin_idx, PgfTokens toks,
+pgf_match_int_lit(PgfConcr* concr, PgfItem* item, PgfToken tok,
PgfExprProb** out_ep, GuPool *pool)
{
- gu_assert(lin_idx == 0);
-
- size_t n_toks = gu_seq_length(toks);
- if (n_toks == 1) {
- PgfToken tok = gu_seq_get(toks, PgfToken, 0);
+ gu_assert(pgf_item_lin_idx(item) == 0);
+ size_t n_syms = pgf_item_sequence_length(item);
+ if (n_syms == 0) {
int val;
*out_ep = NULL;
return gu_string_to_int(tok, &val);
- } else if (n_toks == 2) {
- PgfToken tok = gu_seq_get(toks, PgfToken, 0);
-
+ } else if (n_syms == 1) {
int val;
if (!gu_string_to_int(tok, &val)) {
*out_ep = NULL;
@@ -95,22 +93,18 @@ static PgfLiteralCallback pgf_int_literal_callback =
static bool
-pgf_match_float_lit(PgfLiteralCallback* self, int lin_idx, PgfTokens toks,
+pgf_match_float_lit(PgfConcr* concr, PgfItem* item, PgfToken tok,
PgfExprProb** out_ep, GuPool *pool)
{
- gu_assert(lin_idx == 0);
-
- size_t n_toks = gu_seq_length(toks);
- if (n_toks == 1) {
- PgfToken tok = gu_seq_get(toks, PgfToken, 0);
+ gu_assert(pgf_item_lin_idx(item) == 0);
+ size_t n_syms = pgf_item_sequence_length(item);
+ if (n_syms == 0) {
double val;
*out_ep = NULL;
return gu_string_to_double(tok, &val);
- } else if (n_toks == 2) {
- PgfToken tok = gu_seq_get(toks, PgfToken, 0);
-
+ } else if (n_syms == 1) {
double val;
if (!gu_string_to_double(tok, &val)) {
*out_ep = NULL;
@@ -144,37 +138,45 @@ static PgfLiteralCallback pgf_float_literal_callback =
static bool
-pgf_match_name_lit(PgfLiteralCallback* self, int lin_idx, PgfTokens toks,
+pgf_match_name_lit(PgfConcr* concr, PgfItem* item, PgfToken tok,
PgfExprProb** out_ep, GuPool *pool)
{
- gu_assert(lin_idx == 0);
-
- size_t n_toks = gu_seq_length(toks);
+ int lin_idx;
+ PgfSequence seq;
+ pgf_item_sequence(item, &lin_idx, &seq, pool);
- if (n_toks == 0) {
- *out_ep = NULL;
- return false;
- }
+ gu_assert(lin_idx == 0);
- PgfToken tok = gu_seq_get(toks, PgfToken, n_toks-1);
-
GuPool* tmp_pool = gu_new_pool();
- GuReader* rdr = gu_string_reader(tok, tmp_pool);
GuExn* err = gu_new_exn(NULL, gu_kind(type), tmp_pool);
- bool iscap = iswupper(gu_read_ucs(rdr, err));
- if (!iscap && n_toks > 1) {
+ GuString hyp = gu_str_string("-", tmp_pool);
+
+ bool iscap = false;
+ if (gu_string_eq(tok, hyp)) {
+ iscap = true;
+ } else if (!gu_string_eq(tok, gu_empty_string)) {
+ GuReader* rdr = gu_string_reader(tok, tmp_pool);
+ iscap = iswupper(gu_read_ucs(rdr, err));
+ }
+
+ size_t n_syms = gu_seq_length(seq);
+ if (!iscap && n_syms > 0) {
GuStringBuf *sbuf = gu_string_buf(tmp_pool);
GuWriter* wtr = gu_string_buf_writer(sbuf);
- for (size_t i = 0; i < n_toks-1; i++) {
+ for (size_t i = 0; i < n_syms; i++) {
if (i > 0)
gu_putc(' ', wtr, err);
- tok = gu_seq_get(toks, PgfToken, i);
+ 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, wtr, err);
}
-
+
PgfExprProb* ep = gu_new(PgfExprProb, pool);
ep->prob = 0;
@@ -196,7 +198,7 @@ pgf_match_name_lit(PgfLiteralCallback* self, int lin_idx, PgfTokens toks,
PgfLiteralStr,
&expr_lit->lit, pool);
lit_str->val = gu_string_buf_freeze(sbuf, pool);
-
+
*out_ep = ep;
}