py/parse: De-duplicate and simplify code for parser "or" rule.
This commit is contained in:
parent
d241c2a592
commit
fa7c61dfab
38
py/parse.c
38
py/parse.c
|
@ -448,36 +448,24 @@ mp_parse_node_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind) {
|
||||||
} else {
|
} else {
|
||||||
backtrack = false;
|
backtrack = false;
|
||||||
}
|
}
|
||||||
for (; i < n - 1; ++i) {
|
for (; i < n; ++i) {
|
||||||
switch (rule->arg[i] & RULE_ARG_KIND_MASK) {
|
uint16_t kind = rule->arg[i] & RULE_ARG_KIND_MASK;
|
||||||
case RULE_ARG_TOK:
|
if (kind == RULE_ARG_TOK) {
|
||||||
if (lex->tok_kind == (rule->arg[i] & RULE_ARG_ARG_MASK)) {
|
if (lex->tok_kind == (rule->arg[i] & RULE_ARG_ARG_MASK)) {
|
||||||
push_result_token(&parser);
|
push_result_token(&parser);
|
||||||
mp_lexer_to_next(lex);
|
mp_lexer_to_next(lex);
|
||||||
goto next_rule;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RULE_ARG_RULE:
|
|
||||||
rule_or_no_other_choice:
|
|
||||||
push_rule(&parser, rule_src_line, rule, i + 1); // save this or-rule
|
|
||||||
push_rule_from_arg(&parser, rule->arg[i]); // push child of or-rule
|
|
||||||
goto next_rule;
|
goto next_rule;
|
||||||
default:
|
}
|
||||||
assert(0);
|
|
||||||
goto rule_or_no_other_choice; // to help flow control analysis
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ((rule->arg[i] & RULE_ARG_KIND_MASK) == RULE_ARG_TOK) {
|
|
||||||
if (lex->tok_kind == (rule->arg[i] & RULE_ARG_ARG_MASK)) {
|
|
||||||
push_result_token(&parser);
|
|
||||||
mp_lexer_to_next(lex);
|
|
||||||
} else {
|
} else {
|
||||||
backtrack = true;
|
assert(kind == RULE_ARG_RULE);
|
||||||
|
if (i + 1 < n) {
|
||||||
|
push_rule(&parser, rule_src_line, rule, i + 1); // save this or-rule
|
||||||
|
}
|
||||||
|
push_rule_from_arg(&parser, rule->arg[i]); // push child of or-rule
|
||||||
goto next_rule;
|
goto next_rule;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
push_rule_from_arg(&parser, rule->arg[i]);
|
|
||||||
}
|
}
|
||||||
|
backtrack = true;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case RULE_ACT_AND: {
|
case RULE_ACT_AND: {
|
||||||
|
|
Loading…
Reference in New Issue