py/parse: Refactor code to remove assert(0)'s.
This helps to improve code coverage. Note that most of the changes in this patch are just de-denting the cases of the switch statements.
This commit is contained in:
parent
5314219f18
commit
86e942309a
35
py/parse.c
35
py/parse.c
|
@ -295,8 +295,9 @@ void mp_parse_node_print(mp_parse_node_t pn, size_t indent) {
|
|||
case MP_PARSE_NODE_ID: printf("id(%s)\n", qstr_str(arg)); break;
|
||||
case MP_PARSE_NODE_STRING: printf("str(%s)\n", qstr_str(arg)); break;
|
||||
case MP_PARSE_NODE_BYTES: printf("bytes(%s)\n", qstr_str(arg)); break;
|
||||
case MP_PARSE_NODE_TOKEN: printf("tok(%u)\n", (uint)arg); break;
|
||||
default: assert(0);
|
||||
default:
|
||||
assert(MP_PARSE_NODE_LEAF_KIND(pn) == MP_PARSE_NODE_TOKEN);
|
||||
printf("tok(%u)\n", (uint)arg); break;
|
||||
}
|
||||
} else {
|
||||
// node must be a mp_parse_node_struct_t
|
||||
|
@ -870,8 +871,7 @@ mp_parse_tree_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind) {
|
|||
|
||||
// progress through the rule
|
||||
for (; i < n; ++i) {
|
||||
switch (rule->arg[i] & RULE_ARG_KIND_MASK) {
|
||||
case RULE_ARG_TOK: {
|
||||
if ((rule->arg[i] & RULE_ARG_KIND_MASK) == RULE_ARG_TOK) {
|
||||
// need to match a token
|
||||
mp_token_kind_t tok_kind = rule->arg[i] & RULE_ARG_ARG_MASK;
|
||||
if (lex->tok_kind == tok_kind) {
|
||||
|
@ -891,17 +891,10 @@ mp_parse_tree_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind) {
|
|||
goto next_rule;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case RULE_ARG_RULE:
|
||||
case RULE_ARG_OPT_RULE:
|
||||
rule_and_no_other_choice:
|
||||
} else {
|
||||
push_rule(&parser, rule_src_line, rule, i + 1); // save this and-rule
|
||||
push_rule_from_arg(&parser, rule->arg[i]); // push child of and-rule
|
||||
goto next_rule;
|
||||
default:
|
||||
assert(0);
|
||||
goto rule_and_no_other_choice; // to help flow control analysis
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -973,7 +966,9 @@ mp_parse_tree_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind) {
|
|||
break;
|
||||
}
|
||||
|
||||
case RULE_ACT_LIST: {
|
||||
default: {
|
||||
assert((rule->act & RULE_ACT_KIND_MASK) == RULE_ACT_LIST);
|
||||
|
||||
// n=2 is: item item*
|
||||
// n=1 is: item (sep item)*
|
||||
// n=3 is: item (sep item)* [sep]
|
||||
|
@ -1011,8 +1006,7 @@ mp_parse_tree_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind) {
|
|||
} else {
|
||||
for (;;) {
|
||||
size_t arg = rule->arg[i & 1 & n];
|
||||
switch (arg & RULE_ARG_KIND_MASK) {
|
||||
case RULE_ARG_TOK:
|
||||
if ((arg & RULE_ARG_KIND_MASK) == RULE_ARG_TOK) {
|
||||
if (lex->tok_kind == (arg & RULE_ARG_ARG_MASK)) {
|
||||
if (i & 1 & n) {
|
||||
// separators which are tokens are not pushed to result stack
|
||||
|
@ -1028,15 +1022,11 @@ mp_parse_tree_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind) {
|
|||
backtrack = true;
|
||||
goto list_backtrack;
|
||||
}
|
||||
break;
|
||||
case RULE_ARG_RULE:
|
||||
rule_list_no_other_choice:
|
||||
} else {
|
||||
assert((arg & RULE_ARG_KIND_MASK) == RULE_ARG_RULE);
|
||||
push_rule(&parser, rule_src_line, rule, i + 1); // save this list-rule
|
||||
push_rule_from_arg(&parser, arg); // push child of list-rule
|
||||
goto next_rule;
|
||||
default:
|
||||
assert(0);
|
||||
goto rule_list_no_other_choice; // to help flow control analysis
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1062,9 +1052,6 @@ mp_parse_tree_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind) {
|
|||
}
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
assert(0);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue