let rec compile_states_helper state_list env = match state_list with
(name, callback_list, transition_list)::rest ->
let id,new_env = get_id name env in
let transition_code, transition_env, transition_ids = compile_transitions transition_list name new_env in
let _ = node_list := (id,transition_ids,ref false)::!node_list in
[
SynVarDeclare
(SynVarDeclareNoInit
(SynEnumOrStructType ("fsmState",ref []),
name));
SynVarAssign
(SynVarAssignment
(SynStructOrEnumValue
(SynVarName name,"id",ref VIdUnspecified),
SynValue
(SynIntValue id)));
SynVarDeclare
(SynVarDeclareNoInit
(SynEnumOrStructType ("callbackSet",ref []),
concat [name;"_callbacks"]))]
@
compile_callbacks callback_list name
@ [
SynVarAssign
(SynVarAssignment
(SynStructOrEnumValue
(SynVarName name,"callbacks",ref VIdUnspecified),
SynVarIdentifier
(SynVarName (concat [name;"_callbacks"])))) ]
@ transition_code
@ compile_states_helper rest transition_env
| [] -> let _ = state_env := reverse_assoc env in []