Browse Source

object赋值特殊处理

SongZihuan 5 years ago
parent
commit
30c7640189
6 changed files with 168 additions and 66 deletions
  1. BIN
      gwarf
  2. 121 29
      inter/cfunc.c
  3. 40 32
      inter/interpreter.c
  4. 5 3
      inter/interpreter.h
  5. 1 1
      paser/gwarf_yacc.y
  6. 1 1
      paser/y.tab.c

BIN
gwarf


+ 121 - 29
inter/cfunc.c

@@ -132,7 +132,7 @@ void login_official_func(int type, int is_class, var_list *the_var, char *name,
 
 
     func_value.value.type = FUNC_value;
     func_value.value.type = FUNC_value;
     func_value.value.value.func_value = func_tmp;
     func_value.value.value.func_value = func_tmp;
-    assigment_func(name, func_value, the_var, 0);  // 注册函数到指定的位置
+    assignment_func(name, func_value, the_var, 0);  // 注册函数到指定的位置
 }
 }
 
 
 void login_official(var_list *the_var, 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 *)){
@@ -225,7 +225,7 @@ class_object *object_login_official(var_list *the_var, GWARF_result (*paser)(fun
     class_value.value.type = CLASS_value;
     class_value.value.type = CLASS_value;
     class_value.value.value.class_value = class_tmp;
     class_value.value.value.class_value = class_tmp;
 
 
-    assigment_func("object", class_value, the_var, 0);  // 注册class 的 位置
+    assignment_func("object", class_value, the_var, 0);  // 注册class 的 位置
     puts("----stop set class----");
     puts("----stop set class----");
 
 
 
 
@@ -258,6 +258,9 @@ GWARF_result object_official_func(func *the_func, parameter *tmp_s, var_list *th
             return_value.value = to_str(*(father.father), out_var);
             return_value.value = to_str(*(father.father), out_var);
             break;
             break;
         }
         }
+        case __assignment__func:
+            return_value.value = *(father.father);  // 返回原值
+            break;
     }
     }
     return_result: return return_value;
     return_result: return return_value;
 }
 }
@@ -282,7 +285,7 @@ class_object *BaseException_login_official(var_list *the_var, GWARF_result (*pas
     class_value.value.type = CLASS_value;
     class_value.value.type = CLASS_value;
     class_value.value.value.class_value = class_tmp;
     class_value.value.value.class_value = class_tmp;
 
 
-    assigment_func("BaseException", class_value, the_var, 0);  // 注册class 的 位置
+    assignment_func("BaseException", class_value, the_var, 0);  // 注册class 的 位置
     puts("----stop set class----");
     puts("----stop set class----");
 
 
     // 注册函数
     // 注册函数
@@ -323,7 +326,7 @@ GWARF_result BaseException_official_func(func *the_func, parameter *tmp_s, var_l
                 goto return_result;
                 goto return_result;
             }
             }
             tmp.value = to_str(tmp_result.value, out_var);  // 只有一个参数[要针对不同数据类型对此处作出处理]
             tmp.value = to_str(tmp_result.value, out_var);  // 只有一个参数[要针对不同数据类型对此处作出处理]
-            assigment_func("ErrorInfo", tmp, login_var, 0);  // 注册到self -> ErrorInfo
+            assignment_func("ErrorInfo", tmp, login_var, 0);  // 注册到self -> ErrorInfo
             return_value.u = statement_end;  // __init__没有return
             return_value.u = statement_end;  // __init__没有return
             break;
             break;
         }
         }
@@ -342,7 +345,7 @@ class_object *Exception_login_official(var_list *the_var, var_list *father_var_l
     class_value.value.type = CLASS_value;
     class_value.value.type = CLASS_value;
     class_value.value.value.class_value = class_tmp;
     class_value.value.value.class_value = class_tmp;
 
 
-    assigment_func("Exception", class_value, the_var, 0);  // 注册class 的 位置
+    assignment_func("Exception", class_value, the_var, 0);  // 注册class 的 位置
     puts("----stop set class----");
     puts("----stop set class----");
     return class_tmp;
     return class_tmp;
 }
 }
@@ -356,7 +359,7 @@ class_object *NameException_login_official(var_list *the_var, var_list *father_v
     class_value.value.type = CLASS_value;
     class_value.value.type = CLASS_value;
     class_value.value.value.class_value = class_tmp;
     class_value.value.value.class_value = class_tmp;
 
 
-    assigment_func("NameException", class_value, the_var, 0);  // 注册class 的 位置
+    assignment_func("NameException", class_value, the_var, 0);  // 注册class 的 位置
     puts("----stop set class----");
     puts("----stop set class----");
     return class_tmp;
     return class_tmp;
 }
 }
@@ -370,7 +373,7 @@ class_object *IterException_login_official(var_list *the_var, var_list *father_v
     class_value.value.type = CLASS_value;
     class_value.value.type = CLASS_value;
     class_value.value.value.class_value = class_tmp;
     class_value.value.value.class_value = class_tmp;
 
 
-    assigment_func("IterException", class_value, the_var, 0);  // 注册class 的 位置
+    assignment_func("IterException", class_value, the_var, 0);  // 注册class 的 位置
     puts("----stop set class----");
     puts("----stop set class----");
     return class_tmp;
     return class_tmp;
 }
 }
