Merge pull request #140 from pesco/fix-wrong_bit_length

Some combinators may report the wrong amount of consumed input
This commit is contained in:
Meredith L. Patterson 2015-12-13 15:19:02 -08:00
commit f806125ab8
3 changed files with 29 additions and 2 deletions

View file

@ -46,7 +46,11 @@ static HParseResult *parse_bind(void *be_, HParseState *state) {
return NULL;
}
return h_do_parse(kx, state);
HParseResult *res2 = h_do_parse(kx, state);
if(res2)
res2->bit_length = 0; // recalculate
return res2;
}
static const HParserVtable bind_vt = {

View file

@ -24,8 +24,10 @@ static HParseResult* parse_ignoreseq(void* env, HParseState *state) {
HParseResult *tmp = h_do_parse(seq->parsers[i], state);
if (!tmp)
return NULL;
else if (i == seq->which)
else if (i == seq->which) {
res = tmp;
res->bit_length = 0; // recalculate
}
}
return res;

View file

@ -118,6 +118,26 @@ static void test_llk_zero_end(void) {
g_check_parse_failed(aze, be, "a", 1);
}
HParser *k_test_wrong_bit_length(HAllocator *mm__, const HParsedToken *tok, void *env)
{
return h_ch__m(mm__, 'b');
}
static void test_wrong_bit_length(void) {
HParseResult *r;
HParser *p;
p = h_right(h_ch('a'), h_ch('b'));
r = h_parse(p, (const uint8_t *)"ab", 2);
g_check_cmp_int64(r->bit_length, ==, 16);
h_parse_result_free(r);
p = h_bind(h_ch('a'), k_test_wrong_bit_length, NULL);
r = h_parse(p, (const uint8_t *)"ab", 2);
g_check_cmp_int64(r->bit_length, ==, 16);
h_parse_result_free(r);
}
static void test_lalr_charset_lhs(void) {
HParserBackend be = PB_LALR;
@ -178,6 +198,7 @@ void register_regression_tests(void) {
g_test_add_func("/core/regression/seq_index_path", test_seq_index_path);
g_test_add_func("/core/regression/read_bits_48", test_read_bits_48);
g_test_add_func("/core/regression/llk_zero_end", test_llk_zero_end);
g_test_add_func("/core/regression/wrong_bit_length", test_wrong_bit_length);
g_test_add_func("/core/regression/lalr_charset_lhs", test_lalr_charset_lhs);
g_test_add_func("/core/regression/cfg_many_seq", test_cfg_many_seq);
g_test_add_func("/core/regression/charset_bits", test_charset_bits);