From b9a33f2c98a8b270dfa2cc9cb870169b7b2ebc43 Mon Sep 17 00:00:00 2001 From: Dan Hirsch <thequux@upstandinghackers.com> Date: Fri, 24 May 2013 12:22:15 +0200 Subject: [PATCH] More testcases work --- src/backends/regex.c | 2 +- src/backends/regex_debug.c | 4 ++-- src/hammer.h | 4 ++-- src/parsers/charset.c | 2 +- src/parsers/choice.c | 29 ++++++++++++++--------------- src/parsers/ignoreseq.c | 2 +- src/parsers/sequence.c | 20 ++++++++++---------- 7 files changed, 31 insertions(+), 32 deletions(-) diff --git a/src/backends/regex.c b/src/backends/regex.c index b0cfc2b8..12e84f63 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 78a4099a..8b2ea311 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 ebbec52a..b0fabd11 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 a1fe668c..db4c2e77 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 5485f2f3..32c49910 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 3b920f18..8fcc143b 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 4de21833..27a667a6 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]; -- GitLab