diff --git a/src/backends/regex.c b/src/backends/regex.c index b0cfc2b8a812b2bb7724283f2d31171d7e0292b6..12e84f63a71a1491e8ce66bf0e70db8beac7b0ea 100644 --- a/src/backends/regex.c +++ b/src/backends/regex.c @@ -294,7 +294,7 @@ void h_rvm_patch_arg(HRVMProg *prog, uint16_t ip, uint16_t new_val) { size_t h_svm_count_to_mark(HSVMContext *ctx) { size_t ctm; - for (ctm = 0; ctm < ctx->stack_count-1; ctm++) { + for (ctm = 0; ctm < ctx->stack_count; ctm++) { if (ctx->stack[ctx->stack_count - 1 - ctm]->token_type == TT_MARK) return ctm; } diff --git a/src/backends/regex_debug.c b/src/backends/regex_debug.c index 78a4099ad310a87a231186f315d07defb7f757ab..8b2ea31163504e59b89c365a26420c1ff48e4a7a 100644 --- a/src/backends/regex_debug.c +++ b/src/backends/regex_debug.c @@ -67,12 +67,12 @@ void dump_rvm_prog(HRVMProg *prog) { if (high < low) printf("NONE\n"); else { - if (low >= 0x32 && low <= 0x7e) + if (low >= 0x20 && low <= 0x7e) printf("%02hhx ('%c')", low, low); else printf("%02hhx", low); - if (high >= 0x32 && high <= 0x7e) + if (high >= 0x20 && high <= 0x7e) printf(" - %02hhx ('%c')\n", high, high); else printf(" - %02hhx\n", high); diff --git a/src/hammer.h b/src/hammer.h index ebbec52a8fcc4b439d435fb7b79599ccddfc0025..b0fabd115b9cfda3e3d3bd2a66f70d8b4817c45d 100644 --- a/src/hammer.h +++ b/src/hammer.h @@ -370,7 +370,7 @@ HAMMER_FN_DECL_NOARG(HParser*, h_nothing_p); * * Result token type: TT_SEQUENCE */ -HAMMER_FN_DECL_VARARGS_ATTR(__attribute__((sentinel)), HParser*, h_sequence, const HParser* p); +HAMMER_FN_DECL_VARARGS_ATTR(__attribute__((sentinel)), HParser*, h_sequence, HParser* p); /** * Given an array of parsers, p_array, apply each parser in order. The @@ -379,7 +379,7 @@ HAMMER_FN_DECL_VARARGS_ATTR(__attribute__((sentinel)), HParser*, h_sequence, con * * Result token type: The type of the first successful parser's result. */ -HAMMER_FN_DECL_VARARGS_ATTR(__attribute__((sentinel)), HParser*, h_choice, const HParser* p); +HAMMER_FN_DECL_VARARGS_ATTR(__attribute__((sentinel)), HParser*, h_choice, HParser* p); /** * Given two parsers, p1 and p2, this parser succeeds in the following diff --git a/src/parsers/charset.c b/src/parsers/charset.c index a1fe668cf0f71969c872fd780d845ad252768b02..db4c2e777216ce798179bd930d28ea4ad4685cd1 100644 --- a/src/parsers/charset.c +++ b/src/parsers/charset.c @@ -56,7 +56,7 @@ static bool cs_ctrvm(HRVMProg *prog, void *env) { if (collecting) { collecting = false; uint16_t insn = h_rvm_insert_insn(prog, RVM_FORK, 0); - h_rvm_insert_insn(prog, RVM_MATCH, range_start | i << 8); + h_rvm_insert_insn(prog, RVM_MATCH, range_start | (i-1) << 8); h_rvm_insert_insn(prog, RVM_GOTO, 0); h_rvm_patch_arg(prog, insn, h_rvm_get_ip(prog)); } diff --git a/src/parsers/choice.c b/src/parsers/choice.c index 5485f2f35cdbee4a0513dab2200bf306255d6550..32c49910ae72360874705541fa07f0737c938c22 100644 --- a/src/parsers/choice.c +++ b/src/parsers/choice.c @@ -3,7 +3,7 @@ typedef struct { size_t len; - const HParser **p_array; + HParser **p_array; } HSequence; @@ -58,16 +58,15 @@ static HCFChoice* desugar_choice(HAllocator *mm__, void *env) { static bool choice_ctrvm(HRVMProg *prog, void* env) { HSequence *s = (HSequence*)env; uint16_t gotos[s->len]; - uint16_t start = h_rvm_get_ip(prog); for (size_t i=0; i<s->len; ++i) { uint16_t insn = h_rvm_insert_insn(prog, RVM_FORK, 0); - if (!h_compile_regex(prog, s->p_array[i]->env)) + if (!h_compile_regex(prog, s->p_array[i])) return false; - gotos[i] = h_rvm_insert_insn(prog, RVM_GOTO, 0); + gotos[i] = h_rvm_insert_insn(prog, RVM_GOTO, 65535); h_rvm_patch_arg(prog, insn, h_rvm_get_ip(prog)); } - uint16_t jump = h_rvm_insert_insn(prog, RVM_STEP, 0); - for (size_t i=start; i<s->len; ++i) { + uint16_t jump = h_rvm_get_ip(prog); + for (size_t i=0; i<s->len; ++i) { h_rvm_patch_arg(prog, gotos[i], jump); } return true; @@ -81,7 +80,7 @@ static const HParserVtable choice_vt = { .compile_to_rvm = choice_ctrvm, }; -HParser* h_choice(const HParser* p, ...) { +HParser* h_choice(HParser* p, ...) { va_list ap; va_start(ap, p); HParser* ret = h_choice__mv(&system_allocator, p, ap); @@ -89,7 +88,7 @@ HParser* h_choice(const HParser* p, ...) { return ret; } -HParser* h_choice__m(HAllocator* mm__, const HParser* p, ...) { +HParser* h_choice__m(HAllocator* mm__, HParser* p, ...) { va_list ap; va_start(ap, p); HParser* ret = h_choice__mv(mm__, p, ap); @@ -97,28 +96,28 @@ HParser* h_choice__m(HAllocator* mm__, const HParser* p, ...) { return ret; } -HParser* h_choice__v(const HParser* p, va_list ap) { +HParser* h_choice__v(HParser* p, va_list ap) { return h_choice__mv(&system_allocator, p, ap); } -HParser* h_choice__mv(HAllocator* mm__, const HParser* p, va_list ap_) { +HParser* h_choice__mv(HAllocator* mm__, HParser* p, va_list ap_) { va_list ap; size_t len = 0; HSequence *s = h_new(HSequence, 1); - const HParser *arg; + HParser *arg; va_copy(ap, ap_); do { len++; - arg = va_arg(ap, const HParser *); + arg = va_arg(ap, HParser *); } while (arg); va_end(ap); - s->p_array = h_new(const HParser *, len); + s->p_array = h_new(HParser *, len); va_copy(ap, ap_); s->p_array[0] = p; for (size_t i = 1; i < len; i++) { - s->p_array[i] = va_arg(ap, const HParser *); + s->p_array[i] = va_arg(ap, HParser *); } while (arg); va_end(ap); @@ -139,7 +138,7 @@ HParser* h_choice__ma(HAllocator* mm__, void *args[]) { } while(arg); HSequence *s = h_new(HSequence, 1); - s->p_array = h_new(const HParser *, len); + s->p_array = h_new(HParser *, len); for (size_t i = 0; i < len; i++) { s->p_array[i] = ((HParser **)args)[i]; diff --git a/src/parsers/ignoreseq.c b/src/parsers/ignoreseq.c index 3b920f185f6dd7edf4ff18ae4bc588a33129267f..8fcc143b8a4b9a6b2248d9a4de5596560593d58d 100644 --- a/src/parsers/ignoreseq.c +++ b/src/parsers/ignoreseq.c @@ -83,7 +83,7 @@ static bool h_svm_action_ignoreseq(HArena *arena, HSVMContext *ctx, void* env) { // stack. assert(seq->len >= 1); for (int i = seq->len - 1; i>=0; i--) { - if (i == (int)seq->which && ctx->stack[ctx->stack_count]->token_type != TT_MARK) + if (i == (int)seq->which && ctx->stack[ctx->stack_count-1]->token_type != TT_MARK) save = ctx->stack[ctx->stack_count-1]; // skip over everything up to and including the mark. while (ctx->stack[--ctx->stack_count]->token_type != TT_MARK) diff --git a/src/parsers/sequence.c b/src/parsers/sequence.c index 4de218339bde91d72918bc1d7b1dedfee681197c..27a667a6cd0229884277744aefeca848745315fd 100644 --- a/src/parsers/sequence.c +++ b/src/parsers/sequence.c @@ -4,7 +4,7 @@ typedef struct { size_t len; - const HParser **p_array; + HParser **p_array; } HSequence; static HParseResult* parse_sequence(void *env, HParseState *state) { @@ -86,7 +86,7 @@ static bool sequence_ctrvm(HRVMProg *prog, void *env) { HSequence *s = (HSequence*)env; h_rvm_insert_insn(prog, RVM_PUSH, 0); for (size_t i=0; i<s->len; ++i) { - if (!s->p_array[i]->vtable->compile_to_rvm(prog, s->p_array[i]->env)) + if (!s->p_array[i]->vtable->compile_to_rvm(prog, s->p_array[i])) return false; } h_rvm_insert_insn(prog, RVM_ACTION, h_rvm_create_action(prog, h_svm_action_make_sequence, NULL)); @@ -101,7 +101,7 @@ static const HParserVtable sequence_vt = { .compile_to_rvm = sequence_ctrvm, }; -HParser* h_sequence(const HParser* p, ...) { +HParser* h_sequence(HParser* p, ...) { va_list ap; va_start(ap, p); HParser* ret = h_sequence__mv(&system_allocator, p, ap); @@ -109,7 +109,7 @@ HParser* h_sequence(const HParser* p, ...) { return ret; } -HParser* h_sequence__m(HAllocator* mm__, const HParser* p, ...) { +HParser* h_sequence__m(HAllocator* mm__, HParser* p, ...) { va_list ap; va_start(ap, p); HParser* ret = h_sequence__mv(mm__, p, ap); @@ -117,27 +117,27 @@ HParser* h_sequence__m(HAllocator* mm__, const HParser* p, ...) { return ret; } -HParser* h_sequence__v(const HParser* p, va_list ap) { +HParser* h_sequence__v(HParser* p, va_list ap) { return h_sequence__mv(&system_allocator, p, ap); } -HParser* h_sequence__mv(HAllocator* mm__, const HParser *p, va_list ap_) { +HParser* h_sequence__mv(HAllocator* mm__, HParser *p, va_list ap_) { va_list ap; size_t len = 0; const HParser *arg; va_copy(ap, ap_); do { len++; - arg = va_arg(ap, const HParser *); + arg = va_arg(ap, HParser *); } while (arg); va_end(ap); HSequence *s = h_new(HSequence, 1); - s->p_array = h_new(const HParser *, len); + s->p_array = h_new(HParser *, len); va_copy(ap, ap_); s->p_array[0] = p; for (size_t i = 1; i < len; i++) { - s->p_array[i] = va_arg(ap, const HParser *); + s->p_array[i] = va_arg(ap, HParser *); } while (arg); va_end(ap); @@ -158,7 +158,7 @@ HParser* h_sequence__ma(HAllocator* mm__, void *args[]) { } while(arg); HSequence *s = h_new(HSequence, 1); - s->p_array = h_new(const HParser *, len); + s->p_array = h_new(HParser *, len); for (size_t i = 0; i < len; i++) { s->p_array[i] = ((HParser **)args)[i];