From e748b9c4cbf32dc98249232e365951c14fbb68eb Mon Sep 17 00:00:00 2001 From: "Meredith L. Patterson" Date: Sat, 12 May 2012 21:26:15 +0100 Subject: [PATCH 1/2] Starting work on Scala-style left-recursion caching. --- src/hammer.c | 28 ---------------------------- src/hammer.h | 2 +- src/internal.h | 17 +++++++++++++++++ 3 files changed, 18 insertions(+), 29 deletions(-) diff --git a/src/hammer.c b/src/hammer.c index f6cffd8..e10fdd8 100644 --- a/src/hammer.c +++ b/src/hammer.c @@ -22,34 +22,6 @@ #include #include -parse_state_t* from(parse_state_t *ps, const size_t index) { - parse_state_t *ret = g_new(parse_state_t, 1); - *ret = *ps; - ret->input_stream.index += index; - return ret; -} - -const uint8_t* substring(const parse_state_t *ps, const size_t start, const size_t end) { - if (end > start && (ps->input_stream.index + end) < ps->input_stream.length) { - gpointer ret = g_malloc(end - start); - memcpy(ret, ps->input_stream.input, end - start); - return (const uint8_t*)ret; - } else { - return NULL; - } -} - -const GVariant* at(parse_state_t *ps, const size_t index) { - GVariant *ret = NULL; - if (index + ps->input_stream.index < ps->input_stream.length) - ret = g_variant_new_byte((ps->input_stream.input)[index + ps->input_stream.index]); - return g_variant_new_maybe(G_VARIANT_TYPE_BYTE, ret); -} - -const gchar* to_string(parse_state_t *ps) { - return g_strescape((const gchar*)(ps->input_stream.input), NULL); -} - guint djbhash(const uint8_t *buf, size_t len) { guint hash = 5381; while (len--) { diff --git a/src/hammer.h b/src/hammer.h index 57a0aeb..6e1cb77 100644 --- a/src/hammer.h +++ b/src/hammer.h @@ -70,7 +70,7 @@ typedef struct parsed_token { uint64_t uint; double dbl; float flt; - GSequence *seq; + GSequence *seq; // a sequence of parsed_token_t's }; } parsed_token_t; diff --git a/src/internal.h b/src/internal.h index 771a0ee..decd721 100644 --- a/src/internal.h +++ b/src/internal.h @@ -11,6 +11,23 @@ typedef struct parser_cache_key { const parser_t *parser; } parser_cache_key_t; +typedef enum parser_cache_value_type { + PC_BASE, + PC_IN_RECURSION, + PC_LRESULT, + PC_RESULT +} parser_cache_value_type_t; + +typedef struct parser_cache_value { + parser_cache_value_type_t value_type; + union { + int base; + parse_result_t *in_recursion; + parse_result_t *lresult; + parse_result_t *result; + }; +} parser_cache_value_t; + typedef unsigned int *charset; static inline charset new_charset() { From 7de4b51e92eb4fbca73de6a303914eb6917482fe Mon Sep 17 00:00:00 2001 From: "Meredith L. Patterson" Date: Sat, 12 May 2012 21:41:28 +0100 Subject: [PATCH 2/2] dummy helpers added for ignore and optional --- src/hammer.c | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/hammer.c b/src/hammer.c index b59b863..09358d4 100644 --- a/src/hammer.c +++ b/src/hammer.c @@ -443,8 +443,27 @@ const parser_t* xor(const parser_t* p1, const parser_t* p2) { const parser_t* repeat0(const parser_t* p) { return NULL; } const parser_t* repeat1(const parser_t* p) { return NULL; } const parser_t* repeat_n(const parser_t* p, const size_t n) { return NULL; } -const parser_t* optional(const parser_t* p) { return NULL; } -const parser_t* ignore(const parser_t* p) { return NULL; } + +static parse_result_t* parse_optional(void *env, parse_state_t *state) { + return NULL; +} + +const parser_t* optional(const parser_t* p) { + parser_t *ret = g_new(parser_t, 1); + ret->fn = parse_optional; ret->env = NULL; + return ret; +} + +static parse_result_t* parse_ignore(void *env, parse_state_t *state) { + return NULL; +} + +const parser_t* ignore(const parser_t* p) { + parser_t *ret = g_new(parser_t, 1); + ret->fn = parse_ignore; ret->env = NULL; + return ret; +} + const parser_t* list(const parser_t* p, const parser_t* sep) { return NULL; } const parser_t* epsilon_p() { return NULL; } const parser_t* attr_bool(const parser_t* p, attr_bool_t a) { return NULL; }