Skip to content

Commit fa7c61d

Browse files
committed
py/parse: De-duplicate and simplify code for parser "or" rule.
1 parent d241c2a commit fa7c61d

1 file changed

Lines changed: 13 additions & 25 deletions

File tree

py/parse.c

Lines changed: 13 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)