1
0
SongZihuan 5 жил өмнө
parent
commit
db89510a6e

+ 1 - 1
gwarf.c

@@ -8,7 +8,7 @@ int main(){
     statement_base = make_statement_base(global_inter->global_code);
     GWARF_result father;
     login_official(the_var, official_func);  // 注册官方函数
-    text_login_official(the_var, text_official_func);
+    int_login_official(the_var, int_official_func);  // 注册int函数
     parser("/home/songzihuan/test.gwf");
     printf("----start run----\n");
     traverse_global(global_inter->global_code, the_var);

+ 21 - 15
gwarf_interpreter/interprete.h

@@ -6,14 +6,14 @@
 
 // the type of data(GWARF_value)
 typedef enum{
-    NUMBER_value = 1,
-    INT_value,  // INT 类型
-    BOOL_value,  // bool : true or false
-    STRING_value,  // char *
-    NULL_value,
-    FUNC_value,
-    CLASS_value,
-    OBJECT_value,
+    NUMBER_value = 1,  // [只允许系统使用]
+    INT_value,  // INT 类型[只允许系统使用]
+    BOOL_value,  // bool : true or false [只允许系统使用]
+    STRING_value,  // char * [只允许系统使用]
+    NULL_value,  // 无值类型 [只允许系统使用]
+    FUNC_value,  // 函数
+    CLASS_value,  // 对象
+    OBJECT_value,  // 实例
 } GWARF_value_type;
 
 // all value is GWARF_value
@@ -307,12 +307,17 @@ typedef enum{
 typedef enum{
     printf_func = 1,  // print_func
     __init__func = 2,
+    __value__func = 3,
+    __add__func = 4,
+    __sub__func = 5,
+    __mul__func = 6,
+    __div__func = 7,
 } official_func_type;
 
 typedef struct func{
     func_type type;
     official_func_type official_func;
-    struct GWARF_result (*paser)(struct func *, struct parameter *, struct var_list *the_var, GWARF_result);
+    struct GWARF_result (*paser)(struct func *, struct parameter *, struct var_list *the_var, GWARF_result, var_list *);
     struct parameter *parameter_list;  // def parameter
     struct statement *done;  // def to do
     struct var_list *the_var;  // func会记录the_var,因为不同地方调用var如果var链不统一那就会很乱
@@ -345,17 +350,18 @@ void append_parameter_name(char *, parameter *);
 parameter *make_parameter_value(statement *);
 void append_parameter_value(statement *, parameter *);
 parameter *add_parameter_value(statement *, parameter *);
+parameter *pack_value_parameter(GWARF_value);
 
 // main
 inter *global_inter;
 statement_list *statement_base;
 
-void login_official_func(int type, int is_class, var_list *the_var, char *name, GWARF_result (*paser)(func *, parameter *, var_list *, GWARF_result));
-void login_official(var_list *the_var, GWARF_result (*paser)(func *, parameter *, var_list *, GWARF_result));
+void login_official_func(int type, int is_class, var_list *the_var, char *name, GWARF_result (*paser)(func *, parameter *, var_list *, GWARF_result, var_list *));
+void login_official(var_list *the_var, GWARF_result (*paser)(func *, parameter *, var_list *, GWARF_result, var_list *));
 
 // 内置函数
-GWARF_result official_func(func *the_func, parameter *tmp_s, var_list *the_var, GWARF_result father);
+GWARF_result official_func(func *the_func, parameter *tmp_s, var_list *the_var, GWARF_result father, var_list *);
 
-// text内置类
-void text_login_official(var_list *the_var, GWARF_result (*paser)(func *, parameter *, var_list *, GWARF_result));
-GWARF_result text_official_func(func *the_func, parameter *tmp_s, var_list *the_var, GWARF_result father);
+// int内置类
+void int_login_official(var_list *the_var, GWARF_result (*paser)(func *, parameter *, var_list *, GWARF_result, var_list *));
+GWARF_result int_official_func(func *the_func, parameter *tmp_s, var_list *the_var, GWARF_result father, var_list *);

+ 522 - 190
gwarf_interpreter/interpreter.c

@@ -19,6 +19,7 @@ GWARF_result if_func(if_list *, var_list *);
 GWARF_result for_func(statement *, var_list *);
 GWARF_result negative_func(GWARF_result, var_list *);
 GWARF_result call_back(statement *, var_list *);
+GWARF_result call_back_core(GWARF_result, var_list *, parameter *);
 
 int get_var_list_len(var_list *);
 var_list *copy_var_list(var_list *);
@@ -110,6 +111,17 @@ parameter *add_parameter_value(statement *value, parameter *parameter_base){
     return new_tmp;
 }
 
+parameter *pack_value_parameter(GWARF_value value){  // 把value封装成参数
+    parameter *tmp;
+    tmp = malloc(sizeof(parameter));  // get an address for base var
+    tmp->next = NULL;
+    statement *statement_tmp = malloc(sizeof(statement));
+    statement_tmp->type = base_value;
+    statement_tmp->code.base_value.value = value;
+    tmp->u.value = statement_tmp;
+    return tmp;
+}
+
 // ---- var func
 
 var *make_var(){  // make var with base
@@ -531,7 +543,7 @@ GWARF_result read_statement(statement *the_statement, var_list *the_var, var_lis
             var *tmp = find_var(the_var, from, (the_statement->code).base_var.var_name);
             if(tmp == NULL){
                 return_value.u = name_no_found;  // nameerror
-                puts("name not found");
+                printf("name not found [%s]\n", (the_statement->code).base_var.var_name);
             }
             else
             {
@@ -1197,10 +1209,16 @@ GWARF_result operation_func(statement *the_statement, var_list *the_var, var_lis
 }
 
 GWARF_result call_back(statement *the_statement, var_list *the_var){  // the func for add and call from read_statement_list
-    GWARF_result result, get = traverse(the_statement->code.call.func, the_var, false);
+    GWARF_result get = traverse(the_statement->code.call.func, the_var, false);
+    return call_back_core(get, the_var, the_statement->code.call.parameter_list);
+}
+
+GWARF_result call_back_core(GWARF_result get, var_list *the_var, parameter *tmp_s){  // the func for add and call from read_statement_list
+    GWARF_result result;
+    var_list *old_var_list = the_var;
     if(get.value.type == FUNC_value){
         func *func_ = get.value.value.func_value;
-        parameter *tmp_x = func_->parameter_list, *tmp_s = the_statement->code.call.parameter_list;
+        parameter *tmp_x = func_->parameter_list;
         the_var = func_->the_var;
         // tmp_x:形参,tmp_s:实参
 
@@ -1246,7 +1264,7 @@ GWARF_result call_back(statement *the_statement, var_list *the_var){  // the fun
             puts("----stop start func----");
         }
         else{
-            result = func_->paser(func_, tmp_s, the_var, get);
+            result = func_->paser(func_, tmp_s, the_var, get, old_var_list);
         }
         the_var = free_var_list(the_var);  // free the new var
     }
@@ -1262,7 +1280,7 @@ GWARF_result call_back(statement *the_statement, var_list *the_var){  // the fun
         var *init_tmp = find_var(object_tmp->cls, 0, "__init__");
         if(init_tmp != NULL){  // 找到了__init__
             func *func_ = init_tmp->value.value.func_value;
-            parameter *tmp_x = func_->parameter_list, *tmp_s = the_statement->code.call.parameter_list;
+            parameter *tmp_x = func_->parameter_list;
             the_var = func_->the_var;
             // tmp_x:形参,tmp_s:实参
 
@@ -1301,7 +1319,12 @@ GWARF_result call_back(statement *the_statement, var_list *the_var){  // the fun
                 puts("----stop start func----");
             }
             else{
-                result = func_->paser(func_, tmp_s, the_var, get);
+                GWARF_result tmp_get;
+                GWARF_value father;
+                father.type = OBJECT_value;
+                father.value.object_value = object_tmp;
+                tmp_get.father = &father;
+                result = func_->paser(func_, tmp_s, the_var, tmp_get, old_var_list);
             }
             the_var = free_var_list(the_var);  // free the new var
         }
@@ -1316,40 +1339,52 @@ GWARF_result call_back(statement *the_statement, var_list *the_var){  // the fun
 // ---------  ADD
 GWARF_result add_func(GWARF_result left_result, GWARF_result right_result, var_list *the_var){  // the func for add and call from read_statement_list
     GWARF_result return_value;  // the result by call read_statement_list with left and right; value is the result for add
-    if(left_result.value.type == NULL_value){
-        return_value.value = right_result.value;  // NULL加法相当于0
-    }
-    else if(right_result.value.type == NULL_value){
-        return_value.value = left_result.value;  // NULL加法相当于0
-    }
-    else if((left_result.value.type == INT_value || left_result.value.type == BOOL_value) && (right_result.value.type == INT_value || right_result.value.type == BOOL_value)){  // all is INT
-        return_value.u = return_def;
-        return_value.value.type = INT_value;
-        return_value.value.value.int_value = (int)(left_result.value.value.int_value + right_result.value.value.int_value);
-    }
-    else if((left_result.value.type == NUMBER_value) && (right_result.value.type == NUMBER_value)){  // all is NUMBER
-        return_value.u = return_def;
-        return_value.value.type = NUMBER_value;
-        return_value.value.value.double_value = (double)(left_result.value.value.double_value + right_result.value.value.double_value);
-    }
-    else if((left_result.value.type == INT_value || left_result.value.type == BOOL_value) && (right_result.value.type == NUMBER_value)){  // all is NUMBER
-        return_value.u = return_def;
-        return_value.value.type = NUMBER_value;
-        return_value.value.value.double_value = (double)(left_result.value.value.int_value + right_result.value.value.double_value);
-    }
-    else if((left_result.value.type == NUMBER_value) && (right_result.value.type == INT_value || right_result.value.type == BOOL_value)){  // all is NUMBER
-        return_value.u = return_def;
-        return_value.value.type = NUMBER_value;
-        return_value.value.value.double_value = (double)(left_result.value.value.double_value + right_result.value.value.int_value);
+    if((left_result.value.type == OBJECT_value) && (right_result.value.type == OBJECT_value)){  // 调用add方法
+        GWARF_result get;
+        GWARF_value base_the_var = left_result.value;  // 只有一个参数
+        var_list *call_var = base_the_var.value.object_value->the_var;
+
+        get.value = find_var(call_var, 0, "__add__")->value;
+        get.father = &base_the_var;  // 设置father
+        return_value = call_back_core(get, the_var, pack_value_parameter(right_result.value));
     }
-    else if((left_result.value.type == STRING_value) && (right_result.value.type == STRING_value)){  // all is NUMBER
-        return_value.u = return_def;
-        return_value.value.type = STRING_value;
-        char *l = left_result.value.value.string;
-        char *r = right_result.value.value.string;
-        return_value.value.value.string = malloc(strlen(l) + strlen(r));  // 创建新空间
-        strcpy(return_value.value.value.string, l);  // 复制字符串
-        strcat(return_value.value.value.string, r);  // 追加字符串
+    else{
+        // 理论上用户是不可以直接调用下面的基类的,计算过程中万物皆类
+        if(left_result.value.type == NULL_value){
+            return_value.value = right_result.value;  // NULL加法相当于0
+        }
+        else if(right_result.value.type == NULL_value){
+            return_value.value = left_result.value;  // NULL加法相当于0
+        }
+        else if((left_result.value.type == INT_value || left_result.value.type == BOOL_value) && (right_result.value.type == INT_value || right_result.value.type == BOOL_value)){  // all is INT
+            return_value.u = return_def;
+            return_value.value.type = INT_value;
+            return_value.value.value.int_value = (int)(left_result.value.value.int_value + right_result.value.value.int_value);
+        }
+        else if((left_result.value.type == NUMBER_value) && (right_result.value.type == NUMBER_value)){  // all is NUMBER
+            return_value.u = return_def;
+            return_value.value.type = NUMBER_value;
+            return_value.value.value.double_value = (double)(left_result.value.value.double_value + right_result.value.value.double_value);
+        }
+        else if((left_result.value.type == INT_value || left_result.value.type == BOOL_value) && (right_result.value.type == NUMBER_value)){  // all is NUMBER
+            return_value.u = return_def;
+            return_value.value.type = NUMBER_value;
+            return_value.value.value.double_value = (double)(left_result.value.value.int_value + right_result.value.value.double_value);
+        }
+        else if((left_result.value.type == NUMBER_value) && (right_result.value.type == INT_value || right_result.value.type == BOOL_value)){  // all is NUMBER
+            return_value.u = return_def;
+            return_value.value.type = NUMBER_value;
+            return_value.value.value.double_value = (double)(left_result.value.value.double_value + right_result.value.value.int_value);
+        }
+        else if((left_result.value.type == STRING_value) && (right_result.value.type == STRING_value)){  // all is NUMBER
+            return_value.u = return_def;
+            return_value.value.type = STRING_value;
+            char *l = left_result.value.value.string;
+            char *r = right_result.value.value.string;
+            return_value.value.value.string = malloc(strlen(l) + strlen(r));  // 创建新空间
+            strcpy(return_value.value.value.string, l);  // 复制字符串
+            strcat(return_value.value.value.string, r);  // 追加字符串
+        }
     }
     return return_value;
 }
@@ -1357,31 +1392,42 @@ GWARF_result add_func(GWARF_result left_result, GWARF_result right_result, var_l
 // ---------  SUB
 GWARF_result sub_func(GWARF_result left_result, GWARF_result right_result, var_list *the_var){  // the func for sub and call from read_statement_list
     GWARF_result return_value;  // the result by call read_statement_list with left and right; value is the result for sub
-    if(left_result.value.type == NULL_value){
-        return negative_func(right_result, the_var);  // NULL减法相当于0
-    }
-    else if(right_result.value.type == NULL_value){
-        return_value.value = left_result.value;  // NULL减法相当于0
-    }
-    else if((left_result.value.type == INT_value || left_result.value.type == BOOL_value) && (right_result.value.type == INT_value || right_result.value.type == BOOL_value)){  // all is INT
-        return_value.u = return_def;
-        return_value.value.type = INT_value;
-        return_value.value.value.int_value = (int)(left_result.value.value.int_value - right_result.value.value.int_value);
-    }
-    else if((left_result.value.type == NUMBER_value) && (right_result.value.type == NUMBER_value)){  // all is NUMBER
-        return_value.u = return_def;
-        return_value.value.type = NUMBER_value;
-        return_value.value.value.double_value = (double)(left_result.value.value.double_value - right_result.value.value.double_value);
-    }
-    else if((left_result.value.type == INT_value || left_result.value.type == BOOL_value) && (right_result.value.type == NUMBER_value)){  // all is NUMBER
-        return_value.u = return_def;
-        return_value.value.type = NUMBER_value;
-        return_value.value.value.double_value = (double)(left_result.value.value.int_value - right_result.value.value.double_value);
+    if((left_result.value.type == OBJECT_value) && (right_result.value.type == OBJECT_value)){  // 调用sub方法
+        GWARF_result get;
+        GWARF_value base_the_var = left_result.value;  // 只有一个参数
+        var_list *call_var = base_the_var.value.object_value->the_var;
+
+        get.value = find_var(call_var, 0, "__sub__")->value;
+        get.father = &base_the_var;  // 设置father
+        return_value = call_back_core(get, the_var, pack_value_parameter(right_result.value));
     }
-    else if((left_result.value.type == NUMBER_value) && (right_result.value.type == INT_value || right_result.value.type == BOOL_value)){  // all is NUMBER
-        return_value.u = return_def;
-        return_value.value.type = NUMBER_value;
-        return_value.value.value.double_value = (double)(left_result.value.value.double_value - right_result.value.value.int_value);
+    else{
+        if(left_result.value.type == NULL_value){
+            return negative_func(right_result, the_var);  // NULL减法相当于0
+        }
+        else if(right_result.value.type == NULL_value){
+            return_value.value = left_result.value;  // NULL减法相当于0
+        }
+        else if((left_result.value.type == INT_value || left_result.value.type == BOOL_value) && (right_result.value.type == INT_value || right_result.value.type == BOOL_value)){  // all is INT
+            return_value.u = return_def;
+            return_value.value.type = INT_value;
+            return_value.value.value.int_value = (int)(left_result.value.value.int_value - right_result.value.value.int_value);
+        }
+        else if((left_result.value.type == NUMBER_value) && (right_result.value.type == NUMBER_value)){  // all is NUMBER
+            return_value.u = return_def;
+            return_value.value.type = NUMBER_value;
+            return_value.value.value.double_value = (double)(left_result.value.value.double_value - right_result.value.value.double_value);
+        }
+        else if((left_result.value.type == INT_value || left_result.value.type == BOOL_value) && (right_result.value.type == NUMBER_value)){  // all is NUMBER
+            return_value.u = return_def;
+            return_value.value.type = NUMBER_value;
+            return_value.value.value.double_value = (double)(left_result.value.value.int_value - right_result.value.value.double_value);
+        }
+        else if((left_result.value.type == NUMBER_value) && (right_result.value.type == INT_value || right_result.value.type == BOOL_value)){  // all is NUMBER
+            return_value.u = return_def;
+            return_value.value.type = NUMBER_value;
+            return_value.value.value.double_value = (double)(left_result.value.value.double_value - right_result.value.value.int_value);
+        }
     }
     return return_value;
 }
@@ -1432,90 +1478,101 @@ GWARF_result negative_func(GWARF_result right_result, var_list *the_var){  // th
 // ---------  MUL
 GWARF_result mul_func(GWARF_result left_result, GWARF_result right_result, var_list *the_var){  // the func for mul and call from read_statement_list
     GWARF_result return_value;  // the result by call read_statement_list with left and right; value is the result for mul
-    if(left_result.value.type == NULL_value){
-        return_value.value = right_result.value;  // NULL乘法相当于1
-    }
-    else if(right_result.value.type == NULL_value){
-        return_value.value = left_result.value;  // NULL乘法相当于1
-    }
-    else if((left_result.value.type == INT_value || left_result.value.type == BOOL_value) && (right_result.value.type == INT_value || right_result.value.type == BOOL_value)){  // all is INT
-        return_value.u = return_def;
-        return_value.value.type = INT_value;
-        return_value.value.value.int_value = (int)(left_result.value.value.int_value * right_result.value.value.int_value);
-    }
-    else if((left_result.value.type == NUMBER_value) && (right_result.value.type == NUMBER_value)){  // all is NUMBER
-        return_value.u = return_def;
-        return_value.value.type = NUMBER_value;
-        return_value.value.value.double_value = (double)(left_result.value.value.double_value * right_result.value.value.double_value);
-    }
-    else if((left_result.value.type == INT_value || left_result.value.type == BOOL_value) && (right_result.value.type == NUMBER_value)){  // all is NUMBER
-        return_value.u = return_def;
-        return_value.value.type = NUMBER_value;
-        return_value.value.value.double_value = (double)(left_result.value.value.int_value * right_result.value.value.double_value);
-    }
-    else if((left_result.value.type == NUMBER_value) && (right_result.value.type == INT_value || right_result.value.type == BOOL_value)){  // all is NUMBER
-        return_value.u = return_def;
-        return_value.value.type = NUMBER_value;
-        return_value.value.value.double_value = (double)(left_result.value.value.double_value * right_result.value.value.int_value);
+    if((left_result.value.type == OBJECT_value) && (right_result.value.type == OBJECT_value)){  // 调用add方法
+        GWARF_result get;
+        GWARF_value base_the_var = left_result.value;  // 只有一个参数
+        var_list *call_var = base_the_var.value.object_value->the_var;
+
+        get.value = find_var(call_var, 0, "__mul__")->value;
+        get.father = &base_the_var;  // 设置father
+        return_value = call_back_core(get, the_var, pack_value_parameter(right_result.value));
     }
-    else if((left_result.value.type == INT_value) && (right_result.value.type == STRING_value)){  // all is NUMBER
-        return_value.u = return_def;
-        return_value.value.type = STRING_value;
-        int l = left_result.value.value.int_value;
-        char *r = right_result.value.value.string;
-        if(l == 0){
-            return_value.value.value.string = (char *)malloc(0);  // NULL string
+    else{
+        if(left_result.value.type == NULL_value){
+            return_value.value = right_result.value;  // NULL乘法相当于1
         }
-        else if(l > 0){
-            return_value.value.value.string = malloc(strlen(r) * l);  // 创建新空间
-            strcpy(return_value.value.value.string, r);  // 复制字符串
-            l -= 1;
-            for(;l>0;l -= 1){
-                strcat(return_value.value.value.string, r);  // 追加字符串
-            }
+        else if(right_result.value.type == NULL_value){
+            return_value.value = left_result.value;  // NULL乘法相当于1
         }
-        else{
-            return_value.value.value.string = malloc(strlen(r) * (-l));  // 创建新空间
-            char *tmp = malloc(strlen(r) * (-l));
-            strcpy(tmp, r);  // 复制字符串
-            l += 1;
-            for(;l<0;l += 1){
-                strcat(tmp, r);  // 追加字符串
-            }
-            for(int i=0;i<strlen(tmp);i += 1){
-                return_value.value.value.string[i] = tmp[strlen(tmp) - i - 1];  // 反转
+        else if((left_result.value.type == INT_value || left_result.value.type == BOOL_value) && (right_result.value.type == INT_value || right_result.value.type == BOOL_value)){  // all is INT
+            return_value.u = return_def;
+            return_value.value.type = INT_value;
+            return_value.value.value.int_value = (int)(left_result.value.value.int_value * right_result.value.value.int_value);
+        }
+        else if((left_result.value.type == NUMBER_value) && (right_result.value.type == NUMBER_value)){  // all is NUMBER
+            return_value.u = return_def;
+            return_value.value.type = NUMBER_value;
+            return_value.value.value.double_value = (double)(left_result.value.value.double_value * right_result.value.value.double_value);
+        }
+        else if((left_result.value.type == INT_value || left_result.value.type == BOOL_value) && (right_result.value.type == NUMBER_value)){  // all is NUMBER
+            return_value.u = return_def;
+            return_value.value.type = NUMBER_value;
+            return_value.value.value.double_value = (double)(left_result.value.value.int_value * right_result.value.value.double_value);
+        }
+        else if((left_result.value.type == NUMBER_value) && (right_result.value.type == INT_value || right_result.value.type == BOOL_value)){  // all is NUMBER
+            return_value.u = return_def;
+            return_value.value.type = NUMBER_value;
+            return_value.value.value.double_value = (double)(left_result.value.value.double_value * right_result.value.value.int_value);
+        }
+        else if((left_result.value.type == INT_value) && (right_result.value.type == STRING_value)){  // all is NUMBER
+            return_value.u = return_def;
+            return_value.value.type = STRING_value;
+            int l = left_result.value.value.int_value;
+            char *r = right_result.value.value.string;
+            if(l == 0){
+                return_value.value.value.string = (char *)malloc(0);  // NULL string
+            }
+            else if(l > 0){
+                return_value.value.value.string = malloc(strlen(r) * l);  // 创建新空间
+                strcpy(return_value.value.value.string, r);  // 复制字符串
+                l -= 1;
+                for(;l>0;l -= 1){
+                    strcat(return_value.value.value.string, r);  // 追加字符串
+                }
             }
-        }
-    }
-    else if((left_result.value.type == STRING_value) && (right_result.value.type == INT_value)){  // all is NUMBER
-        return_value.u = return_def;
-        return_value.value.type = STRING_value;
-        int l = right_result.value.value.int_value;
-        char *r = left_result.value.value.string;
-        if(l == 0){
-            return_value.value.value.string = (char *)malloc(0);  // NULL string
-        }
-        else if(l > 0){
-            return_value.value.value.string = malloc(strlen(r) * l);  // 创建新空间
-            strcpy(return_value.value.value.string, r);  // 复制字符串
-            l -= 1;
-            for(;l>0;l -= 1){
-                strcat(return_value.value.value.string, r);  // 追加字符串
+            else{
+                return_value.value.value.string = malloc(strlen(r) * (-l));  // 创建新空间
+                char *tmp = malloc(strlen(r) * (-l));
+                strcpy(tmp, r);  // 复制字符串
+                l += 1;
+                for(;l<0;l += 1){
+                    strcat(tmp, r);  // 追加字符串
+                }
+                for(int i=0;i<strlen(tmp);i += 1){
+                    return_value.value.value.string[i] = tmp[strlen(tmp) - i - 1];  // 反转
+                }
             }
         }
-        else{
-            return_value.value.value.string = malloc(strlen(r) * (-l));  // 创建新空间
-            char *tmp = malloc(strlen(r) * (-l));
-            strcpy(tmp, r);  // 复制字符串
-            l += 1;
-            for(;l<0;l += 1){
-                strcat(tmp, r);  // 追加字符串
+        else if((left_result.value.type == STRING_value) && (right_result.value.type == INT_value)){  // all is NUMBER
+            return_value.u = return_def;
+            return_value.value.type = STRING_value;
+            int l = right_result.value.value.int_value;
+            char *r = left_result.value.value.string;
+            if(l == 0){
+                return_value.value.value.string = (char *)malloc(0);  // NULL string
+            }
+            else if(l > 0){
+                return_value.value.value.string = malloc(strlen(r) * l);  // 创建新空间
+                strcpy(return_value.value.value.string, r);  // 复制字符串
+                l -= 1;
+                for(;l>0;l -= 1){
+                    strcat(return_value.value.value.string, r);  // 追加字符串
+                }
             }
-            for(int i=0;i<strlen(tmp);i += 1){
-                return_value.value.value.string[i] = tmp[strlen(tmp) - i - 1];  // 反转
+            else{
+                return_value.value.value.string = malloc(strlen(r) * (-l));  // 创建新空间
+                char *tmp = malloc(strlen(r) * (-l));
+                strcpy(tmp, r);  // 复制字符串
+                l += 1;
+                for(;l<0;l += 1){
+                    strcat(tmp, r);  // 追加字符串
+                }
+                for(int i=0;i<strlen(tmp);i += 1){
+                    return_value.value.value.string[i] = tmp[strlen(tmp) - i - 1];  // 反转
+                }
             }
+            
         }
-        
     }
     return return_value;
 }
@@ -1523,34 +1580,45 @@ GWARF_result mul_func(GWARF_result left_result, GWARF_result right_result, var_l
 // ---------  DIV
 GWARF_result div_func(GWARF_result left_result, GWARF_result right_result, var_list *the_var){  // the func for div and call from read_statement_list
     GWARF_result return_value;  // the result by call read_statement_list with left and right; value is the result for div
-    if(left_result.value.type == NULL_value){
-        left_result.value.type = INT_value;
-        left_result.value.value.int_value = 1;
-    }
-    else if(right_result.value.type == NULL_value){
-        return_value.value = left_result.value;  // NULL除发相当于1
-        goto return_result;
-    }
-    // 此处不是else if
-    if((left_result.value.type == INT_value || left_result.value.type == BOOL_value) && (right_result.value.type == INT_value || right_result.value.type == BOOL_value)){  // all is INT
-        return_value.u = return_def;
-        return_value.value.type = NUMBER_value;  // 除 无int
-        return_value.value.value.double_value = ((double)left_result.value.value.int_value / (double)right_result.value.value.int_value);
-    }
-    else if((left_result.value.type == NUMBER_value) && (right_result.value.type == NUMBER_value)){  // all is NUMBER
-        return_value.u = return_def;
-        return_value.value.type = NUMBER_value;
-        return_value.value.value.double_value = (left_result.value.value.double_value / right_result.value.value.double_value);
-    }
-    else if((left_result.value.type == INT_value || left_result.value.type == BOOL_value) && (right_result.value.type == NUMBER_value)){  // all is NUMBER
-        return_value.u = return_def;
-        return_value.value.type = NUMBER_value;
-        return_value.value.value.double_value = ((double)left_result.value.value.int_value / right_result.value.value.double_value);
+    if((left_result.value.type == OBJECT_value) && (right_result.value.type == OBJECT_value)){  // 调用add方法
+        GWARF_result get;
+        GWARF_value base_the_var = left_result.value;  // 只有一个参数
+        var_list *call_var = base_the_var.value.object_value->the_var;
+
+        get.value = find_var(call_var, 0, "__div__")->value;
+        get.father = &base_the_var;  // 设置father
+        return_value = call_back_core(get, the_var, pack_value_parameter(right_result.value));
     }
-    else if((left_result.value.type == NUMBER_value) && (right_result.value.type == INT_value || right_result.value.type == BOOL_value)){  // all is NUMBER
-        return_value.u = return_def;
-        return_value.value.type = NUMBER_value;
-        return_value.value.value.double_value = (left_result.value.value.double_value / (double)right_result.value.value.int_value);
+    else{
+        if(left_result.value.type == NULL_value){
+            left_result.value.type = INT_value;
+            left_result.value.value.int_value = 1;
+        }
+        else if(right_result.value.type == NULL_value){
+            return_value.value = left_result.value;  // NULL除发相当于1
+            goto return_result;
+        }
+        // 此处不是else if
+        if((left_result.value.type == INT_value || left_result.value.type == BOOL_value) && (right_result.value.type == INT_value || right_result.value.type == BOOL_value)){  // all is INT
+            return_value.u = return_def;
+            return_value.value.type = NUMBER_value;  // 除 无int
+            return_value.value.value.double_value = ((double)left_result.value.value.int_value / (double)right_result.value.value.int_value);
+        }
+        else if((left_result.value.type == NUMBER_value) && (right_result.value.type == NUMBER_value)){  // all is NUMBER
+            return_value.u = return_def;
+            return_value.value.type = NUMBER_value;
+            return_value.value.value.double_value = (left_result.value.value.double_value / right_result.value.value.double_value);
+        }
+        else if((left_result.value.type == INT_value || left_result.value.type == BOOL_value) && (right_result.value.type == NUMBER_value)){  // all is NUMBER
+            return_value.u = return_def;
+            return_value.value.type = NUMBER_value;
+            return_value.value.value.double_value = ((double)left_result.value.value.int_value / right_result.value.value.double_value);
+        }
+        else if((left_result.value.type == NUMBER_value) && (right_result.value.type == INT_value || right_result.value.type == BOOL_value)){  // all is NUMBER
+            return_value.u = return_def;
+            return_value.value.type = NUMBER_value;
+            return_value.value.value.double_value = (left_result.value.value.double_value / (double)right_result.value.value.int_value);
+        }
     }
     return_result: return return_value;
 }
@@ -1845,7 +1913,7 @@ inter *get_inter(){
 }
 
 // ------official func
-void login_official_func(int type, int is_class, var_list *the_var, char *name, GWARF_result (*paser)(func *, parameter *, var_list *, GWARF_result)){  // 注册单个official func
+void login_official_func(int type, int is_class, var_list *the_var, char *name, GWARF_result (*paser)(func *, parameter *, var_list *, GWARF_result, var_list *)){  // 注册单个official func
     GWARF_result func_value;
     func *func_tmp = malloc(sizeof(func));
 
@@ -1862,7 +1930,7 @@ void login_official_func(int type, int is_class, var_list *the_var, char *name,
     assigment_func(name, func_value, the_var, 0);  // 注册函数到指定的位置
 }
 
-void login_official(var_list *the_var, GWARF_result (*paser)(func *, parameter *, var_list *, GWARF_result)){
+void login_official(var_list *the_var, GWARF_result (*paser)(func *, parameter *, var_list *, GWARF_result, var_list *)){
     // {{official_func_type, is_class}}
     int a[][2] = {{1,0}};
     // {login_name}
@@ -1876,7 +1944,7 @@ void login_official(var_list *the_var, GWARF_result (*paser)(func *, parameter *
 
 
 // global 全局内置函数解析器
-GWARF_result official_func(func *the_func, parameter *tmp_s, var_list *the_var, GWARF_result father){
+GWARF_result official_func(func *the_func, parameter *tmp_s, var_list *the_var, GWARF_result father, var_list *out_var){
     GWARF_result return_value;
     switch (the_func->official_func)
     {
@@ -1885,7 +1953,7 @@ GWARF_result official_func(func *the_func, parameter *tmp_s, var_list *the_var,
             goto return_result;
         }
         while(1){
-            GWARF_result tmp = traverse(tmp_s->u.value, the_var, false);
+            GWARF_result tmp = traverse(tmp_s->u.value, out_var, false);
             if((tmp.value.type == INT_value)){
                 printf("%d", tmp.value.value.int_value);
             }
@@ -1933,8 +2001,62 @@ GWARF_result official_func(func *the_func, parameter *tmp_s, var_list *the_var,
 }
 
 
-// 注册test 对象
-void text_login_official(var_list *the_var, GWARF_result (*paser)(func *, parameter *, var_list *, GWARF_result)){
+// // 注册test 对象
+// void text_login_official(var_list *the_var, GWARF_result (*paser)(func *, parameter *, var_list *, GWARF_result)){
+//     // 创建对象[空对象]
+//     puts("----set class----");
+//     GWARF_result class_value;
+//     class_object *class_tmp = malloc(sizeof(class_object));
+
+//     class_tmp->the_var = make_var_base(make_var());  // make class var list
+//     class_tmp->out_var = append_by_var_list(class_tmp->the_var, copy_var_list(the_var));  // make class var list with out var
+//     class_value.value.type = CLASS_value;
+//     class_value.value.value.class_value = class_tmp;
+
+//     assigment_func("text", class_value, the_var, 0);  // 注册class 的 位置
+//     puts("----stop set class----");
+
+//     // 注册函数
+//     // {{official_func_type, is_class}}
+//     int a[][2] = {{2,1}};
+//     // {login_name}
+//     char *name[] = {"__init__"};
+
+//     int lenth = sizeof(a)/sizeof(a[0]);
+//     for(int i = 0;i < lenth;i+=1){
+//         login_official_func(a[i][0], a[i][1], class_tmp->the_var, name[i], paser);
+//     }
+// }
+
+// // text 全局内置函数解析器
+// GWARF_result text_official_func(func *the_func, parameter *tmp_s, var_list *the_var, GWARF_result father){
+//     GWARF_result return_value;
+//     var_list *login_var;
+//     if(father.father->type == CLASS_value){  // is class so that can use "."
+//         login_var = father.father->value.class_value->the_var;
+//     }
+//     else if(father.father->type == OBJECT_value){
+//         login_var = father.father->value.object_value->the_var;
+//     }
+//     switch (the_func->official_func)
+//     {
+//     case __init__func:{  // printf something
+//         char *left = "C";  // get var name but not value
+//         GWARF_result right_result;
+//         right_result.value.type = NUMBER_value;
+//         right_result.value.value.double_value = 10.2;
+//         assigment_func(left, right_result, login_var, 0);
+
+//         var *tmp = find_var(login_var, 0, (the_statement->code).base_var.var_name);
+//         break;
+//     }
+//     default:
+//         break;
+//     }
+//     return_result: return return_value;
+// }
+
+void int_login_official(var_list *the_var, GWARF_result (*paser)(func *, parameter *, var_list *, GWARF_result, var_list *)){
     // 创建对象[空对象]
     puts("----set class----");
     GWARF_result class_value;
@@ -1945,14 +2067,12 @@ void text_login_official(var_list *the_var, GWARF_result (*paser)(func *, parame
     class_value.value.type = CLASS_value;
     class_value.value.value.class_value = class_tmp;
 
-    assigment_func("text", class_value, the_var, 0);  // 注册class 的 位置
+    assigment_func("int", class_value, the_var, 0);  // 注册class 的 位置
     puts("----stop set class----");
 
     // 注册函数
-    // {{official_func_type, is_class}}
-    int a[][2] = {{2,1}};
-    // {login_name}
-    char *name[] = {"__init__"};
+    int a[][2] = {{2,1}, {3,1}, {4,1}, {5,1}, {6,1}, {7,1}};
+    char *name[] = {"__init__", "__value__", "__add__", "__sub__", "__mul__","__div__"};
 
     int lenth = sizeof(a)/sizeof(a[0]);
     for(int i = 0;i < lenth;i+=1){
@@ -1961,29 +2081,241 @@ void text_login_official(var_list *the_var, GWARF_result (*paser)(func *, parame
 }
 
 // text 全局内置函数解析器
-GWARF_result text_official_func(func *the_func, parameter *tmp_s, var_list *the_var, GWARF_result father){
+GWARF_result int_official_func(func *the_func, parameter *tmp_s, var_list *the_var, GWARF_result father, var_list *out_var){  // out_var是外部环境
     GWARF_result return_value;
     var_list *login_var;
+    return_value.u = return_def;
     if(father.father->type == CLASS_value){  // is class so that can use "."
         login_var = father.father->value.class_value->the_var;
     }
     else if(father.father->type == OBJECT_value){
         login_var = father.father->value.object_value->the_var;
     }
+    else{
+        printf("NO login, father type = %d\n", father.father->type);
+    }
     switch (the_func->official_func)
     {
-    case __init__func:{  // printf something
-        char *left = "C";  // get var name but not value
-        GWARF_result right_result;
-        right_result.value.type = NUMBER_value;
-        right_result.value.value.double_value = 10.2;
-        assigment_func(left, right_result, login_var, 0);
-
-        var *tmp = find_var(login_var, 0, (the_statement->code).base_var.var_name);
-        break;
-    }
-    default:
-        break;
+        case __init__func:{  // printf something
+            GWARF_result tmp = traverse(tmp_s->u.value, out_var, false);  // 只有一个参数[要针对不同数据类型对此处作出处理]
+            assigment_func("value", tmp, login_var, 0);  // 注册到self
+            break;
+        }
+        case __value__func:{  // 若想实现运算必须要有这个方法
+            var *tmp = find_var(login_var, 0, "value");
+            return_value.value = tmp->value;  // 取得用于计算的数值
+            break;
+        }
+        case __add__func:{
+            GWARF_result reight_tmp, left_tmp, get;
+            GWARF_value base_the_var = traverse(tmp_s->u.value, out_var, false).value;  // 只有一个参数
+            var_list *call_var;
+            if(base_the_var.type == CLASS_value){  // is class so that can use "."
+                call_var = base_the_var.value.class_value->the_var;
+            }
+            else if(base_the_var.type == OBJECT_value){
+                call_var = base_the_var.value.object_value->the_var;
+            }
+            get.value = find_var(call_var, 0, "__value__")->value;
+            get.father = &base_the_var;  // 设置father
+            reight_tmp = call_back_core(get, the_var, NULL);
+            printf("reight_tmp.value.type = %d\n", reight_tmp.value.type);
+            left_tmp.value = find_var(login_var, 0, "value")->value;
+            return_value = add_func(left_tmp, reight_tmp, the_var);
+            break;
+        }
+        case __sub__func:{
+            GWARF_result reight_tmp, left_tmp, get;
+            GWARF_value base_the_var = traverse(tmp_s->u.value, out_var, false).value;  // 只有一个参数
+            var_list *call_var;
+            if(base_the_var.type == CLASS_value){  // is class so that can use "."
+                call_var = base_the_var.value.class_value->the_var;
+            }
+            else if(base_the_var.type == OBJECT_value){
+                call_var = base_the_var.value.object_value->the_var;
+            }
+            get.value = find_var(call_var, 0, "__value__")->value;
+            get.father = &base_the_var;  // 设置father
+            reight_tmp = call_back_core(get, the_var, NULL);
+            printf("reight_tmp.value.type = %d\n", reight_tmp.value.type);
+            left_tmp.value = find_var(login_var, 0, "value")->value;
+            return_value = sub_func(left_tmp, reight_tmp, the_var);
+            break;
+        }
+        case __mul__func:{
+            GWARF_result reight_tmp, left_tmp, get;
+            GWARF_value base_the_var = traverse(tmp_s->u.value, out_var, false).value;  // 只有一个参数
+            var_list *call_var;
+            if(base_the_var.type == CLASS_value){  // is class so that can use "."
+                call_var = base_the_var.value.class_value->the_var;
+            }
+            else if(base_the_var.type == OBJECT_value){
+                call_var = base_the_var.value.object_value->the_var;
+            }
+            get.value = find_var(call_var, 0, "__value__")->value;
+            get.father = &base_the_var;  // 设置father
+            reight_tmp = call_back_core(get, the_var, NULL);
+            printf("reight_tmp.value.type = %d\n", reight_tmp.value.type);
+            left_tmp.value = find_var(login_var, 0, "value")->value;
+            return_value = mul_func(left_tmp, reight_tmp, the_var);
+            break;
+        }
+        case __div__func:{
+            GWARF_result reight_tmp, left_tmp, get;
+            GWARF_value base_the_var = traverse(tmp_s->u.value, out_var, false).value;  // 只有一个参数
+            var_list *call_var;
+            if(base_the_var.type == CLASS_value){  // is class so that can use "."
+                call_var = base_the_var.value.class_value->the_var;
+            }
+            else if(base_the_var.type == OBJECT_value){
+                call_var = base_the_var.value.object_value->the_var;
+            }
+            get.value = find_var(call_var, 0, "__value__")->value;
+            get.father = &base_the_var;  // 设置father
+            reight_tmp = call_back_core(get, the_var, NULL);
+            printf("reight_tmp.value.type = %d\n", reight_tmp.value.type);
+            left_tmp.value = find_var(login_var, 0, "value")->value;
+            return_value = div_func(left_tmp, reight_tmp, the_var);
+            break;
+        }
+        default:
+            break;
     }
     return_result: return return_value;
-}
+}
+
+// GWARF_value base_the_var = traverse((the_statement->code).point.base_var, the_var, false).value;
+// if(base_the_var.type == CLASS_value){  // is class so that can use "."
+//     puts("func: point");
+//     return_value = traverse((the_statement->code).point.child_var, base_the_var.value.class_value->the_var, false);
+// }
+// else if(base_the_var.type == OBJECT_value){
+//     puts("func: point");
+//     return_value = traverse((the_statement->code).point.child_var, base_the_var.value.object_value->the_var, false);
+// }
+// return_value.father = malloc(sizeof(return_value.father));  // 记录father的值
+// *(return_value.father) = base_the_var;
+// puts("----stop point----");
+
+// GWARF_result call_back(statement *the_statement, var_list *the_var){  // the func for add and call from read_statement_list
+//     GWARF_result result, get = traverse(the_statement->code.call.func, the_var, false);
+//     var_list *old_var_list = the_var;
+//     if(get.value.type == FUNC_value){
+//         func *func_ = get.value.value.func_value;
+//         parameter *tmp_x = func_->parameter_list, *tmp_s = the_statement->code.call.parameter_list;
+//         the_var = func_->the_var;
+//         // tmp_x:形参,tmp_s:实参
+
+//         printf("----address = %d----\n", the_var);
+//         var *tmp = make_var();  // base_var
+//         the_var = append_var_list(tmp, the_var);
+//         printf("----new address = %d----\n", the_var);
+
+//         if(func_->type == customize){  // 用户定义的方法
+//             if(tmp_x == NULL){
+//                 puts("No tmp_x");
+//                 goto no_tmp_x;  // 无形参
+//             }
+//             GWARF_result father;
+//             if(func_->is_class  == 1){
+//                 father.value = *(get.father);
+//                 assigment_func(tmp_x->u.name, father, the_var, 0);
+//                 if (tmp_x->next == NULL){  // the last
+//                     goto no_tmp_x;
+//                 }
+//                 tmp_x = tmp_x->next;  // get the next to iter
+//             }
+//             while(1){
+//                 GWARF_result tmp = traverse(tmp_s->u.value, the_var, false);
+//                 assigment_func(tmp_x->u.name, tmp, the_var, 0);
+//                 if ((tmp_x->next == NULL)||(tmp_s->next == NULL)){  // the last
+//                     break;
+//                 }
+//                 tmp_x = tmp_x->next;  // get the next to iter
+//                 tmp_s = tmp_s->next;
+//             }
+//             no_tmp_x: 
+//             puts("----start func----");
+//             result = traverse(func_->done, the_var, false);  // 执行func_value->done
+//             if(result.u == code_return){
+//                 if(result.return_times <= 0){
+//                     result.u = return_def;
+//                 }
+//                 else{
+//                 result.return_times -= 1; 
+//                 }
+//             }
+//             puts("----stop start func----");
+//         }
+//         else{
+//             result = func_->paser(func_, tmp_s, the_var, get, old_var_list);
+//         }
+//         the_var = free_var_list(the_var);  // free the new var
+//     }
+//     else if(get.value.type == CLASS_value){  // 生成实例
+//         the_object *object_tmp = malloc(sizeof(the_object));  // 生成object的空间
+//         object_tmp->cls = get.value.value.class_value->the_var;
+//         object_tmp->the_var = append_by_var_list(make_var_base(make_var()), object_tmp->cls);
+//         GWARF_value tmp;
+//         tmp.type = OBJECT_value;
+//         tmp.value.object_value = object_tmp;
+
+//         // 执行__init__
+//         var *init_tmp = find_var(object_tmp->cls, 0, "__init__");
+//         if(init_tmp != NULL){  // 找到了__init__
+//             func *func_ = init_tmp->value.value.func_value;
+//             parameter *tmp_x = func_->parameter_list, *tmp_s = the_statement->code.call.parameter_list;
+//             the_var = func_->the_var;
+//             // tmp_x:形参,tmp_s:实参
+
+//             printf("----address = %d----\n", the_var);
+//             var *tmp = make_var();  // base_var
+//             the_var = append_var_list(tmp, the_var);
+//             printf("----new address = %d----\n", the_var);
+
+//             if(func_->type == customize){  // 用户定义的方法
+//                 if(tmp_x == NULL){
+//                     puts("No tmp_x");
+//                     goto no_tmp_x_init;  // 无形参
+//                 }
+//                 GWARF_result father;
+//                 father.value.type = OBJECT_value;
+//                 father.value.value.object_value = object_tmp;
+//                 if(func_->is_class  == 1){
+//                     assigment_func(tmp_x->u.name, father, the_var, 0);
+//                     if (tmp_x->next == NULL){  // the last
+//                         goto no_tmp_x_init;
+//                     }
+//                     tmp_x = tmp_x->next;  // get the next to iter
+//                 }
+//                 while(1){
+//                     GWARF_result tmp = traverse(tmp_s->u.value, the_var, false);
+//                     assigment_func(tmp_x->u.name, tmp, the_var, 0);
+//                     if ((tmp_x->next == NULL)||(tmp_s->next == NULL)){  // the last
+//                         break;
+//                     }
+//                     tmp_x = tmp_x->next;  // get the next to iter
+//                     tmp_s = tmp_s->next;
+//                 }
+//                 no_tmp_x_init: 
+//                 puts("----start func----");
+//                 traverse(func_->done, the_var, false);  // 执行func_value->done
+//                 puts("----stop start func----");
+//             }
+//             else{
+//                 GWARF_result tmp_get;
+//                 GWARF_value father;
+//                 father.type = OBJECT_value;
+//                 father.value.object_value = object_tmp;
+//                 tmp_get.father = &father;
+//                 result = func_->paser(func_, tmp_s, the_var, tmp_get, old_var_list);
+//             }
+//             the_var = free_var_list(the_var);  // free the new var
+//         }
+//         // 记录返回值
+//         result.u = return_def;
+//         result.value = tmp;
+
+//     }
+//     return result;
+// }