From dd574bd735ba1813e0fe1a2a3b0a80967481eed8 Mon Sep 17 00:00:00 2001 From: "Sven M. Hallberg" Date: Thu, 17 Jan 2013 18:31:13 +0100 Subject: [PATCH] give glue actions an h_ prefix and add H_ACT_APPLY macro --- examples/dns.c | 3 ++- examples/dns_common.c | 4 +++- examples/dns_common.h | 2 ++ examples/glue.c | 11 +++-------- examples/glue.h | 14 ++++++++++---- 5 files changed, 20 insertions(+), 14 deletions(-) diff --git a/examples/dns.c b/examples/dns.c index b02a4ba..ba1f592 100644 --- a/examples/dns.c +++ b/examples/dns.c @@ -262,10 +262,11 @@ const HParsedToken* act_message(const HParseResult *p) { return H_MAKE_TOKEN(dns_message_t, msg); } -#define act_hdzero act_ignore +#define act_hdzero h_act_ignore #define act_qname act_index0 + /// // Parser / Grammar /// diff --git a/examples/dns_common.c b/examples/dns_common.c index 9f02fc6..57f81aa 100644 --- a/examples/dns_common.c +++ b/examples/dns_common.c @@ -5,6 +5,8 @@ #define false 0 #define true 1 +H_ACT_APPLY(act_index0, h_act_index, 0) + /** * A label can't be more than 63 characters. */ @@ -52,7 +54,7 @@ const HParsedToken* act_domain(const HParseResult *p) { return ret; } -#define act_label_ act_flatten +#define act_label_ h_act_flatten const HParser* init_domain() { static const HParser *ret = NULL; diff --git a/examples/dns_common.h b/examples/dns_common.h index 2d796f8..6b04519 100644 --- a/examples/dns_common.h +++ b/examples/dns_common.h @@ -7,4 +7,6 @@ const HParser* init_domain(); const HParser* init_character_string(); +const HParsedToken* act_index0(const HParseResult *p); + #endif diff --git a/examples/glue.c b/examples/glue.c index b635d7c..80864fc 100644 --- a/examples/glue.c +++ b/examples/glue.c @@ -3,13 +3,13 @@ // The action equivalent of h_ignore. -const HParsedToken *act_ignore(const HParseResult *p) +const HParsedToken *h_act_ignore(const HParseResult *p) { return NULL; } // Helper to build HAction's that pick one index out of a sequence. -const HParsedToken *act_index(int i, const HParseResult *p) +const HParsedToken *h_act_index(int i, const HParseResult *p) { if(!p) return NULL; @@ -27,11 +27,6 @@ const HParsedToken *act_index(int i, const HParseResult *p) return tok->seq->elements[i]; } -const HParsedToken *act_index0(const HParseResult *p) -{ - return act_index(0, p); -} - void h_seq_snoc(HParsedToken *xs, const HParsedToken *x) { assert(xs != NULL); @@ -75,7 +70,7 @@ const HParsedToken *h_token_flatten(HArena *arena, const HParsedToken *p) } // Action version of h_token_flatten. -const HParsedToken *act_flatten(const HParseResult *p) { +const HParsedToken *h_act_flatten(const HParseResult *p) { return h_token_flatten(p->arena, p->ast); } diff --git a/examples/glue.h b/examples/glue.h index 7939a48..2b60646 100644 --- a/examples/glue.h +++ b/examples/glue.h @@ -17,10 +17,16 @@ #define H_AVRULE(rule, def) const HParser *rule = \ h_action(h_attr_bool(def, validate_ ## rule), act_ ## rule) -const HParsedToken *act_ignore(const HParseResult *p); -const HParsedToken *act_index(int i, const HParseResult *p); -const HParsedToken *act_index0(const HParseResult *p); -const HParsedToken *act_flatten(const HParseResult *p); +const HParsedToken *h_act_ignore(const HParseResult *p); +const HParsedToken *h_act_index(int i, const HParseResult *p); +const HParsedToken *h_act_flatten(const HParseResult *p); + +// Define 'myaction' as a specialization of 'paction' by supplying the leading +// parameters. +#define H_ACT_APPLY(myaction, paction, ...) \ + const HParsedToken *myaction(const HParseResult *p) { \ + return paction(__VA_ARGS__, p); \ + } const HParsedToken *h_token_flatten(HArena *arena, const HParsedToken *p);