@@ -384,7 +387,7 @@ class_object *gobject_login_official(var_list *the_var, GWARF_result (*paser)(fu
     class_value.value.type = CLASS_value;
     class_value.value.type = CLASS_value;
     class_value.value.value.class_value = class_tmp;
     class_value.value.value.class_value = class_tmp;
 
 
-    assigment_func("gobject", class_value, the_var, 0);  // 注册class 的 位置
+    assignment_func("gobject", class_value, the_var, 0);  // 注册class 的 位置
     puts("----stop set class----");
     puts("----stop set class----");
 
 
     // 注册函数
     // 注册函数
@@ -420,7 +423,7 @@ GWARF_result gobject_official_func(func *the_func, parameter *tmp_s, var_list *t
             GWARF_result tmp;
             GWARF_result tmp;
             tmp.value.type = INT_value;
             tmp.value.type = INT_value;
             tmp.value.value.int_value = 0;
             tmp.value.value.int_value = 0;
-            assigment_func("value", tmp, login_var, 0);  // 注册到self
+            assignment_func("value", tmp, login_var, 0);  // 注册到self
             return_value.u = statement_end;  // __init__没有return
             return_value.u = statement_end;  // __init__没有return
             break;
             break;
         }
         }
@@ -1144,12 +1147,12 @@ class_object *int_login_official(var_list *the_var, GWARF_result (*paser)(func *
     class_value.value.type = CLASS_value;
     class_value.value.type = CLASS_value;
     class_value.value.value.class_value = class_tmp;
     class_value.value.value.class_value = class_tmp;
 
 
-    assigment_func("int", class_value, the_var, 0);  // 注册class 的 位置
+    assignment_func("int", class_value, the_var, 0);  // 注册class 的 位置
     puts("----stop set class----");
     puts("----stop set class----");
 
 
     // 注册函数
     // 注册函数
-    int a[][2] = {{2,1}};
-    char *name[] = {"__init__"};
+    int a[][2] = {{2,1}, {__assignment__func, 1}};
+    char *name[] = {"__init__", "__assignment__"};
 
 
     int lenth = sizeof(a)/sizeof(a[0]);
     int lenth = sizeof(a)/sizeof(a[0]);
     for(int i = 0;i < lenth;i+=1){
     for(int i = 0;i < lenth;i+=1){
@@ -1186,10 +1189,37 @@ GWARF_result int_official_func(func *the_func, parameter *tmp_s, var_list *the_v
             }
             }
             GWARF_value base_the_var = tmp.value;  // 只有一个参数
             GWARF_value base_the_var = tmp.value;  // 只有一个参数
             tmp.value = to_int(tmp_result.value, out_var);  // 只有一个参数[要针对不同数据类型对此处作出处理]
             tmp.value = to_int(tmp_result.value, out_var);  // 只有一个参数[要针对不同数据类型对此处作出处理]
-            assigment_func("value", tmp, login_var, 0);  // 注册到self
+            assignment_func("value", tmp, login_var, 0);  // 注册到self
             return_value.u = statement_end;  // __init__没有return
             return_value.u = statement_end;  // __init__没有return
             break;
             break;
         }
         }
+        case __assignment__func:{
+            // 不使用to_object,要保证赋值前后类型一致[to_object会受class重写的影响]
+            if(father.father->type == OBJECT_value){
+                the_object *object_tmp = malloc(sizeof(the_object));  // 生成object的空间
+                object_tmp->cls = father.father->value.object_value->cls;
+                object_tmp->the_var = append_by_var_list(make_var_base(make_var()), object_tmp->cls);  // 生成实例
+
+                // 执行__init__
+                GWARF_result self_value;
+                var *tmp = find_var(login_var, 0, "value");
+                if(tmp != NULL){
+                    self_value.value = to_int(tmp->value, out_var);
+                }
+                else{
+                    self_value.value.type = INT_value;
+                    self_value.value.value.int_value = 0;
+                }
+                assignment_func("value", self_value, object_tmp->the_var, 0);  // 注册到新的object
+
+                return_value.value.type = OBJECT_value;
+                return_value.value.value.object_value = object_tmp;
+            }
+            else{
+                return_value.value = *(father.father);  // 返回原值
+            }
+            break;
+        }
         default:
         default:
             break;
             break;
     }
     }
@@ -1235,12 +1265,12 @@ class_object *double_login_official(var_list *the_var, GWARF_result (*paser)(fun
     class_value.value.type = CLASS_value;
     class_value.value.type = CLASS_value;
     class_value.value.value.class_value = class_tmp;
     class_value.value.value.class_value = class_tmp;
 
 
-    assigment_func("double", class_value, the_var, 0);  // 注册class 的 位置
+    assignment_func("double", class_value, the_var, 0);  // 注册class 的 位置
     puts("----stop set class----");
     puts("----stop set class----");
 
 
     // 注册函数
     // 注册函数
-    int a[][2] = {{2,1}};
-    char *name[] = {"__init__"};
+    int a[][2] = {{2,1}, {__assignment__func, 1}};
+    char *name[] = {"__init__", "__assignment__"};
 
 
     int lenth = sizeof(a)/sizeof(a[0]);
     int lenth = sizeof(a)/sizeof(a[0]);
     for(int i = 0;i < lenth;i+=1){
     for(int i = 0;i < lenth;i+=1){
@@ -1276,10 +1306,37 @@ GWARF_result double_official_func(func *the_func, parameter *tmp_s, var_list *th
                 goto return_result;
                 goto return_result;
             }
             }
             tmp.value = to_double(tmp_result.value, out_var);  // 只有一个参数[要针对不同数据类型对此处作出处理]
             tmp.value = to_double(tmp_result.value, out_var);  // 只有一个参数[要针对不同数据类型对此处作出处理]
-            assigment_func("value", tmp, login_var, 0);  // 注册到self
+            assignment_func("value", tmp, login_var, 0);  // 注册到self
             return_value.u = statement_end;  // __init__没有return
             return_value.u = statement_end;  // __init__没有return
             break;
             break;
         }
         }
+        case __assignment__func:{
+            // 不使用to_object,要保证赋值前后类型一致[to_object会受class重写的影响]
+            if(father.father->type == OBJECT_value){
+                the_object *object_tmp = malloc(sizeof(the_object));  // 生成object的空间
+                object_tmp->cls = father.father->value.object_value->cls;
+                object_tmp->the_var = append_by_var_list(make_var_base(make_var()), object_tmp->cls);  // 生成实例
+
+                // 执行__init__
+                GWARF_result self_value;
+                var *tmp = find_var(login_var, 0, "value");
+                if(tmp != NULL){
+                    self_value.value = to_int(tmp->value, out_var);
+                }
+                else{
+                    self_value.value.type = NUMBER_value;
+                    self_value.value.value.double_value = 0;
+                }
+                assignment_func("value", self_value, object_tmp->the_var, 0);  // 注册到新的object
+
+                return_value.value.type = OBJECT_value;
+                return_value.value.value.object_value = object_tmp;
+            }
+            else{
+                return_value.value = *(father.father);  // 返回原值
+            }
+            break;
+        }
         default:
         default:
             break;
             break;
     }
     }
