From fa7c61dfab0822619451673d726a5b444d3a9d28 Mon Sep 17 00:00:00 2001
From: Damien George <damien.p.george@gmail.com>
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 c00c590e9..ad13a9030 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: {
-- 
GitLab