@@ -448,36 +448,24 @@ mp_parse_node_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind) {
448448 } else {
449449 backtrack = false;
450450 }
451- for (; i < n - 1 ; ++ i ) {
452- switch (rule -> arg [i ] & RULE_ARG_KIND_MASK ) {
453- case RULE_ARG_TOK :
454- if (lex -> tok_kind == (rule -> arg [i ] & RULE_ARG_ARG_MASK )) {
455- push_result_token (& parser );
456- mp_lexer_to_next (lex );
457- goto next_rule ;
458- }
459- break ;
460- case RULE_ARG_RULE :
461- rule_or_no_other_choice :
462- push_rule (& parser , rule_src_line , rule , i + 1 ); // save this or-rule
463- push_rule_from_arg (& parser , rule -> arg [i ]); // push child of or-rule
451+ for (; i < n ; ++ i ) {
452+ uint16_t kind = rule -> arg [i ] & RULE_ARG_KIND_MASK ;
453+ if (kind == RULE_ARG_TOK ) {
454+ if (lex -> tok_kind == (rule -> arg [i ] & RULE_ARG_ARG_MASK )) {
455+ push_result_token (& parser );
456+ mp_lexer_to_next (lex );
464457 goto next_rule ;
465- default :
466- assert (0 );
467- goto rule_or_no_other_choice ; // to help flow control analysis
468- }
469- }
470- if ((rule -> arg [i ] & RULE_ARG_KIND_MASK ) == RULE_ARG_TOK ) {
471- if (lex -> tok_kind == (rule -> arg [i ] & RULE_ARG_ARG_MASK )) {
472- push_result_token (& parser );
473- mp_lexer_to_next (lex );
458+ }
474459 } else {
475- backtrack = true;
460+ assert (kind == RULE_ARG_RULE );
461+ if (i + 1 < n ) {
462+ push_rule (& parser , rule_src_line , rule , i + 1 ); // save this or-rule
463+ }
464+ push_rule_from_arg (& parser , rule -> arg [i ]); // push child of or-rule
476465 goto next_rule ;
477466 }
478- } else {
479- push_rule_from_arg (& parser , rule -> arg [i ]);
480467 }
468+ backtrack = true;
481469 break ;
482470
483471 case RULE_ACT_AND : {
0 commit comments