diff --git a/examples/glue.c b/examples/glue.c index 1c86b15dfabba905de6bbca122dc126d4b06a2c6..778f356a2db9f55b7cc10907db1b4d4a76fa4613 100644 --- a/examples/glue.c +++ b/examples/glue.c @@ -57,7 +57,7 @@ const HParsedToken *h_seq_flatten(HArena *arena, const HParsedToken *p) case TT_SEQUENCE: // Flatten and append all. for(size_t i; i<p->seq->used; i++) { - h_seq_append(ret, h_seq_flatten(arena, h_seq_index(p, i))); + h_seq_append(ret, h_seq_flatten(arena, h_seq_index_token(p, i))); } break; default: @@ -99,16 +99,16 @@ HParsedToken *h_carray_index(const HCountedArray *a, size_t i) return a->elements[i]; } -HParsedToken *h_seq_index(const HParsedToken *p, size_t i) +HParsedToken *h_seq_index_token(const HParsedToken *p, size_t i) { assert(p != NULL); assert(p->token_type == TT_SEQUENCE); return h_carray_index(p->seq, i); } -void *h_seq_index_user(HTokenType type, const HParsedToken *p, size_t i) +void *h_seq_index(HTokenType type, const HParsedToken *p, size_t i) { - HParsedToken *elem = h_seq_index(p, i); + HParsedToken *elem = h_seq_index_token(p, i); assert(elem->token_type == (HTokenType)type); return elem->user; } diff --git a/examples/glue.h b/examples/glue.h index c8b17f38004450727623f314ef6543bac34fc2e6..5716197bb09911f02fc4f815e56687b3ebb2ab96 100644 --- a/examples/glue.h +++ b/examples/glue.h @@ -43,34 +43,40 @@ const HParsedToken *h_act_flatten(const HParseResult *p); // Working with HParsedTokens // +// Standard short-hand for arena-allocating a variable in a semantic action. +#define H_ALLOC(TYP) \ + ((TYP *) h_arena_malloc(p->arena, sizeof(TYP))) + // Token constructors... HParsedToken *h_make(HArena *arena, HTokenType type, void *value); HParsedToken *h_make_seq(HArena *arena); -#define H_ALLOC(TYP) \ - ((TYP *) h_arena_malloc(p->arena, sizeof(TYP))) - -#define H_MAKE(TYP, VAL) \ - h_make(p->arena, TT_ ## TYP, VAL) +// Standard short-hand to make a user-type token. +#define H_MAKE(TYP, VAL) h_make(p->arena, TT_ ## TYP, VAL) // Sequences... -// Flatten nested sequences into one. -const HParsedToken *h_seq_flatten(HArena *arena, const HParsedToken *p); +// Access a sequence element by index. +HParsedToken *h_seq_index_token(const HParsedToken *p, size_t i); -void h_seq_snoc(HParsedToken *xs, const HParsedToken *x); -void h_seq_append(HParsedToken *xs, const HParsedToken *ys); +// Access a user-type element of a sequence by index. +#define H_SEQ_INDEX(TYP, SEQ, IDX) \ + ((TYP *) h_seq_index(TT_ ## TYP, SEQ, IDX)) -HParsedToken *h_carray_index(const HCountedArray *a, size_t i); // XXX -> internal -HParsedToken *h_seq_index(const HParsedToken *p, size_t i); -void *h_seq_index_user(HTokenType type, const HParsedToken *p, size_t i); +// Standard short-hand to access a user-type field on a sequence token. +#define H_FIELD(TYP, IDX) H_SEQ_INDEX(TYP, p->ast, IDX) -#define H_SEQ_INDEX(TYP, SEQ, IDX) \ - ((TYP *) h_seq_index_user(TT_ ## TYP, SEQ, IDX)) +// Append elements to a sequence. +void h_seq_snoc(HParsedToken *xs, const HParsedToken *x); // append one +void h_seq_append(HParsedToken *xs, const HParsedToken *ys); // append many -#define H_FIELD(TYP, IDX) \ - H_SEQ_INDEX(TYP, p->ast, IDX) +// Flatten nested sequences into one. +const HParsedToken *h_seq_flatten(HArena *arena, const HParsedToken *p); + +// Helpers for implementing H_SEQ_INDEX. +void *h_seq_index(HTokenType type, const HParsedToken *p, size_t i); // XXX helper +HParsedToken *h_carray_index(const HCountedArray *a, size_t i); // XXX -> internal #endif