@@ -1324,7 +1381,7 @@ class_object *str_login_official(var_list *the_var, GWARF_result (*paser)(func *
     class_value.value.type = CLASS_value;
     class_value.value.type = CLASS_value;
     class_value.value.value.class_value = class_tmp;
     class_value.value.value.class_value = class_tmp;
 
 
-    assigment_func("str", class_value, the_var, 0);  // 注册class 的 位置
+    assignment_func("str", class_value, the_var, 0);  // 注册class 的 位置
     puts("----stop set class----");
     puts("----stop set class----");
 
 
     // 注册函数
     // 注册函数
@@ -1365,7 +1422,7 @@ GWARF_result str_official_func(func *the_func, parameter *tmp_s, var_list *the_v
                 goto return_result;
                 goto return_result;
             }
             }
             tmp.value = to_str(tmp_result.value, out_var);  // 只有一个参数[要针对不同数据类型对此处作出处理]
             tmp.value = to_str(tmp_result.value, out_var);  // 只有一个参数[要针对不同数据类型对此处作出处理]
-            assigment_func("value", tmp, login_var, 0);  // 注册到self
+            assignment_func("value", tmp, login_var, 0);  // 注册到self
             return_value.u = statement_end;  // __init__没有return
             return_value.u = statement_end;  // __init__没有return
             break;
             break;
         }
         }
@@ -1435,12 +1492,12 @@ class_object *bool_login_official(var_list *the_var, GWARF_result (*paser)(func
     class_value.value.type = CLASS_value;
     class_value.value.type = CLASS_value;
     class_value.value.value.class_value = class_tmp;
     class_value.value.value.class_value = class_tmp;
 
 
-    assigment_func("bool", class_value, the_var, 0);  // 注册class 的 位置
+    assignment_func("bool", class_value, the_var, 0);  // 注册class 的 位置
     puts("----stop set class----");
     puts("----stop set class----");
 
 
     // 注册函数
     // 注册函数
-    int a[][2] = {{2,1}};
-    char *name[] = {"__init__"};
+    int a[][2] = {{2,1}, {__assignment__func, 1}};
+    char *name[] = {"__init__", "__assignment__"};
 
 
     int lenth = sizeof(a)/sizeof(a[0]);
     int lenth = sizeof(a)/sizeof(a[0]);
     for(int i = 0;i < lenth;i+=1){
     for(int i = 0;i < lenth;i+=1){
@@ -1476,10 +1533,37 @@ GWARF_result bool_official_func(func *the_func, parameter *tmp_s, var_list *the_
                 goto return_result;
                 goto return_result;
             }
             }
             tmp.value = to_bool_(tmp_result.value, out_var);  // 只有一个参数[要针对不同数据类型对此处作出处理]
             tmp.value = to_bool_(tmp_result.value, out_var);  // 只有一个参数[要针对不同数据类型对此处作出处理]
-            assigment_func("value", tmp, login_var, 0);  // 注册到self
+            assignment_func("value", tmp, login_var, 0);  // 注册到self
             return_value.u = statement_end;  // __init__没有return
             return_value.u = statement_end;  // __init__没有return
             break;
             break;
         }
         }
+        case __assignment__func:{
+            // 不使用to_object,要保证赋值前后类型一致[to_object会受class重写的影响]
+            if(father.father->type == OBJECT_value){
+                the_object *object_tmp = malloc(sizeof(the_object));  // 生成object的空间
+                object_tmp->cls = father.father->value.object_value->cls;
+                object_tmp->the_var = append_by_var_list(make_var_base(make_var()), object_tmp->cls);  // 生成实例
+
+                // 执行__init__
+                GWARF_result self_value;
+                var *tmp = find_var(login_var, 0, "value");
+                if(tmp != NULL){
+                    self_value.value = to_bool_(tmp->value, out_var);
+                }
+                else{
+                    self_value.value.type = BOOL_value;
+                    self_value.value.value.double_value = false;
+                }
+                assignment_func("value", self_value, object_tmp->the_var, 0);  // 注册到新的object
+
+                return_value.value.type = OBJECT_value;
+                return_value.value.value.object_value = object_tmp;
+            }
+            else{
+                return_value.value = *(father.father);  // 返回原值
+            }
+            break;
+        }
         default:
         default:
             break;
             break;
     }
     }
