diff --git a/src/backends/glr.c b/src/backends/glr.c index ea69ea37ebb9275387b2eb67cf0e21fc64ac8960..06722b1963ed51d4aefc095d7a39a30d10633396 100644 --- a/src/backends/glr.c +++ b/src/backends/glr.c @@ -174,9 +174,9 @@ static bool glr_step(HParseResult **result, HSlist *engines, HSlistNode *x; for(x=engines->head; x; x=x->next) { HLREngine *eng = x->elem; - if(eng->state == engine->state) { - x->elem = lrengine_merge(eng, engine); - break; + if(eng->state == engine->state && eng->input.index == engine->input.index) { + x->elem = lrengine_merge(eng, engine); + break; } } if(!x) // no merge happened diff --git a/src/t_regression.c b/src/t_regression.c index 2c28b99efe6a36e69e5831044dadcbcc381f4d18..c245eff5b841f28ac47814869b22a950be0069fe 100644 --- a/src/t_regression.c +++ b/src/t_regression.c @@ -472,6 +472,57 @@ static void test_issue83() { g_check_cmp_int(r, ==, 0); } + +static void test_bug60() { + +//There is probably an even smaller example that shows the issue + + HParser *zed = NULL; + HParser *alpha = NULL; + HParser *vchar = NULL; + HParser *why = NULL; + HParser *plural_zed = NULL; + HParser *plural_zed_zed = NULL; + HParser *a_to_zed = NULL; + HParser *alphas = NULL; + HParser *rule = NULL; + HParser *rulelist = NULL; + HParser *p = NULL; + HParseResult *r = NULL; + int n; + + zed = h_ch('z'); + + vchar = h_ch_range(0x79, 0x7a); // allows y and z + + alpha = h_ch('a'); + + why = h_ch('y'); + + plural_zed = h_sequence( + why, + h_many(h_choice(alpha, vchar, NULL)), + NULL); + plural_zed_zed = h_choice(plural_zed, zed, NULL); + alphas = h_choice(alpha, h_sequence(plural_zed_zed, alpha, NULL), NULL); + + a_to_zed = h_sequence( + zed, + h_many(h_sequence(h_many1(alphas), zed, NULL)), + NULL); + rule = h_sequence(a_to_zed, plural_zed_zed, NULL); + rulelist = h_many1(h_choice( + rule, + h_sequence(h_many(alphas), plural_zed_zed, NULL), + NULL)); + + p = rulelist; + + g_check_parse_ok(p, PB_GLR, "ayzza", 5); + g_check_parse_match(p, PB_GLR, "ayzza", 5, "(((u0x61) (u0x79 (u0x7a u0x7a u0x61))))"); + +} + void register_regression_tests(void) { g_test_add_func("/core/regression/bug118", test_bug118); g_test_add_func("/core/regression/seq_index_path", test_seq_index_path); @@ -488,4 +539,5 @@ void register_regression_tests(void) { g_test_add_func("/core/regression/issue87", test_issue87); g_test_add_func("/core/regression/issue92", test_issue92); g_test_add_func("/core/regression/issue83", test_issue83); + g_test_add_func("/core/regression/bug60", test_bug60); }