66 lines
1.4 KiB
C
66 lines
1.4 KiB
C
|
|
#include "glue.h"
|
||
|
|
|
||
|
|
|
||
|
|
// The action equivalent of h_ignore.
|
||
|
|
const HParsedToken *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)
|
||
|
|
{
|
||
|
|
if(!p) return NULL;
|
||
|
|
|
||
|
|
const HParsedToken *tok = p->ast;
|
||
|
|
|
||
|
|
if(!tok || tok->token_type != TT_SEQUENCE)
|
||
|
|
return NULL;
|
||
|
|
|
||
|
|
const HCountedArray *seq = tok->seq;
|
||
|
|
size_t n = seq->used;
|
||
|
|
|
||
|
|
if(i<0 || (size_t)i>=n)
|
||
|
|
return NULL;
|
||
|
|
else
|
||
|
|
return tok->seq->elements[i];
|
||
|
|
}
|
||
|
|
|
||
|
|
const HParsedToken *act_index0(const HParseResult *p)
|
||
|
|
{
|
||
|
|
return act_index(0, p);
|
||
|
|
}
|
||
|
|
|
||
|
|
HParsedToken *h_make_token(HArena *arena, HTokenType type, void *value)
|
||
|
|
{
|
||
|
|
HParsedToken *ret = h_arena_malloc(arena, sizeof(HParsedToken));
|
||
|
|
ret->token_type = type;
|
||
|
|
ret->user = value;
|
||
|
|
return ret;
|
||
|
|
}
|
||
|
|
|
||
|
|
#define H_MAKE(TYP) \
|
||
|
|
((TYP ## _t *) h_arena_malloc(p->arena, sizeof(TYP ## _t)))
|
||
|
|
|
||
|
|
#define H_MAKE_TOKEN(TYP, VAL) \
|
||
|
|
h_make_token(p->arena, TT_ ## TYP, VAL)
|
||
|
|
|
||
|
|
HParsedToken *h_carray_index(const HCountedArray *a, size_t i)
|
||
|
|
{
|
||
|
|
assert(i < a->used);
|
||
|
|
return a->elements[i];
|
||
|
|
}
|
||
|
|
|
||
|
|
HParsedToken *h_seq_index(const HParsedToken *p, size_t i)
|
||
|
|
{
|
||
|
|
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)
|
||
|
|
{
|
||
|
|
HParsedToken *elem = h_seq_index(p, i);
|
||
|
|
assert(elem->token_type == (HTokenType)type);
|
||
|
|
return elem->user;
|
||
|
|
}
|