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
        [ 
         (** declare state *)

          SynVarDeclare
            (SynVarDeclareNoInit
               (SynEnumOrStructType ("fsmState",ref []),
                name));
          
          (** assign id *)

          SynVarAssign 
            (SynVarAssignment
               (SynStructOrEnumValue
                  (SynVarName name,"id",ref VIdUnspecified),
                SynValue
                  (SynIntValue id)));
          
          (** declare callback set *)

          SynVarDeclare
            (SynVarDeclareNoInit
               (SynEnumOrStructType ("callbackSet",ref []),
                concat [name;"_callbacks"]))]
        @ 
         (** compile callbacks *)

          compile_callbacks callback_list name
        @ [ 
          (** assign callback set *)

          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 []