@@ -1514,7 +1598,7 @@ class_object *list_login_official(var_list *the_var, GWARF_result (*paser)(func
     class_value.value.type = CLASS_value;
     class_value.value.type = CLASS_value;
     class_value.value.value.class_value = class_tmp;
     class_value.value.value.class_value = class_tmp;
 
 
-    assigment_func("list", class_value, the_var, 0);  // 注册class 的 位置
+    assignment_func("list", class_value, the_var, 0);  // 注册class 的 位置
     puts("----stop set class----");
     puts("----stop set class----");
 
 
     // 注册函数
     // 注册函数
@@ -1553,7 +1637,7 @@ GWARF_result list_official_func(func *the_func, parameter *tmp_s, var_list *the_
                 list_tmp.value.list_value->index = 0;
                 list_tmp.value.list_value->index = 0;
                 list_tmp.value.list_value->list_value = malloc((size_t)0);
                 list_tmp.value.list_value->list_value = malloc((size_t)0);
                 tmp_result.value = list_tmp;
                 tmp_result.value = list_tmp;
-                assigment_func("value", tmp_result, login_var, 0);  // 注册到self
+                assignment_func("value", tmp_result, login_var, 0);  // 注册到self
                 return_value.u = statement_end;  // __init__没有return
                 return_value.u = statement_end;  // __init__没有return
             }
             }
             else{
             else{
@@ -1567,13 +1651,13 @@ GWARF_result list_official_func(func *the_func, parameter *tmp_s, var_list *the_
                     goto return_result;
                     goto return_result;
                 }
                 }
                 tmp.value = to_list(tmp_result.value, out_var);  // 只有一个参数[要针对不同数据类型对此处作出处理]
                 tmp.value = to_list(tmp_result.value, out_var);  // 只有一个参数[要针对不同数据类型对此处作出处理]
-                assigment_func("value", tmp, login_var, 0);  // 注册到self
+                assignment_func("value", tmp, login_var, 0);  // 注册到self
                 return_value.u = statement_end;  // __init__没有return
                 return_value.u = statement_end;  // __init__没有return
             }
             }
             GWARF_result iter_value;
             GWARF_result iter_value;
             iter_value.value.type = INT_value;
             iter_value.value.type = INT_value;
             iter_value.value.value.int_value = 0;
             iter_value.value.value.int_value = 0;
