From fa7c61dfab0822619451673d726a5b444d3a9d28 Mon Sep 17 00:00:00 2001 From: Damien George Date: Fri, 24 Jul 2015 14:35:57 +0000 Subject: [PATCH] py/parse: De-duplicate and simplify code for parser "or" rule. --- py/parse.c | 38 +++++++++++++------------------------- 1 file changed, 13 insertions(+), 25 deletions(-) diff --git a/py/parse.c b/py/parse.c index c00c590e91..ad13a90309 100644 --- a/py/parse.c +++ b/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 { backtrack = false; } - for (; i < n - 1; ++i) { - switch (rule->arg[i] & RULE_ARG_KIND_MASK) { - case RULE_ARG_TOK: - if (lex->tok_kind == (rule->arg[i] & RULE_ARG_ARG_MASK)) { - push_result_token(&parser); - 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 + for (; i < n; ++i) { + uint16_t kind = rule->arg[i] & RULE_ARG_KIND_MASK; + if (kind == RULE_ARG_TOK) { + if (lex->tok_kind == (rule->arg[i] & RULE_ARG_ARG_MASK)) { + push_result_token(&parser); + mp_lexer_to_next(lex); 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 { - 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; } - } else { - push_rule_from_arg(&parser, rule->arg[i]); } + backtrack = true; break; case RULE_ACT_AND: {