--- /dev/null
+int printf(const char* fmt, ...);
+
+enum {
+ ANON_0,
+ ANON_1,
+ ANON_2 = ANON_1,
+ ANON_3,
+};
+
+int main(int argc)
+{
+ switch (argc) {
+ case ANON_0:
+ printf("ANON_0: %d\n", ANON_0);
+ break;
+
+ case ANON_1:
+ printf("ANON_1: %d\n", ANON_1);
+ break;
+
+ case ANON_3:
+ printf("ANON_3: %d\n", ANON_3);
+ break;
+ default:
+ break;
+ };
+
+ printf("%d,%d,%d,%d\n", ANON_0, ANON_1, ANON_2, ANON_3);
+ return 0;
+}
md->current_v = v;
- scf_logi("enum var: '%s', type: %d, size: %d\n", w->text->data, v->type, v->size);
-
return SCF_DFA_NEXT_WORD;
}
d->expr_local_flag--;
}
+ scf_logi("enum var: '%s', value: %ld\n", md->current_v->w->text->data, md->current_v->data.i64);
+
md->current_v = NULL;
return SCF_DFA_SWITCH_TO;
} dfa_switch_data_t;
+int _expr_add_var(scf_parse_t* parse, dfa_data_t* d);
+
+
static int _switch_is_end(scf_dfa_t* dfa, void* word)
{
return 1;
dfa_data_t* d = data;
assert(!d->expr);
- d->expr_local_flag = 1;
+ d->expr_local_flag++;
SCF_DFA_PUSH_HOOK(scf_dfa_find_node(dfa, "switch_rp"), SCF_DFA_HOOK_POST);
SCF_DFA_PUSH_HOOK(scf_dfa_find_node(dfa, "switch_lp_stat"), SCF_DFA_HOOK_POST);
scf_node_add_child(sd->_switch, d->expr);
d->expr = NULL;
- d->expr_local_flag = 0;
+ assert(--d->expr_local_flag >= 0);
SCF_DFA_PUSH_HOOK(scf_dfa_find_node(dfa, "switch_end"), SCF_DFA_HOOK_END);
dfa_switch_data_t* sd = scf_stack_top(s);
assert(!d->expr);
- d->expr_local_flag = 1;
+ d->expr_local_flag++;
sd->child = scf_node_alloc(w, SCF_OP_CASE, NULL);
if (!sd->child)
scf_node_add_child((scf_node_t*)parse->ast->current_block, sd->child);
+ SCF_DFA_PUSH_HOOK(scf_dfa_find_node(dfa, "switch_colon"), SCF_DFA_HOOK_PRE);
+
return SCF_DFA_NEXT_WORD;
}
return SCF_DFA_ERROR;
}
+ dfa_identity_t* id = scf_stack_top(d->current_identities);
+
+ if (id && id->identity) {
+ if (_expr_add_var(parse, d) < 0)
+ return SCF_DFA_ERROR;
+ }
+
scf_node_add_child(sd->child, d->expr);
d->expr = NULL;
- d->expr_local_flag = 0;
+ assert(--d->expr_local_flag >= 0);
} else {
assert(SCF_OP_DEFAULT == sd->child->type);