assert(id && id->identity);
        w = id->identity;
 
+       if (!d->expr) {
+               d->expr = scf_expr_alloc();
+               if (!d->expr)
+                       return -ENOMEM;
+       }
+
        if (scf_ast_find_variable(&var, parse->ast, w->text->data) < 0)
                return SCF_DFA_ERROR;
 
                scf_logi("md->current_var: %s, var: %s, member_flag: %d, line: %d, pos: %d\n",
                                md->current_var->w->text->data, var->w->text->data, var->member_flag, var->w->line, var->w->pos);
 
+               t = NULL;
+               if (scf_ast_find_type(&t, parse->ast, "Object") < 0)
+                       return SCF_DFA_ERROR;
+
+               v = scf_scope_find_variable(t->scope, "members");
+               if (!v) {
+                       scf_logw("var 'members' not found in struct '%s'\n", t->name->data);
+                       return SCF_DFA_ERROR;
+               }
+
+               node = scf_node_alloc(NULL, v->type, v);
+               if (!node)
+                       return SCF_DFA_ERROR;
+
+               if (scf_expr_add_node(d->expr, node) < 0) {
+                       scf_node_free(node);
+                       return SCF_DFA_ERROR;
+               }
+
+               node = scf_node_alloc(NULL, SCF_OP_ARRAY_INDEX, NULL);
+               if (!node)
+                       return SCF_DFA_ERROR;
+
+               if (scf_expr_add_node(d->expr, node) < 0) {
+                       scf_node_free(node);
+                       return SCF_DFA_ERROR;
+               }
+
                t = scf_block_find_type_type(parse->ast->current_block, SCF_VAR_INTPTR);
                v = SCF_VAR_ALLOC_BY_TYPE(NULL, t, 1, 0, NULL);
                if (!v)
        if (!node)
                return -ENOMEM;
 
-       if (!d->expr) {
-               d->expr = scf_expr_alloc();
-               if (!d->expr)
-                       return -ENOMEM;
-       }
-
        scf_logd("d->expr: %p, node: %p\n", d->expr, node);
 
        if (scf_expr_add_node(d->expr, node) < 0) {
                                        return SCF_DFA_ERROR;
                                }
 
-                               if (scf_function_signature(f) < 0)
+                               if (scf_function_signature(parse->ast, f) < 0)
                                        return SCF_DFA_ERROR;
 
                                w->text->data[2] = '\0';
 
        if (SCF_LEX_WORD_ARROW == w->type || SCF_LEX_WORD_DOT == w->type) {
                if (md->current_var->js_type >= 0) {
-                       t = NULL;
-                       if (scf_ast_find_type(&t, parse->ast, "Object") < 0)
-                               return SCF_DFA_ERROR;
-
-                       v = scf_scope_find_variable(t->scope, "members");
-                       if (!v) {
-                               scf_logw("var 'members' not found in struct '%s'\n", t->name->data);
-                               return SCF_DFA_ERROR;
-                       }
-
-                       node = scf_node_alloc(NULL, v->type, v);
-                       if (!node)
-                               return SCF_DFA_ERROR;
-
-                       if (scf_expr_add_node(d->expr, node) < 0) {
-                               scf_node_free(node);
-                               return SCF_DFA_ERROR;
-                       }
-
-                       node = scf_node_alloc(NULL, SCF_OP_ARRAY_INDEX, NULL);
-                       if (!node)
-                               return SCF_DFA_ERROR;
-
-                       if (scf_expr_add_node(d->expr, node) < 0) {
-                               scf_node_free(node);
-                               return SCF_DFA_ERROR;
-                       }
-
                        t = NULL;
                        if (scf_ast_find_type_type(&t, parse->ast, md->current_var->js_type) < 0)
                                return SCF_DFA_ERROR;
 
+                       scf_loge("t: %p, js_type: %d\n", t, t->type);
                        parse->ast->current_block = (scf_block_t*)t;
                }
        }
 
        scf_vector_t*    init_exprs;
        scf_stack_t*     init_objs;
 
+       scf_block_t*     parent_block;
+
+       scf_variable_t*  current_var;
        dfa_index_t*     current_index;
        int              current_n;
        int              current_dim;
        md->nb_lbs      = 0;
        md->nb_rbs      = 0;
 
-       d->current_var = NULL;
+       md->current_var = NULL;
+       d ->current_var = NULL;
        return ret;
 }
 
        return SCF_DFA_SWITCH_TO;
 }
 
