diff --git a/src/desugar.c b/src/desugar.c index f34db1f..fbd1581 100644 --- a/src/desugar.c +++ b/src/desugar.c @@ -1,4 +1,6 @@ +#include "hammer.h" +#include "internal.h" -HCFChoice *h_desugar(HAllocator *mm__, HParser *parser) { - return parser->vtable->desugar(mm__, parser); +HCFChoice *h_desugar(HAllocator *mm__, const HParser *parser) { + return parser->vtable->desugar(mm__, parser->env); } diff --git a/src/internal.h b/src/internal.h index 2386e4e..6245efa 100644 --- a/src/internal.h +++ b/src/internal.h @@ -224,7 +224,7 @@ long long h_read_bits(HInputStream* state, int count, char signed_p); HParseResult* h_do_parse(const HParser* parser, HParseState *state); void put_cached(HParseState *ps, const HParser *p, HParseResult *cached); -HCFChoice *h_desugar(HAllocator *mm__, HParser *parser); +HCFChoice *h_desugar(HAllocator *mm__, const HParser *parser); HCountedArray *h_carray_new_sized(HArena * arena, size_t size); HCountedArray *h_carray_new(HArena * arena); diff --git a/src/parsers/action.c b/src/parsers/action.c index aec4221..ea409d7 100644 --- a/src/parsers/action.c +++ b/src/parsers/action.c @@ -23,7 +23,7 @@ static HCFChoice* desugar_action(HAllocator *mm__, void *env) { HParseAction *a = (HParseAction*)env; HCFSequence *seq = h_new(HCFSequence, 1); seq->items = h_new(HCFChoice*, 2); - seq->items[0] = a->p->vtable->desugar(mm__, a->p->env); + seq->items[0] = h_desugar(mm__, a->p); seq->items[1] = NULL; HCFChoice *ret = h_new(HCFChoice, 1); ret->type = HCF_CHOICE; diff --git a/src/parsers/attr_bool.c b/src/parsers/attr_bool.c index 9e69ebe..78bd30b 100644 --- a/src/parsers/attr_bool.c +++ b/src/parsers/attr_bool.c @@ -36,7 +36,7 @@ static HCFChoice* desugar_ab(HAllocator *mm__, void *env) { HAttrBool *a = (HAttrBool*)env; HCFSequence *seq = h_new(HCFSequence, 1); seq->items = h_new(HCFChoice*, 2); - seq->items[0] = a->p->vtable->desugar(mm__, a->p->env); + seq->items[0] = h_desugar(mm__, a->p); seq->items[1] = NULL; HCFChoice *ret = h_new(HCFChoice, 1); ret->type = HCF_CHOICE; diff --git a/src/parsers/choice.c b/src/parsers/choice.c index c4a931a..88e908b 100644 --- a/src/parsers/choice.c +++ b/src/parsers/choice.c @@ -47,7 +47,7 @@ static HCFChoice* desugar_choice(HAllocator *mm__, void *env) { for (size_t i=0; ilen; ++i) { ret->seq[i] = h_new(HCFSequence, 1); ret->seq[i]->items = h_new(HCFChoice*, 2); - ret->seq[i]->items[0] = s->p_array[i]->vtable->desugar(mm__, s->p_array[i]->env); + ret->seq[i]->items[0] = h_desugar(mm__, s->p_array[i]); ret->seq[i]->items[1] = NULL; } ret->seq[s->len] = NULL; diff --git a/src/parsers/ignore.c b/src/parsers/ignore.c index 1129e88..6ae2803 100644 --- a/src/parsers/ignore.c +++ b/src/parsers/ignore.c @@ -22,7 +22,7 @@ static bool ignore_isValidCF(void *env) { static HCFChoice* desugar_ignore(HAllocator *mm__, void *env) { HParser *p = (HParser*)env; - return (p->vtable->desugar(mm__, p->env)); + return (h_desugar(mm__, p)); } static const HParserVtable ignore_vt = { diff --git a/src/parsers/ignoreseq.c b/src/parsers/ignoreseq.c index e248dc4..2adffc6 100644 --- a/src/parsers/ignoreseq.c +++ b/src/parsers/ignoreseq.c @@ -31,7 +31,7 @@ static HCFChoice* desugar_ignoreseq(HAllocator *mm__, void *env) { HCFSequence *hseq = h_new(HCFSequence, 1); hseq->items = h_new(HCFChoice*, 1+seq->len); for (size_t i=0; ilen; ++i) { - hseq->items[i] = seq->parsers[i]->vtable->desugar(mm__, seq->parsers[i]->env); + hseq->items[i] = h_desugar(mm__, seq->parsers[i]); } hseq->items[seq->len] = NULL; HCFChoice *ret = h_new(HCFChoice, 1); diff --git a/src/parsers/many.c b/src/parsers/many.c index 7ea63d9..c439b67 100644 --- a/src/parsers/many.c +++ b/src/parsers/many.c @@ -76,7 +76,7 @@ static HCFChoice* desugar_many(HAllocator *mm__, void *env) { /* create first subrule */ HCFChoice *ma = h_new(HCFChoice, 3); ma->type = HCF_CHOICE; - ma->seq[0]->items[0] = repeat->p->vtable->desugar(mm__, repeat->p->env); + ma->seq[0]->items[0] = h_desugar(mm__, repeat->p); /* create second subrule */ HCFChoice *mar = h_new(HCFChoice, 3); @@ -84,8 +84,8 @@ static HCFChoice* desugar_many(HAllocator *mm__, void *env) { mar->seq = h_new(HCFSequence*, 2); mar->seq[0] = h_new(HCFSequence, 1); mar->seq[0]->items = h_new(HCFChoice*, 4); - mar->seq[0]->items[0] = repeat->sep->vtable->desugar(mm__, repeat->sep->env); - mar->seq[0]->items[1] = repeat->p->vtable->desugar(mm__, repeat->p->env); + mar->seq[0]->items[0] = h_desugar(mm__, repeat->sep); + mar->seq[0]->items[1] = h_desugar(mm__, repeat->p); mar->seq[0]->items[2] = mar; // woo recursion! mar->seq[0]->items[3] = NULL; mar->seq[1]->items = h_new(HCFChoice*, 2); diff --git a/src/parsers/optional.c b/src/parsers/optional.c index e22a4f6..b8777d3 100644 --- a/src/parsers/optional.c +++ b/src/parsers/optional.c @@ -23,7 +23,7 @@ static bool opt_isValidCF(void *env) { static HCFChoice* desugar_optional(HAllocator *mm__, void *env) { HParser *p = (HParser*) env; - return p->vtable->desugar(mm__, p->env); + return h_desugar(mm__, p); } static const HParserVtable optional_vt = { diff --git a/src/parsers/sequence.c b/src/parsers/sequence.c index eb215a9..dde2a31 100644 --- a/src/parsers/sequence.c +++ b/src/parsers/sequence.c @@ -47,7 +47,7 @@ static HCFChoice* desugar_sequence(HAllocator *mm__, void *env) { HCFSequence *seq = h_new(HCFSequence, 1); seq->items = h_new(HCFChoice*, s->len+1); for (size_t i=0; ilen; ++i) { - seq->items[i] = h_desugar(s->p_array[i]); + seq->items[i] = h_desugar(mm__, s->p_array[i]); } seq->items[s->len] = NULL; HCFChoice *ret = h_new(HCFChoice, 1);