Conflicts: src/Makefile src/backends/packrat.c src/compile.c src/hammer.h src/internal.h src/parsers/action.c src/parsers/and.c src/parsers/attr_bool.c src/parsers/bits.c src/parsers/butnot.c src/parsers/ch.c src/parsers/charset.c src/parsers/choice.c src/parsers/difference.c src/parsers/end.c src/parsers/epsilon.c src/parsers/ignore.c src/parsers/ignoreseq.c src/parsers/indirect.c src/parsers/int_range.c src/parsers/many.c src/parsers/not.c src/parsers/nothing.c src/parsers/optional.c src/parsers/sequence.c src/parsers/token.c src/parsers/unimplemented.c src/parsers/whitespace.c src/parsers/xor.c
40 lines
1.2 KiB
C
40 lines
1.2 KiB
C
#ifndef HAMMER_PARSE_INTERNAL__H
|
|
#define HAMMER_PARSE_INTERNAL__H
|
|
#include "../hammer.h"
|
|
#include "../internal.h"
|
|
#include "../backends/regex.h"
|
|
|
|
#define a_new_(arena, typ, count) ((typ*)h_arena_malloc((arena), sizeof(typ)*(count)))
|
|
#define a_new(typ, count) a_new_(state->arena, typ, count)
|
|
// we can create a_new0 if necessary. It would allocate some memory and immediately zero it out.
|
|
|
|
static inline HParseResult* make_result(HArena *arena, HParsedToken *tok) {
|
|
HParseResult *ret = h_arena_malloc(arena, sizeof(HParseResult));
|
|
ret->ast = tok;
|
|
ret->arena = arena;
|
|
return ret;
|
|
}
|
|
|
|
// return token size in bits...
|
|
static inline size_t token_length(HParseResult *pr) {
|
|
if (pr) {
|
|
return pr->bit_length;
|
|
} else {
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
/* Epsilon rules happen during desugaring. This handles them. */
|
|
static inline HCFChoice* desugar_epsilon(HAllocator *mm__, void *env) {
|
|
static HCFChoice *res_seq_l[] = {NULL};
|
|
static HCFSequence res_seq = {res_seq_l};
|
|
static HCFSequence *res_ch_l[] = {&res_seq, NULL};
|
|
static HCFChoice res_ch = {
|
|
.type = HCF_CHOICE,
|
|
.seq = res_ch_l,
|
|
.action = NULL
|
|
};
|
|
return &res_ch;
|
|
}
|
|
|
|
#endif // HAMMER_PARSE_INTERNAL__H
|