From 642df1f2384565961072614c36d529552d117c35 Mon Sep 17 00:00:00 2001 From: "Meredith L. Patterson" Date: Fri, 18 May 2012 12:35:40 +0200 Subject: [PATCH] Finished action. On to testing. --- src/hammer.c | 24 +++++++++++++++++++++++- src/hammer.h | 2 ++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/hammer.c b/src/hammer.c index 178eeb7..6ce17e1 100644 --- a/src/hammer.c +++ b/src/hammer.c @@ -297,7 +297,29 @@ const parser_t* whitespace(const parser_t* p) { return ret; } -const parser_t* action(const parser_t* p, const action_t a) { return &unimplemented; } +typedef struct { + const parser_t *p; + action_t action; +} parse_action_t; + +static parse_result_t* parse_action(void *env, parse_state_t *state) { + parse_action_t *a = (parse_action_t*)env; + if (a->p && a->action) { + parse_result_t *ret = a->action(do_parse(a->p, state)); + return ret; + } else // either the parser's missing or the action's missing + return NULL; +} + +const parser_t* action(const parser_t* p, const action_t a) { + parser_t *res = g_new(parser_t, 1); + res->fn = parse_action; + parse_action_t *env = g_new(parse_action_t, 1); + env->p = p; + env->action = a; + res->env = (void*)env; + return res; +} static parse_result_t* parse_charset(void *env, parse_state_t *state) { uint8_t in = read_bits(&state->input_stream, 8, false); diff --git a/src/hammer.h b/src/hammer.h index c16dd49..b1cbc19 100644 --- a/src/hammer.h +++ b/src/hammer.h @@ -36,6 +36,7 @@ typedef enum token_type { TT_SINT, TT_UINT, TT_SEQUENCE, + TT_USER = 64, TT_ERR, TT_MAX } token_type_t; @@ -59,6 +60,7 @@ typedef struct parsed_token { double dbl; float flt; counted_array_t *seq; // a sequence of parsed_token_t's + void *user; }; size_t index; char bit_offset;