+static int _data_action_func(scf_dfa_t* dfa, scf_vector_t* words, void* data)
+{
+       scf_parse_t*        parse = dfa->priv;
+       dfa_data_t*         d     = data;
+       init_module_data_t* md    = d->module_datas[dfa_module_init_data.index];
+
+       d->expr_local_flag = 0;
+
+       SCF_DFA_PUSH_HOOK(scf_dfa_find_node(dfa, "init_data_func_end"), SCF_DFA_HOOK_END);
+
+       return SCF_DFA_CONTINUE;
+}
+
+static int _data_action_func_end(scf_dfa_t* dfa, scf_vector_t* words, void* data)
+{
+       scf_parse_t*         parse = dfa->priv;
+       scf_ast_t*           ast   = parse->ast;
+       dfa_data_t*          d     = data;
+       init_module_data_t*  md    = d->module_datas[dfa_module_init_data.index];
+       scf_lex_word_t*      w;
+       scf_variable_t*      obj   = scf_stack_top(md->init_objs);
+       scf_type_t*          t;
+
+       d->expr_local_flag = 1;
+       d->current_var     = md->current_var;
+
+       assert(SCF_VAR_VAR != obj->type);
+
+       int ret = scf_ast_find_type_type(&t, ast, obj->type);
+       if (ret < 0)
+               return ret;
+
+       w = md->current_index[md->current_dim].w;
+       assert(w);
+       md->current_index[md->current_dim].w = NULL;
+
+       scf_logi("add member '%s()' to '%s_%d_%d'\n", w->text->data, obj->w->text->data, obj->w->line, obj->w->pos);
+
+       assert(d->current_function);
+
+       ret = scf_string_copy(d->current_function->node.w->text, w->text);
+       if (ret < 0)
+               return ret;
+
+       d->current_function = NULL;
+       return SCF_DFA_SWITCH_TO;
+}
+
 static int _data_action_entry(scf_dfa_t* dfa, scf_vector_t* words, void* data)
 {
        assert(words->size >= 2);
 
        scf_parse_t*        parse = dfa->priv;
+       scf_ast_t*          ast   = parse->ast;
        dfa_data_t*         d     = data;
        scf_lex_word_t*     w     = words->data[words->size - 2];
        init_module_data_t* md    = d->module_datas[dfa_module_init_data.index];
 
        d->expr_local_flag = 1;
 
+       md->current_var  = d->current_var;
+       md->parent_block = ast->current_block;
+
+       scf_dfa_del_hook_by_name(&(dfa->hooks[SCF_DFA_HOOK_POST]), "var_semicolon");
        return SCF_DFA_CONTINUE;
 }
 
 static int _data_action_lb(scf_dfa_t* dfa, scf_vector_t* words, void* data)
 {
        scf_parse_t*        parse = dfa->priv;
+       scf_ast_t*          ast   = parse->ast;
        dfa_data_t*         d     = data;
        init_module_data_t* md    = d->module_datas[dfa_module_init_data.index];
        scf_variable_t*     obj;
+       scf_type_t*         s;
 
        md->nb_lbs++;
 
 
        obj = scf_stack_top(md->init_objs);
 
-       scf_logi("obj: %p, md->nb_lbs: %d\n", obj, md->nb_lbs);
+       assert(SCF_VAR_VAR == obj->type);
+
+       s = scf_type_alloc(obj->w, obj->w->text->data, SCF_STRUCT + ast->nb_structs, 0);
+       if (!s) {
+               scf_loge("\n");
+               return SCF_DFA_ERROR;
+       }
+
+       s->scope = scf_scope_alloc(obj->w, "class");
+
+       ast->nb_structs++;
+       s->node.class_flag = 1;
+       scf_scope_push_type(md->parent_block->scope, s);
+       scf_node_add_child((scf_node_t*)md->parent_block, (scf_node_t*)s);
+
+       if (ast->current_block == md->parent_block)
+               d->current_var->js_type = s->type;
+
+       ast->current_block = (scf_block_t*)s;
+
+       obj->type    = s->type;
+       obj->js_type = s->type;
+
+       scf_loge("s: %p, js_type: %d, obj: %p, obj->w: %s, md->nb_lbs: %d\n", s, s->type, obj, obj->w->text->data, md->nb_lbs);
 
        SCF_DFA_PUSH_HOOK(scf_dfa_find_node(dfa, "init_data_comma"), SCF_DFA_HOOK_POST);
 
 static int _data_action_rb(scf_dfa_t* dfa, scf_vector_t* words, void* data)
 {
        scf_parse_t*        parse = dfa->priv;
+       scf_ast_t*          ast   = parse->ast;
        dfa_data_t*         d     = data;
        scf_type_t*         t     = NULL;
        init_module_data_t* md    = d->module_datas[dfa_module_init_data.index];
        md->nb_rbs++;
        md->current_dim--;
 
-       scf_logd("md->current_dim: %d, md->current_n: %d\n", md->current_dim, md->current_n);
+       scf_logi("md->current_dim: %d, md->current_n: %d\n", md->current_dim, md->current_n);
 
        int i;
        for (i = md->current_dim + 1; i < md->current_n; i++) {
 
        obj = scf_stack_pop(md->init_objs);
 
-       int ret = scf_ast_find_type_type(&t, parse->ast, obj->type);
+       int ret = scf_ast_find_type_type(&t, ast, obj->type);
        if (ret < 0)
-               return ret;
+               goto error;
 
-       if (_class_calculate_size(dfa, t) < 0)
-               return SCF_DFA_ERROR;
+       ret = _class_calculate_size(dfa, t);
+       if (ret < 0)
+               goto error;
 
        if (md->nb_rbs == md->nb_lbs) {
                d->expr_local_flag = 0;
 
                scf_logi("----------- type: %d, nb_pointers: %d\n\n", d->current_var->type, d->current_var->nb_pointers);
-#if 0
-               d->current_var->type        = obj->type;
-               d->current_var->size        = obj->size;
-               d->current_var->data_size   = obj->data_size;
-               d->current_var->nb_pointers = obj->nb_pointers;
 
-               if (_do_data_init(dfa, words, d) < 0)
-                       return SCF_DFA_ERROR;
-#else
                d->current_var->js_type = obj->type;
 
-               ret = _do_data_init(parse->ast, d, obj);
+               ast->current_block = md->parent_block;
+               md->parent_block   = NULL;
+
+               ret = _do_data_init(ast, d, obj);
                if (ret < 0)
-                       return ret;
-#endif
+                       goto error;
+
                scf_dfa_del_hook_by_name(&(dfa->hooks[SCF_DFA_HOOK_POST]), "init_data_comma");
        } else {
                w = md->current_index[md->current_dim].w;
                if (w)
-                       ret = _add_struct_member(parse->ast, d, obj);
+                       ret = _add_struct_member(ast, d, obj);
                else
-                       ret = _add_array_member(parse->ast, d, obj);
-               if (ret < 0) {
-                       scf_variable_free(obj);
-                       return ret;
-               }
+                       ret = _add_array_member(ast, d, obj);
+               if (ret < 0)
+                       goto error;
        }
 
        scf_variable_free(obj);
        obj = NULL;
+
+       obj = scf_stack_top(md->init_objs);
+       if (obj) {
+               ret = scf_ast_find_type_type(&t, ast, obj->type);
+               if (ret < 0)
+                       return ret;
+
+               ast->current_block = (scf_block_t*)t;
+       }
+
        return SCF_DFA_NEXT_WORD;
+
+error:
+       scf_variable_free(obj);
+       return ret;
 }
 
 static int _data_action_rs(scf_dfa_t* dfa, scf_vector_t* words, void* data)
 
 static int _dfa_init_module_init_data(scf_dfa_t* dfa)
 {
-       SCF_DFA_MODULE_NODE(dfa, init_data, entry,  _data_is_entry,            _data_action_entry);
-       SCF_DFA_MODULE_NODE(dfa, init_data, member, scf_dfa_is_identity,       _data_action_member);
+       SCF_DFA_MODULE_NODE(dfa, init_data, entry,    _data_is_entry,       _data_action_entry);
+       SCF_DFA_MODULE_NODE(dfa, init_data, member,   scf_dfa_is_identity,  _data_action_member);
 
-       SCF_DFA_MODULE_NODE(dfa, init_data, colon,  scf_dfa_is_colon,          scf_dfa_action_next);
-       SCF_DFA_MODULE_NODE(dfa, init_data, comma,  scf_dfa_is_comma,          _data_action_comma);
+       SCF_DFA_MODULE_NODE(dfa, init_data, colon,    scf_dfa_is_colon,     scf_dfa_action_next);
+       SCF_DFA_MODULE_NODE(dfa, init_data, comma,    scf_dfa_is_comma,     _data_action_comma);
+       SCF_DFA_MODULE_NODE(dfa, init_data, func,     scf_dfa_is_func,      _data_action_func);
+       SCF_DFA_MODULE_NODE(dfa, init_data, func_end, scf_dfa_is_entry,     _data_action_func_end);
 
-       SCF_DFA_MODULE_NODE(dfa, init_data, lb,     scf_dfa_is_lb,             _data_action_lb);
-       SCF_DFA_MODULE_NODE(dfa, init_data, rb,     scf_dfa_is_rb,             _data_action_rb);
+       SCF_DFA_MODULE_NODE(dfa, init_data, lb,       scf_dfa_is_lb,        _data_action_lb);
+       SCF_DFA_MODULE_NODE(dfa, init_data, rb,       scf_dfa_is_rb,        _data_action_rb);
 
-       SCF_DFA_MODULE_NODE(dfa, init_data, ls,     scf_dfa_is_ls,             _data_action_ls);
-       SCF_DFA_MODULE_NODE(dfa, init_data, rs,     scf_dfa_is_rs,             _data_action_rs);
+       SCF_DFA_MODULE_NODE(dfa, init_data, ls,       scf_dfa_is_ls,        _data_action_ls);
+       SCF_DFA_MODULE_NODE(dfa, init_data, rs,       scf_dfa_is_rs,        _data_action_rs);
 
        scf_parse_t*        parse = dfa->priv;
        dfa_data_t*         d     = parse->dfa_data;
 
 static int _dfa_init_syntax_init_data(scf_dfa_t* dfa)
 {
-       SCF_DFA_GET_MODULE_NODE(dfa, init_data, entry,  entry);
-       SCF_DFA_GET_MODULE_NODE(dfa, init_data, comma,  comma);
-       SCF_DFA_GET_MODULE_NODE(dfa, init_data, colon,  colon);
-       SCF_DFA_GET_MODULE_NODE(dfa, init_data, member, member);
+       SCF_DFA_GET_MODULE_NODE(dfa, init_data,   entry,     entry);
+       SCF_DFA_GET_MODULE_NODE(dfa, init_data,   comma,     comma);
+       SCF_DFA_GET_MODULE_NODE(dfa, init_data,   colon,     colon);
+       SCF_DFA_GET_MODULE_NODE(dfa, init_data,   member,    member);
+       SCF_DFA_GET_MODULE_NODE(dfa, init_data,   func,      func);
+       SCF_DFA_GET_MODULE_NODE(dfa, init_data,   func_end,  func_end);
 
-       SCF_DFA_GET_MODULE_NODE(dfa, init_data, lb,     lb);
-       SCF_DFA_GET_MODULE_NODE(dfa, init_data, rb,     rb);
+       SCF_DFA_GET_MODULE_NODE(dfa, init_data,   lb,        lb);
+       SCF_DFA_GET_MODULE_NODE(dfa, init_data,   rb,        rb);
 
-       SCF_DFA_GET_MODULE_NODE(dfa, init_data, ls,     ls);
-       SCF_DFA_GET_MODULE_NODE(dfa, init_data, rs,     rs);
+       SCF_DFA_GET_MODULE_NODE(dfa, init_data,   ls,        ls);
+       SCF_DFA_GET_MODULE_NODE(dfa, init_data,   rs,        rs);
 
-       SCF_DFA_GET_MODULE_NODE(dfa, expr,      entry,  expr);
+       SCF_DFA_GET_MODULE_NODE(dfa, function_js, func,      func_js);
+       SCF_DFA_GET_MODULE_NODE(dfa, expr,        entry,     expr);
 
        // empty init, use 0 to fill the data
        scf_dfa_node_add_child(entry,     lb);
        // init member of object
        scf_dfa_node_add_child(lb,        member);
        scf_dfa_node_add_child(member,    colon);
+
+       // init member function()
+       scf_dfa_node_add_child(colon,     func);
+       scf_dfa_node_add_child(func,      func_js);
+       scf_dfa_node_add_child(func_end,  member);
+       scf_dfa_node_add_child(func_end,  rb);
+
        scf_dfa_node_add_child(colon,     expr);
        scf_dfa_node_add_child(expr,      comma);
-
        scf_dfa_node_add_child(comma,     member);
        scf_dfa_node_add_child(colon,     lb);
        scf_dfa_node_add_child(expr,      rb);