-            assigment_func("iter_value", iter_value, login_var, 0);  // 注册到self
+            assignment_func("iter_value", iter_value, login_var, 0);  // 注册到self
             break;
             break;
         }
         }
         case __len__func:{  // return index
         case __len__func:{  // return index
@@ -1586,7 +1670,7 @@ GWARF_result list_official_func(func *the_func, parameter *tmp_s, var_list *the_
             GWARF_result iter_value;
             GWARF_result iter_value;
             iter_value.value.type = INT_value;
             iter_value.value.type = INT_value;
             iter_value.value.value.int_value = 0;
             iter_value.value.value.int_value = 0;
-            assigment_func("iter_value", iter_value, login_var, 0);  // 注册到self
+            assignment_func("iter_value", iter_value, login_var, 0);  // 注册到self
 
 
             return_value.value = *(father.father);
             return_value.value = *(father.father);
             break;
             break;
@@ -1612,7 +1696,7 @@ GWARF_result list_official_func(func *the_func, parameter *tmp_s, var_list *the_
                 GWARF_result iter_value;
                 GWARF_result iter_value;
                 iter_value.value.type = INT_value;
                 iter_value.value.type = INT_value;
                 iter_value.value.value.int_value = iter_index + 1;
                 iter_value.value.value.int_value = iter_index + 1;
-                assigment_func("iter_value", iter_value, login_var, 0);  // 注册到self
+                assignment_func("iter_value", iter_value, login_var, 0);  // 注册到self
             }
             }
 
 
             break;
             break;
@@ -1778,6 +1862,14 @@ GWARF_value parameter_to_list(parameter *tmp_s, var_list *the_var){  // 把param
     return return_list;
     return return_list;
 }
 }
 
 
+GWARF_result get__assignment__(GWARF_value *base_the_var, var_list *the_var){  // 获取__assignment__
+    GWARF_result tmp = run_func_core(base_the_var, the_var, "__assignment__", true);
+    if(is_error(&tmp) || is_space(&tmp)){
+        tmp.u = statement_end;
+        tmp.value = *base_the_var;  // 返回原值
+    }
+    return tmp;
+}
 
 
 GWARF_result get__next__(GWARF_value *base_the_var, var_list *the_var){  // 获取__next__
 GWARF_result get__next__(GWARF_value *base_the_var, var_list *the_var){  // 获取__next__
     GWARF_result tmp = run_func_core(base_the_var, the_var, "__next__", true);
     GWARF_result tmp = run_func_core(base_the_var, the_var, "__next__", true);

+ 40 - 32
inter/interpreter.c

@@ -343,7 +343,7 @@ GWARF_result read_statement(statement *the_statement, var_list *the_var, var_lis
             func_value.value.type = FUNC_value;
             func_value.value.type = FUNC_value;
             func_value.value.value.func_value = func_tmp;
             func_value.value.value.func_value = func_tmp;
 
 
-            assigment_statement(the_statement->code.def.var, the_var, login_var, func_value);  // 注册函数到指定的位置
+            assignment_statement(the_statement->code.def.var, the_var, login_var, func_value);  // 注册函数到指定的位置
             // 无返回值
             // 无返回值
             break;
             break;
         }
         }
@@ -406,7 +406,7 @@ GWARF_result read_statement(statement *the_statement, var_list *the_var, var_lis
                 tmp = tmp->next;
                 tmp = tmp->next;
             }
             }
 
 
-            assigment_statement(the_statement->code.set_class.var, the_var,login_var, class_value);  // 注册class 的 位置
+            assignment_statement(the_statement->code.set_class.var, the_var,login_var, class_value);  // 注册class 的 位置
             puts("----stop set class----");
             puts("----stop set class----");
             // 无返回值
             // 无返回值
             break;
             break;
@@ -781,7 +781,7 @@ GWARF_result import_func(statement *the_statement, var_list *the_var){
     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_tmp->out_var = append_by_var_list(class_tmp->the_var, copy_var_list(the_var));  // make class var list with out var
 
 
     import_result.value.value.class_value = class_tmp;
     import_result.value.value.class_value = class_tmp;
-    assigment_statement(the_statement->code.import_class.var, the_var, the_var, import_result);
+    assignment_statement(the_statement->code.import_class.var, the_var, the_var, import_result);
 
 
     return_value.u = statement_end;
     return_value.u = statement_end;
     return_value.value.type = NULL_value;
     return_value.value.type = NULL_value;
@@ -1123,7 +1123,7 @@ GWARF_result try_func(statement *the_statement, var_list *the_var){  // read the
     // restart操作[和continue效果相同]
     // restart操作[和continue效果相同]
 
 
     if(is_error(&value)){  // 遇到错误->执行except语句[不需要再检查break...]
     if(is_error(&value)){  // 遇到错误->执行except语句[不需要再检查break...]
-        assigment_statement(the_statement->code.try_code.var, the_var, the_var, value);
+        assignment_statement(the_statement->code.try_code.var, the_var, the_var, value);
         puts("----except----");
         puts("----except----");
         value = traverse(the_statement->code.try_code.except, the_var, false);
         value = traverse(the_statement->code.try_code.except, the_var, false);
         puts("----stop except----");
         puts("----stop except----");
@@ -1264,7 +1264,7 @@ GWARF_result forin_func(statement *the_statement, var_list *the_var){  // read t
             break;  // goto return_value;
             break;  // goto return_value;
         }
         }
         else{
         else{
-            assigment_statement(the_statement->code.for_in_cycle.var, the_var, the_var,tmp_next);  // 赋值
+            assignment_statement(the_statement->code.for_in_cycle.var, the_var, the_var,tmp_next);  // 赋值
         }
         }
         restart_again: 
         restart_again: 
         puts("----for in----");
         puts("----for in----");
@@ -1417,7 +1417,7 @@ GWARF_result while_func(statement *the_statement, var_list *the_var){  // read t
 GWARF_result operation_func(statement *the_statement, var_list *the_var, var_list *login_var){  // read the statement list with case to run by func
 GWARF_result operation_func(statement *the_statement, var_list *the_var, var_list *login_var){  // read the statement list with case to run by func
     GWARF_result value, left_result, right_result;
     GWARF_result value, left_result, right_result;
     int func_type = the_statement->code.operation.type;
     int func_type = the_statement->code.operation.type;
-    if(func_type != ASSIGMENT_func && func_type != AND_func && func_type != OR_func)
+    if(func_type != ASSIGnMENT_func && func_type != AND_func && func_type != OR_func)
     {
     {
         left_result = traverse(the_statement->code.operation.left_exp, the_var, false);  // NEGATIVE_func等的left为NULL相当与不执行
         left_result = traverse(the_statement->code.operation.left_exp, the_var, false);  // NEGATIVE_func等的left为NULL相当与不执行
         if(is_error(&left_result)){
         if(is_error(&left_result)){
@@ -1451,57 +1451,57 @@ GWARF_result operation_func(statement *the_statement, var_list *the_var, var_lis
             value = div_func(left_result, right_result, the_var);
             value = div_func(left_result, right_result, the_var);
             break;
             break;
         case AADD_func:
         case AADD_func:
-            value = assigment_statement(the_statement->code.operation.left_exp, the_var, login_var, add_func(left_result, right_result, the_var));
+            value = assignment_statement(the_statement->code.operation.left_exp, the_var, login_var, add_func(left_result, right_result, the_var));
             break;
             break;
         case ASUB_func:
         case ASUB_func:
-            value = assigment_statement(the_statement->code.operation.left_exp, the_var, login_var, sub_func(left_result, right_result, the_var));
+            value = assignment_statement(the_statement->code.operation.left_exp, the_var, login_var, sub_func(left_result, right_result, the_var));
             break;
             break;
         case AMUL_func:
         case AMUL_func:
-            value = assigment_statement(the_statement->code.operation.left_exp, the_var, login_var, mul_func(left_result, right_result, the_var));
+            value = assignment_statement(the_statement->code.operation.left_exp, the_var, login_var, mul_func(left_result, right_result, the_var));
             break;
             break;
         case ADIV_func:
         case ADIV_func:
-            value = assigment_statement(the_statement->code.operation.left_exp, the_var, login_var, div_func(left_result, right_result, the_var));
+            value = assignment_statement(the_statement->code.operation.left_exp, the_var, login_var, div_func(left_result, right_result, the_var));
             break;
             break;
         case AMOD_func:
         case AMOD_func:
-            value = assigment_statement(the_statement->code.operation.left_exp, the_var, login_var, mod_func(left_result, right_result, the_var));
+            value = assignment_statement(the_statement->code.operation.left_exp, the_var, login_var, mod_func(left_result, right_result, the_var));
             break;
             break;
         case AINTDIV_func:
         case AINTDIV_func:
-            value = assigment_statement(the_statement->code.operation.left_exp, the_var, login_var, int_div_func(left_result, right_result, the_var));
+            value = assignment_statement(the_statement->code.operation.left_exp, the_var, login_var, int_div_func(left_result, right_result, the_var));
             break;
             break;
         case APOW_func:
         case APOW_func:
-            value = assigment_statement(the_statement->code.operation.left_exp, the_var, login_var, pow_func(left_result, right_result, the_var));
+            value = assignment_statement(the_statement->code.operation.left_exp, the_var, login_var, pow_func(left_result, right_result, the_var));
             break;
             break;
         case LADD_func:  // a++
         case LADD_func:  // a++
             right_result.u = statement_end;
             right_result.u = statement_end;
             right_result.value.type = INT_value;
             right_result.value.type = INT_value;
             right_result.value.value.int_value = 1;
             right_result.value.value.int_value = 1;
-            assigment_statement(the_statement->code.operation.left_exp, the_var, login_var, add_func(left_result, right_result, the_var));
+            assignment_statement(the_statement->code.operation.left_exp, the_var, login_var, add_func(left_result, right_result, the_var));
             value = left_result;  // 先返回值,后自增
             value = left_result;  // 先返回值,后自增
             break;
             break;
         case FADD_func:  // ++a
         case FADD_func:  // ++a
             left_result.u = statement_end;
             left_result.u = statement_end;
             left_result.value.type = INT_value;
             left_result.value.type = INT_value;
             left_result.value.value.int_value = 1;
             left_result.value.value.int_value = 1;
-            value = assigment_statement(the_statement->code.operation.right_exp, the_var, login_var, add_func(left_result, right_result, the_var));  // 先自增,后返回值
+            value = assignment_statement(the_statement->code.operation.right_exp, the_var, login_var, add_func(left_result, right_result, the_var));  // 先自增,后返回值
             break;
             break;
         case LSUB_func:  // a--
         case LSUB_func:  // a--
             right_result.u = statement_end;
             right_result.u = statement_end;
             right_result.value.type = INT_value;
             right_result.value.type = INT_value;
             right_result.value.value.int_value = 1;
             right_result.value.value.int_value = 1;
-            assigment_statement(the_statement->code.operation.left_exp, the_var, login_var, sub_func(left_result, right_result, the_var));
+            assignment_statement(the_statement->code.operation.left_exp, the_var, login_var, sub_func(left_result, right_result, the_var));
             value = left_result;  // 先返回值,后自增
             value = left_result;  // 先返回值,后自增
             break;
             break;
         case FSUB_func:  // --a
         case FSUB_func:  // --a
             left_result.u = statement_end;
             left_result.u = statement_end;
             left_result.value.type = INT_value;
             left_result.value.type = INT_value;
             left_result.value.value.int_value = 1;
             left_result.value.value.int_value = 1;
-            value = assigment_statement(the_statement->code.operation.right_exp, the_var, login_var, sub_func(right_result, left_result, the_var));  // 先自增,后返回值
+            value = assignment_statement(the_statement->code.operation.right_exp, the_var, login_var, sub_func(right_result, left_result, the_var));  // 先自增,后返回值
             break;
             break;
         case NEGATIVE_func:
         case NEGATIVE_func:
             value = negative_func(right_result, the_var);
             value = negative_func(right_result, the_var);
             break;
             break;
-        case ASSIGMENT_func:{  // because the var char, we should ues a {} to make a block[name space] for the tmp var;
-            value = assigment_statement(the_statement->code.operation.left_exp, the_var, login_var, right_result);
+        case ASSIGnMENT_func:{  // because the var char, we should ues a {} to make a block[name space] for the tmp var;
+            value = assignment_statement(the_statement->code.operation.left_exp, the_var, login_var, right_result);
             break;
             break;
         }
         }
         case EQUAL_func:
         case EQUAL_func:
@@ -1572,12 +1572,20 @@ GWARF_result operation_func(statement *the_statement, var_list *the_var, var_lis
     return value;
     return value;
 }
 }
 
 
-GWARF_result assigment_statement(statement *the_statement, var_list *the_var, var_list *login_var, GWARF_result right_result){
+GWARF_result assignment_statement(statement *the_statement, var_list *the_var, var_list *login_var, GWARF_result right_result){
     GWARF_result value;
     GWARF_result value;
     value.u = statement_end;
     value.u = statement_end;
     value.value.type = NULL_value;
     value.value.type = NULL_value;
     value.value.value.int_value = 0;
     value.value.value.int_value = 0;
-
+    if(right_result.value.type == OBJECT_value || right_result.value.type == CLASS_value){
+        right_result = get__assignment__(&(right_result.value), the_var);
+        if(is_error(&right_result)){  // Name Error错误
+            return right_result;
+        }
+        else if(is_space(&right_result)){
+            return right_result;
+        }
+    }
 
 
     if(the_statement->type == base_var){  // 通过base_var赋值
     if(the_statement->type == base_var){  // 通过base_var赋值
         char *left = the_statement->code.base_var.var_name;  // get var name but not value
         char *left = the_statement->code.base_var.var_name;  // get var name but not value
@@ -1606,7 +1614,7 @@ GWARF_result assigment_statement(statement *the_statement, var_list *the_var, va
             }
             }
         }
         }
 
 
-        value = assigment_func(left, right_result, login_var, from);
+        value = assignment_func(left, right_result, login_var, from);
     }
     }
     else if(the_statement->type == point){  // 通过point赋值
     else if(the_statement->type == point){  // 通过point赋值
         GWARF_result tmp_result = traverse(the_statement->code.point.base_var, the_var, false);  // 不用取value
         GWARF_result tmp_result = traverse(the_statement->code.point.base_var, the_var, false);  // 不用取value
@@ -1644,7 +1652,7 @@ GWARF_result assigment_statement(statement *the_statement, var_list *the_var, va
                     from = 0;
                     from = 0;
                 }
                 }
             }
             }
-            value = assigment_func(left, right_result, base_the_var.value.object_value->the_var, from);
+            value = assignment_func(left, right_result, base_the_var.value.object_value->the_var, from);
         }
         }
         else{
         else{
             goto the_else;
             goto the_else;
@@ -1689,7 +1697,7 @@ GWARF_result assigment_statement(statement *the_statement, var_list *the_var, va
         }
         }
     }
     }
     else{ 
     else{ 
-        the_else: puts("Bad Assigment");
+        the_else: puts("Bad Assignment");
     }
     }
     return value;
     return value;
 }
 }
@@ -1729,7 +1737,7 @@ GWARF_result call_back_core(GWARF_result get, var_list *the_var, parameter *tmp_
             GWARF_result father;
             GWARF_result father;
             if(func_->is_class  == 1){
             if(func_->is_class  == 1){
                 father.value = *(get.father);
                 father.value = *(get.father);
-                assigment_func(tmp_x->u.name, father, the_var, 0);
+                assignment_func(tmp_x->u.name, father, the_var, 0);
                 if (tmp_x->next == NULL){  // the last
                 if (tmp_x->next == NULL){  // the last
                     goto no_tmp_x;
                     goto no_tmp_x;
                 }
                 }
@@ -1746,7 +1754,7 @@ GWARF_result call_back_core(GWARF_result get, var_list *the_var, parameter *tmp_
                     the_var = free_var_list(the_var);  // free the new var
                     the_var = free_var_list(the_var);  // free the new var
                     return tmp;
                     return tmp;
                 }
                 }
-                assigment_func(tmp_x->u.name, tmp, the_var, 0);
+                assignment_func(tmp_x->u.name, tmp, the_var, 0);
                 if ((tmp_x->next == NULL)||(tmp_s->next == NULL)){  // the last
                 if ((tmp_x->next == NULL)||(tmp_s->next == NULL)){  // the last
                     break;
                     break;
                 }
                 }
@@ -1802,7 +1810,7 @@ GWARF_result call_back_core(GWARF_result get, var_list *the_var, parameter *tmp_
                 father.value.type = OBJECT_value;
                 father.value.type = OBJECT_value;
                 father.value.value.object_value = object_tmp;
                 father.value.value.object_value = object_tmp;
                 if(func_->is_class  == 1){
                 if(func_->is_class  == 1){
-                    assigment_func(tmp_x->u.name, father, the_var, 0);
+                    assignment_func(tmp_x->u.name, father, the_var, 0);
                     if (tmp_x->next == NULL){  // the last
                     if (tmp_x->next == NULL){  // the last
                         goto no_tmp_x_init;
                         goto no_tmp_x_init;
                     }
                     }
@@ -1819,7 +1827,7 @@ GWARF_result call_back_core(GWARF_result get, var_list *the_var, parameter *tmp_
                         the_var = free_var_list(the_var);  // free the new var
                         the_var = free_var_list(the_var);  // free the new var
                         return tmp;
                         return tmp;
                     }
                     }
-                    assigment_func(tmp_x->u.name, tmp, the_var, 0);
+                    assignment_func(tmp_x->u.name, tmp, the_var, 0);
                     if ((tmp_x->next == NULL)||(tmp_s->next == NULL)){  // the last
                     if ((tmp_x->next == NULL)||(tmp_s->next == NULL)){  // the last
                         break;
                         break;
                     }
                     }
@@ -1888,7 +1896,7 @@ GWARF_result call_back_core(GWARF_result get, var_list *the_var, parameter *tmp_
                 father.value.type = OBJECT_value;
                 father.value.type = OBJECT_value;
                 father.value.value.object_value = get.value.value.object_value;
                 father.value.value.object_value = get.value.value.object_value;
                 if(func_->is_class  == 1){
                 if(func_->is_class  == 1){
-                    assigment_func(tmp_x->u.name, father, the_var, 0);
+                    assignment_func(tmp_x->u.name, father, the_var, 0);
                     if (tmp_x->next == NULL){  // the last
                     if (tmp_x->next == NULL){  // the last
                         goto no_tmp_x_call;
                         goto no_tmp_x_call;
                     }
                     }
@@ -1905,7 +1913,7 @@ GWARF_result call_back_core(GWARF_result get, var_list *the_var, parameter *tmp_
                         the_var = free_var_list(the_var);  // free the new var
                         the_var = free_var_list(the_var);  // free the new var
                         return tmp;
                         return tmp;
                     }
                     }
-                    assigment_func(tmp_x->u.name, tmp, the_var, 0);
+                    assignment_func(tmp_x->u.name, tmp, the_var, 0);
                     if ((tmp_x->next == NULL)||(tmp_s->next == NULL)){  // the last
                     if ((tmp_x->next == NULL)||(tmp_s->next == NULL)){  // the last
                         break;
                         break;
                     }
                     }
@@ -3152,8 +3160,8 @@ GWARF_result sqrt_func(GWARF_result left_result, GWARF_result right_result, var_
     return_back: return return_value;
     return_back: return return_value;
 }
 }
 
 
-// ---------  ASSIGMENT
-GWARF_result assigment_func(char *left, GWARF_result right_result, var_list *the_var, int from){  // the func for assigment and call from read_statement_list
+// ---------  ASSIGnMENT
+GWARF_result assignment_func(char *left, GWARF_result right_result, var_list *the_var, int from){  // the func for assignment and call from read_statement_list
     add_var(the_var, from, left, right_result.value);
     add_var(the_var, from, left, right_result.value);
     return right_result;
     return right_result;
 }
 }

+ 5 - 3
inter/interpreter.h

@@ -107,7 +107,7 @@ typedef struct statement{
                 SUB_func,  // -
                 SUB_func,  // -
                 DIV_func,  // /
                 DIV_func,  // /
                 MUL_func,  // *
                 MUL_func,  // *
-                ASSIGMENT_func, // =
+                ASSIGnMENT_func, // =
                 EQUAL_func,  // ==
                 EQUAL_func,  // ==
                 MORE_func,  // >
                 MORE_func,  // >
                 LESS_func,  // <
                 LESS_func,  // <
@@ -406,6 +406,7 @@ typedef enum{
     __bitright__func = 38,
     __bitright__func = 38,
     __bitrightr__func = 39,
     __bitrightr__func = 39,
     __bitnot__func = 40,
     __bitnot__func = 40,
+    __assignment__func = 41,
 } official_func_type;
 } official_func_type;
 
 
 typedef struct func{
 typedef struct func{
@@ -455,10 +456,10 @@ GWARF_result div_func(GWARF_result, GWARF_result, var_list *);
 GWARF_result pow_func(GWARF_result, GWARF_result, var_list *);
 GWARF_result pow_func(GWARF_result, GWARF_result, var_list *);
 GWARF_result log_func(GWARF_result, GWARF_result, var_list *);
 GWARF_result log_func(GWARF_result, GWARF_result, var_list *);
 GWARF_result sqrt_func(GWARF_result, GWARF_result, var_list *);
 GWARF_result sqrt_func(GWARF_result, GWARF_result, var_list *);
-GWARF_result assigment_func(char *, GWARF_result, var_list *, int);
+GWARF_result assignment_func(char *, GWARF_result, var_list *, int);
 GWARF_result equal_func(GWARF_result, GWARF_result, var_list *, int);
 GWARF_result equal_func(GWARF_result, GWARF_result, var_list *, int);
 GWARF_result negative_func(GWARF_result, var_list *);
 GWARF_result negative_func(GWARF_result, var_list *);
-GWARF_result assigment_statement(statement *, var_list *, var_list *, GWARF_result);
+GWARF_result assignment_statement(statement *, var_list *, var_list *, GWARF_result);
 GWARF_result not_func(GWARF_result, var_list *);
 GWARF_result not_func(GWARF_result, var_list *);
 GWARF_result or_func(statement *, statement *, var_list *);
 GWARF_result or_func(statement *, statement *, var_list *);
 GWARF_result and_func(statement *, statement *, var_list *);
 GWARF_result and_func(statement *, statement *, var_list *);
@@ -486,6 +487,7 @@ GWARF_result get__value__(GWARF_value *, var_list *);
 GWARF_result get__bool__(GWARF_value *, var_list *);
 GWARF_result get__bool__(GWARF_value *, var_list *);
 GWARF_result get__iter__(GWARF_value *, var_list *);
 GWARF_result get__iter__(GWARF_value *, var_list *);
 GWARF_result get__next__(GWARF_value *, var_list *);
 GWARF_result get__next__(GWARF_value *, var_list *);
+GWARF_result get__assignment__(GWARF_value *, var_list *);
 GWARF_result run_func_core(GWARF_value *, var_list *, char *, bool);
 GWARF_result run_func_core(GWARF_value *, var_list *, char *, bool);
 
 
 int len_only_double(double num);
 int len_only_double(double num);

+ 1 - 1
paser/gwarf_yacc.y

@@ -172,7 +172,7 @@ eq_number
     {
     {
         statement *code_tmp =  make_statement();
         statement *code_tmp =  make_statement();
         code_tmp->type = operation;
         code_tmp->type = operation;
-        code_tmp->code.operation.type = ASSIGMENT_func;
+        code_tmp->code.operation.type = ASSIGnMENT_func;
         code_tmp->code.operation.left_exp = $1;
         code_tmp->code.operation.left_exp = $1;
         code_tmp->code.operation.right_exp = $3;
         code_tmp->code.operation.right_exp = $3;
         $$ = code_tmp;
         $$ = code_tmp;

+ 1 - 1
paser/y.tab.c

@@ -2071,7 +2071,7 @@ yyreduce:
     {
     {
         statement *code_tmp =  make_statement();
         statement *code_tmp =  make_statement();
         code_tmp->type = operation;
         code_tmp->type = operation;
-        code_tmp->code.operation.type = ASSIGMENT_func;
+        code_tmp->code.operation.type = ASSIGnMENT_func;
         code_tmp->code.operation.left_exp = (yyvsp[-2].statement_value);
         code_tmp->code.operation.left_exp = (yyvsp[-2].statement_value);
         code_tmp->code.operation.right_exp = (yyvsp[0].statement_value);
         code_tmp->code.operation.right_exp = (yyvsp[0].statement_value);
         (yyval.statement_value) = code_tmp;
         (yyval.statement_value) = code_tmp;