浏览代码

新增了Exception和to_object不会捕获异常

SongZihuan 5 年之前
父节点
当前提交
3ce7aea451
共有 6 个文件被更改,包括 358 次插入152 次删除
  1. 2 2
      README.md
  2. 10 0
      gwarf.c
  3. 237 78
      inter/cfunc.c
  4. 95 68
      inter/interpreter.c
  5. 11 4
      inter/interpreter.h
  6. 3 0
      paser/paser.c

+ 2 - 2
README.md

@@ -70,8 +70,8 @@ return x n  函数返回值x,返回n层
 * ``<==`` 和 ``==>``为非短路逻辑运算:蕴含
 * ``<:=`` 和 ``=:>``为短路逻辑运算:蕴含
 * ``<=>`` 为逻辑运算:同或门
-* ``!==`` 为逻辑运算:异或门
-* ``and`` 和 ``or`` 为非短路逻辑运算符:与,或
+* ``!==`` 为逻辑运算:异或门 ``and`` 和 ``or`` 为非短路逻辑运算符:与,或
 * 处理``GWARF_result``
+* 新增Exception, 修复了``to_object``会捕获异常的bug
 ## 关于GWARF
 最后更新时间 : 2020年05月07日 广州

+ 10 - 0
gwarf.c

@@ -67,6 +67,16 @@ void login(var_list *the_var, inter *global_inter){
     IterException_login_official(the_var, tmp_Exception->the_var, global_inter);
     AssertException_login_official(the_var, tmp_Exception->the_var, global_inter);
     AssignmentException_login_official(the_var, tmp_Exception->the_var, global_inter);
+    IndexException_login_official(the_var, tmp_Exception->the_var, global_inter);
+    KeyException_login_official(the_var, tmp_Exception->the_var, global_inter);
+    ImportException_login_official(the_var, tmp_Exception->the_var, global_inter);
+    IncludeException_login_official(the_var, tmp_Exception->the_var, global_inter);
+    DivZeroException_login_official(the_var, tmp_Exception->the_var, global_inter);
+    ValueException_login_official(the_var, tmp_Exception->the_var, global_inter);
+    TypeException_login_official(the_var, tmp_Exception->the_var, global_inter);
+    ArgsException_login_official(the_var, tmp_Exception->the_var, global_inter);
+    SystemctlException_login_official(the_var, tmp_Exception->the_var, global_inter);
+    VarException_login_official(the_var, tmp_Exception->the_var, global_inter);
 }
 
 // 合并编译:cd "/home/songzihuan/文档/CProject/gwarf/" && gcc gwarf.c -lm -o gwarf && "/home/songzihuan/文档/CProject/gwarf/"gwarf

+ 237 - 78
inter/cfunc.c

@@ -45,56 +45,55 @@ int len_intx(unsigned int num){  // 16进制
     return count;
 }
 
-GWARF_result to_object(GWARF_value value, inter *global_inter){  // 把GWARF_value封装成objct
-    GWARF_result func_result = GWARF_result_reset;
-
-    if((value.type == CLASS_value) || (value.type == OBJECT_value) || (value.type == FUNC_value) || (value.type == NULL_value)){  // 可以直接返回
-        func_result.value = value;
-        return func_result;
+GWARF_result to_object(GWARF_result value, inter *global_inter){  // 把GWARF_value封装成objct
+    error_space(value, return_self, value);
+    if((value.value.type == CLASS_value) || (value.value.type == OBJECT_value) || (value.value.type == FUNC_value) || (value.value.type == NULL_value)){  // 可以直接返回
+        return_self: return value;
     }
-
+    GWARF_result func_result = GWARF_result_reset;
     var_list *the_var = make_var_base(global_inter->global_var);
     var *tmp;
-    if(value.type == NUMBER_value){
+    if(value.value.type == NUMBER_value){
         tmp = find_var(the_var, 0, "double", NULL);
         if(tmp != NULL){
             func_result.value = tmp->value;
         }
     }
-    else if(value.type == INT_value){
+    else if(value.value.type == INT_value){
         tmp = find_var(the_var, 0, "int", NULL);
         if(tmp != NULL){
             func_result.value = tmp->value;
         }
     }
-    else if(value.type == BOOL_value){
+    else if(value.value.type == BOOL_value){
         tmp = find_var(the_var, 0, "bool", NULL);
         if(tmp != NULL){
             func_result.value = tmp->value;
         }
     }
-    else if(value.type == STRING_value){
+    else if(value.value.type == STRING_value){
         tmp = find_var(the_var, 0, "str", NULL);
         if(tmp != NULL){
             func_result.value = tmp->value;
         }
     }
-    else if(value.type == LIST_value){
+    else if(value.value.type == LIST_value){
         tmp = find_var(the_var, 0, "list", NULL);
         if(tmp != NULL){
             func_result.value = tmp->value;
         }
     }
-    else if(value.type == DICT_value){
+    else if(value.value.type == DICT_value){
         tmp = find_var(the_var, 0, "dict", NULL);
         if(tmp != NULL){
             func_result.value = tmp->value;
         }
     }
     else{
-        // TODO:: 报错(解释器错误)
+        free(the_var);
+        return to_error("SystemctlError", "SystemctlException", global_inter);
     }
-    GWARF_result return_tmp = call_back_core(func_result, the_var, pack_value_parameter(value), global_inter);
+    GWARF_result return_tmp = call_back_core(func_result, the_var, pack_value_parameter(value.value), global_inter);
     free(the_var);
     return return_tmp;
 }
@@ -110,7 +109,7 @@ GWARF_result to_tuple(GWARF_value value, inter *global_inter){  // 把GWARF_valu
     }
     else{  // 应该报错 (TypeError)
         free(the_var);
-        return func_result;
+        return to_error("[Systemctl]Can't Not Found Class : 'tuple'", "SystemctlException", global_inter);
     }
     GWARF_result return_tmp = call_back_core(func_result, the_var, pack_value_parameter(value), global_inter);
     free(the_var);
@@ -128,7 +127,7 @@ GWARF_result get_object(parameter *tmp_s, char *name, var_list *the_var, inter *
         func_result.value = tmp->value;
     }
     else{
-        return to_error("Object Name Not Found", "NameException", global_inter);
+        return to_error("[Systemctl]Object Name Not Found", "SystemctlException", global_inter);
     }
     return call_back_core(func_result, the_var, tmp_s, global_inter);
 }
@@ -142,11 +141,6 @@ GWARF_result to_error(char *error_info, char *error_type, inter *global_inter){
     tmp_value.type = STRING_value;
     tmp_value.value.string = error_info;
 
-    func_result.u = statement_end;
-
-    return_result.u = error;
-    return_result.error_info = error_info;
-
     var *tmp = find_var(the_var, 0, error_type, NULL);
 
     if(tmp != NULL){
@@ -154,11 +148,13 @@ GWARF_result to_error(char *error_info, char *error_type, inter *global_inter){
         return_result = call_back_core(func_result, the_var, pack_value_parameter(tmp_value), global_inter);
     }
     else{
-        printf("NameError * 2\n");
+        printf("NOT FOUND :: %s for %s", error_type, error_info);
         return_result.value.type = NULL_value;
         return_result.value.value.int_value = 0;
     }
     free(the_var);
+    return_result.u = error;
+    return_result.error_info = error_info;
     return return_result;
 }
 
@@ -236,7 +232,7 @@ GWARF_result official_func(func *the_func, parameter *tmp_s, var_list *the_var,
                 printf("<-object on %u->", tmp.value.value.object_value);
             }
             else{
-                printf("var value = other\n");
+                return to_error("print: Get Don't Support Type", "TypeException", global_inter);
             }
             if (tmp_s->next == NULL){  // the last
                 break;
@@ -276,6 +272,10 @@ class_object *object_login_official(var_list *the_var, GWARF_result (*paser)(fun
     }
     return class_tmp;
 }
+#define NotFatherError \
+else{ \
+    to_error("Don't get base var", "ValueException", global_inter); \
+}
 
 GWARF_result object_official_func(func *the_func, parameter *tmp_s, var_list *the_var, GWARF_result father, var_list *out_var,inter *global_inter){  // out_var是外部环境
     GWARF_result return_value = GWARF_result_reset;
@@ -288,10 +288,22 @@ GWARF_result object_official_func(func *the_func, parameter *tmp_s, var_list *th
     else if(father.father->type == OBJECT_value){
         login_var = father.father->value.object_value->the_var;
     }
+    NotFatherError;
     switch (the_func->official_func)
     {
         case __value__func:{  // 若想实现运算必须要有这个方法
-            return_value = to_str(*(father.father), out_var, global_inter);
+            size_t size;
+            unsigned long int ad;
+            if(father.father->type == CLASS_value){  // is class so that can use "."
+                ad = (unsigned long int)father.father->value.class_value;
+            }
+            else if(father.father->type == OBJECT_value){
+                ad = (unsigned long int)father.father->value.object_value;
+            }
+            size = (size_t)(9 + len_intx(ad));
+            return_value.value.type = STRING_value;
+            return_value.value.value.string = (char *)malloc(size);
+            snprintf(return_value.value.value.string, size, "<-%u->", ad);
             break;
         }
         case __assignment__func:
@@ -346,9 +358,8 @@ GWARF_result BaseException_official_func(func *the_func, parameter *tmp_s, var_l
     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);
-    }
+    NotFatherError;
+
     switch (the_func->official_func)
     {
         case __init__func:{  // printf something
@@ -436,6 +447,146 @@ class_object *AssignmentException_login_official(var_list *the_var, var_list *fa
     return class_tmp;
 }
 
+class_object *IndexException_login_official(var_list *the_var, var_list *father_var_list, inter *global_inter){
+    // 创建对象[空对象]
+    puts("----set class----");
+    GWARF_result class_value = GWARF_result_reset;
+    class_object *class_tmp = make_object(the_var, father_var_list);
+
+    class_value.value.type = CLASS_value;
+    class_value.value.value.class_value = class_tmp;
+
+    assignment_func("IndexException", class_value, the_var, 0, auto_public);  // 注册class 的 位置
+    puts("----stop set class----");
+    return class_tmp;
+}
+
+class_object *KeyException_login_official(var_list *the_var, var_list *father_var_list, inter *global_inter){
+    // 创建对象[空对象]
+    puts("----set class----");
+    GWARF_result class_value = GWARF_result_reset;
+    class_object *class_tmp = make_object(the_var, father_var_list);
+
+    class_value.value.type = CLASS_value;
+    class_value.value.value.class_value = class_tmp;
+
+    assignment_func("KeyException", class_value, the_var, 0, auto_public);  // 注册class 的 位置
+    puts("----stop set class----");
+    return class_tmp;
+}
+
+class_object *ImportException_login_official(var_list *the_var, var_list *father_var_list, inter *global_inter){
+    // 创建对象[空对象]
+    puts("----set class----");
+    GWARF_result class_value = GWARF_result_reset;
+    class_object *class_tmp = make_object(the_var, father_var_list);
+
+    class_value.value.type = CLASS_value;
+    class_value.value.value.class_value = class_tmp;
+
+    assignment_func("ImportException", class_value, the_var, 0, auto_public);  // 注册class 的 位置
+    puts("----stop set class----");
+    return class_tmp;
+}
+
+class_object *IncludeException_login_official(var_list *the_var, var_list *father_var_list, inter *global_inter){
+    // 创建对象[空对象]
+    puts("----set class----");
+    GWARF_result class_value = GWARF_result_reset;
+    class_object *class_tmp = make_object(the_var, father_var_list);
+
+    class_value.value.type = CLASS_value;
+    class_value.value.value.class_value = class_tmp;
+
+    assignment_func("IncludeException", class_value, the_var, 0, auto_public);  // 注册class 的 位置
+    puts("----stop set class----");
+    return class_tmp;
+}
+
+class_object *DivZeroException_login_official(var_list *the_var, var_list *father_var_list, inter *global_inter){
+    // 创建对象[空对象]
+    puts("----set class----");
+    GWARF_result class_value = GWARF_result_reset;
+    class_object *class_tmp = make_object(the_var, father_var_list);
+
+    class_value.value.type = CLASS_value;
+    class_value.value.value.class_value = class_tmp;
+
+    assignment_func("DivZeroException", class_value, the_var, 0, auto_public);  // 注册class 的 位置
+    puts("----stop set class----");
+    return class_tmp;
+}
+
+class_object *ValueException_login_official(var_list *the_var, var_list *father_var_list, inter *global_inter){
+    // 创建对象[空对象]
+    puts("----set class----");
+    GWARF_result class_value = GWARF_result_reset;
+    class_object *class_tmp = make_object(the_var, father_var_list);
+
+    class_value.value.type = CLASS_value;
+    class_value.value.value.class_value = class_tmp;
+
+    assignment_func("ValueException", class_value, the_var, 0, auto_public);  // 注册class 的 位置
+    puts("----stop set class----");
+    return class_tmp;
+}
+
+class_object *TypeException_login_official(var_list *the_var, var_list *father_var_list, inter *global_inter){
+    // 创建对象[空对象]
+    puts("----set class----");
+    GWARF_result class_value = GWARF_result_reset;
+    class_object *class_tmp = make_object(the_var, father_var_list);
+
+    class_value.value.type = CLASS_value;
+    class_value.value.value.class_value = class_tmp;
+
+    assignment_func("TypeException", class_value, the_var, 0, auto_public);  // 注册class 的 位置
+    puts("----stop set class----");
+    return class_tmp;
+}
+
+class_object *ArgsException_login_official(var_list *the_var, var_list *father_var_list, inter *global_inter){
+    // 创建对象[空对象]
+    puts("----set class----");
+    GWARF_result class_value = GWARF_result_reset;
+    class_object *class_tmp = make_object(the_var, father_var_list);
+
+    class_value.value.type = CLASS_value;
+    class_value.value.value.class_value = class_tmp;
+
+    assignment_func("ArgsException", class_value, the_var, 0, auto_public);  // 注册class 的 位置
+    puts("----stop set class----");
+    return class_tmp;
+}
+
+class_object *SystemctlException_login_official(var_list *the_var, var_list *father_var_list, inter *global_inter){
+    // 创建对象[空对象]
+    puts("----set class----");
+    GWARF_result class_value = GWARF_result_reset;
+    class_object *class_tmp = make_object(the_var, father_var_list);
+
+    class_value.value.type = CLASS_value;
+    class_value.value.value.class_value = class_tmp;
+
+    assignment_func("SystemctlException", class_value, the_var, 0, auto_public);  // 注册class 的 位置
+    puts("----stop set class----");
+    return class_tmp;
+}
+
+class_object *VarException_login_official(var_list *the_var, var_list *father_var_list, inter *global_inter){
+    // 创建对象[空对象]
+    puts("----set class----");
+    GWARF_result class_value = GWARF_result_reset;
+    class_object *class_tmp = make_object(the_var, father_var_list);
+
+    class_value.value.type = CLASS_value;
+    class_value.value.value.class_value = class_tmp;
+
+    assignment_func("VarException", class_value, the_var, 0, auto_public);  // 注册class 的 位置
+    puts("----stop set class----");
+    return class_tmp;
+}
+
 class_object *gobject_login_official(var_list *the_var, GWARF_result (*paser)(func *, parameter *, var_list *, GWARF_result, var_list *,inter *), var_list *father_var_list, inter *global_inter){  // 内置对象继承的类
     // 创建对象[空对象]
     puts("----set class----");
@@ -472,9 +623,7 @@ GWARF_result gobject_official_func(func *the_func, parameter *tmp_s, var_list *t
     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);
-    }
+    NotFatherError;
     switch (the_func->official_func)
     {
         case __init__func:{  // printf something
@@ -553,6 +702,7 @@ GWARF_result gobject_official_func(func *the_func, parameter *tmp_s, var_list *t
 
             GWARF_value base_the_var = tmp_result.value;  // 只有一个参数
             reight_tmp = get__value__(&base_the_var, the_var, global_inter);
+            error_space(reight_tmp, return_result, return_value);
             var *tmp = find_var(login_var, 0, "value", NULL);
             if(tmp != NULL){
                 left_tmp.value = tmp->value;
@@ -1056,9 +1206,7 @@ GWARF_result int_official_func(func *the_func, parameter *tmp_s, var_list *the_v
     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);
-    }
+    NotFatherError;
     switch (the_func->official_func)
     {
         case __init__func:{  // printf something
@@ -1170,9 +1318,7 @@ GWARF_result double_official_func(func *the_func, parameter *tmp_s, var_list *th
     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);
-    }
+    NotFatherError;
     switch (the_func->official_func)
     {
         case __init__func:{  // printf something
@@ -1234,14 +1380,14 @@ GWARF_result to_double(GWARF_value value, var_list *the_var, inter *global_inter
         if(value.type == BOOL_value){
             return_number.value.value.double_value = (double)value.value.bool_value;
         }
-        else if(value.type == INT_value){
+        else if(value.type == INT_value || value.type == NULL_value){
             return_number.value.value.double_value = (double)value.value.int_value;
         }
         else if(value.type == STRING_value){
             return_number.value.value.double_value = (double)atof(value.value.string);
         }
         else{
-            return_number.value.value.double_value = 0;
+            return_number = to_error("Get a Don't Support Type", "TypeException", global_inter);
         }
     }
     return return_number;
@@ -1281,9 +1427,7 @@ GWARF_result str_official_func(func *the_func, parameter *tmp_s, var_list *the_v
     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);
-    }
+    NotFatherError;
     switch (the_func->official_func)
     {
         case __init__func:{  // printf something
@@ -1350,7 +1494,7 @@ GWARF_result to_str(GWARF_value value, var_list *the_var, inter *global_inter){
             snprintf(return_number.value.value.string, size, "<-class on %u->", value.value.class_value);
         }
         else{  // 还有LIST等,其余报错
-            ;
+            return_number = to_error("Get a Don't Support Type", "TypeException", global_inter);
         }
     }
     return return_number;
@@ -1406,10 +1550,13 @@ GWARF_result to_str_dict(GWARF_value value, var_list *the_var, inter *global_int
             return_number.value.value.string = calloc(sizeof(char), size);
             snprintf(return_number.value.value.string, size, "str_<-class on %u->", value.value.class_value);
         }
-        else{
+        else if(value.type == NULL_value){
             return_number.value.value.string = calloc(sizeof(char), 13);
             strcpy(return_number.value.value.string,  "none_<none>");
         }
+        else{
+            return_number = to_error("Get a Don't Support Type", "TypeException", global_inter);
+        }
     }
     return_value: 
     return return_number;
@@ -1505,9 +1652,7 @@ GWARF_result bool_official_func(func *the_func, parameter *tmp_s, var_list *the_
     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);
-    }
+    NotFatherError;
     switch (the_func->official_func)
     {
         case __init__func:{  // printf something
@@ -1610,9 +1755,7 @@ GWARF_result tuple_official_func(func *the_func, parameter *tmp_s, var_list *the
     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);
-    }
+    NotFatherError;
     switch (the_func->official_func)
     {
         case __init__func:{  // printf something
@@ -1693,6 +1836,7 @@ GWARF_result tuple_official_func(func *the_func, parameter *tmp_s, var_list *the
         }
         case __down__func:{  // return index
             var *tmp = find_var(login_var, 0, "value", NULL);
+            int len = tmp->value.value.list_value->index;
             if(tmp != NULL){
                 GWARF_result get_value, tmp_result = traverse(tmp_s->u.value, out_var, false, global_inter);
                 error_space(tmp_result, return_result, return_value);
@@ -1701,11 +1845,20 @@ GWARF_result tuple_official_func(func *the_func, parameter *tmp_s, var_list *the
                 error_space(get_value, return_result, return_value);
                 get_value = to_int(get_value.value, out_var, global_inter);
                 error_space(get_value, return_result, return_value);
+                if(len - 1 < get_value.value.value.int_value){
+                    return_value = to_error("Index To Max", "IndexException", global_inter);
+                    puts("FSFS");
+                    goto return_result;
+                }
+                else if(get_value.value.value.int_value < 0){
+                    return_value = to_error("Index To Min", "IndexException", global_inter);
+                    goto return_result;
+                }
                 return_value.value = tmp->value.value.list_value->list_value[get_value.value.value.int_value];
             }
             else{
-                return_value.value.type = NULL_value;
-                return_value.value.value.int_value = 0;
+                return_value = to_error("Don't get List Value", "ValueException", global_inter);
+                goto return_result;
             }
             break;
         }
@@ -1740,12 +1893,19 @@ GWARF_result tuple_official_func(func *the_func, parameter *tmp_s, var_list *the
                 else{
                     end = len;
                 }
-
+                if(len < start || len < end || end < start){
+                    return_value = to_error("Index To Max[1]", "IndexException", global_inter);
+                    goto return_result;
+                }
+                else if(end < 0 || start < 0){
+                    return_value = to_error("Index To Min", "IndexException", global_inter);
+                    goto return_result;
+                }
                 return_value.value.type = LIST_value;
                 return_value.value.value.list_value = malloc(sizeof(the_list));  // 申请list的空间
                 return_value.value.value.list_value->list_value = malloc((size_t)((end - start) * sizeof(GWARF_value)));
                 memcpy(return_value.value.value.list_value->list_value, (tmp->value.value.list_value->list_value + start), (size_t)((end - start) * sizeof(GWARF_value)));
-                return_value.value.value.list_value->index = (end - start) - 1;
+                return_value.value.value.list_value->index = end - start;
             }
             else{
                 return_value.value.type = NULL_value;
@@ -1756,7 +1916,9 @@ GWARF_result tuple_official_func(func *the_func, parameter *tmp_s, var_list *the
         default:
             break;
     }
-    return_result: return return_value;
+    return_result:
+    puts("STOP");
+    return return_value;
 }
 
 class_object *list_login_official(var_list *the_var, GWARF_result (*paser)(func *, parameter *, var_list *, GWARF_result, var_list *,inter *), var_list *father_var_list, inter *global_inter){
@@ -1793,13 +1955,12 @@ GWARF_result list_official_func(func *the_func, parameter *tmp_s, var_list *the_
     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);
-    }
+    NotFatherError;
     switch (the_func->official_func)
     {
         case __set__func:{  // return index
             var *tmp = find_var(login_var, 0, "value", NULL);
+            int len = tmp->value.value.list_value->index;
             if(tmp != NULL){
                 GWARF_result get_value, tmp_result = traverse(tmp_s->u.value, out_var, false, global_inter);
                 error_space(tmp_result, return_result, return_value);
@@ -1813,7 +1974,14 @@ GWARF_result list_official_func(func *the_func, parameter *tmp_s, var_list *the_
                 tmp_s = tmp_s->next;
                 GWARF_result new_value = traverse(tmp_s->u.value, out_var, false, global_inter);
                 error_space(new_value, return_result, return_value);
-
+                if(len - 1 < get_value.value.value.int_value){
+                    return_value = to_error("Index To Max", "IndexException", global_inter);
+                    goto return_result;
+                }
+                else if(get_value.value.value.int_value < 0){
+                    return_value = to_error("Index To Min", "IndexException", global_inter);
+                    goto return_result;
+                }
                 tmp->value.value.list_value->list_value[get_value.value.value.int_value] = new_value.value;
                 tmp->value.value.list_value->index += 1;
             }
@@ -1844,14 +2012,7 @@ GWARF_result to_dict(GWARF_value value, var_list *the_var, inter *global_inter){
         return_number = to_dict(tmp.value, the_var, global_inter);  // 递归
     }
     else{
-        // 生成一个空的DICT
-        return_number.value.type = DICT_value;
-        return_number.value.value.dict_value = malloc(sizeof(the_dict));
-        return_number.value.value.dict_value->index = 0;
-        return_number.value.value.dict_value->dict_value = make_hash_var();
-        return_number.value.value.dict_value->name_list = malloc(sizeof(dict_key));
-        return_number.value.value.dict_value->name_list->key = "";
-        return_number.value.value.dict_value->name_list->next = NULL;
+        return to_error("Get a Don't Support Type", "TypeException", global_inter);
     }
     return_result: return return_number;
 }
@@ -1873,10 +2034,7 @@ GWARF_result to_list(GWARF_value value, var_list *the_var, inter *global_inter){
         return_number = to_list(tmp_result.value, the_var, global_inter);  // 递归
     }
     else{
-        return_number.value.value.list_value = malloc(sizeof(the_list));
-        return_number.value.value.list_value->index = 1;
-        return_number.value.value.list_value->list_value = malloc(sizeof(GWARF_value));
-        return_number.value.value.list_value->list_value[0] = value;  // 保存value
+        return to_error("Get a Don't Support Type", "TypeException", global_inter);
     }
     return return_number;
 }
@@ -2101,9 +2259,7 @@ GWARF_result dict_official_func(func *the_func, parameter *tmp_s, var_list *the_
     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);
-    }
+    NotFatherError;
     switch (the_func->official_func)
     {
         case __init__func:{  // printf something
@@ -2160,13 +2316,14 @@ GWARF_result dict_official_func(func *the_func, parameter *tmp_s, var_list *the_
             len = tmp->value.value.dict_value->index;
             if(iter_index >= len){
                 return_value = to_error("Max Iter", "IterException", global_inter);
+                goto return_result;
             }
             else{
                 dict_key *tmp_dict_key = tmp->value.value.dict_value->name_list->next;  // 忽略第一个点
                 for(int i = 0;i < iter_index;i += 1){
                     if(tmp_dict_key == NULL){  // to_error
                         return_value = to_error("Max Iter", "IterException", global_inter);
-                        goto next_break;  // 
+                        goto return_result;  // 
                     }
                     tmp_dict_key = tmp_dict_key->next;
                 }
@@ -2178,7 +2335,7 @@ GWARF_result dict_official_func(func *the_func, parameter *tmp_s, var_list *the_
                 return_value.value = key_to_str(tmp_dict_key->key);
             }
 
-            next_break: break;
+             break;
         }
         case __down__func:{  // return index
             var *tmp = find_var(login_var, 0, "value", NULL);
@@ -2189,7 +2346,8 @@ GWARF_result dict_official_func(func *the_func, parameter *tmp_s, var_list *the_
                 error_space(get_value, return_result, return_value);
                 var *find_var = find_node(get_value.value.value.string, tmp->value.value.dict_value->dict_value);
                 if(find_var == NULL){  // not found
-                    return_value = to_error("Dict key Not Found", "NameException", global_inter);
+                    return_value = to_error("Dict key Not Found", "KeyException", global_inter);
+                    goto return_result;
                 }
                 else{
                     return_value.value = find_var->value;
@@ -2294,8 +2452,9 @@ GWARF_result run_func_core(GWARF_value *base_the_var, var_list *the_var, char *n
         }
         else{
             char *tmp = malloc((size_t)( 21 + strlen(name)) );
-            sprintf(tmp, "name not found [%s]\n", name);
+            sprintf(tmp, "Name Not Found [%s]\n", name);
             reight_tmp = to_error(tmp, "NameException", global_inter);
+            puts("GGGGGG");
             goto return_result;
         }
     }

+ 95 - 68
inter/interpreter.c

@@ -117,7 +117,7 @@ GWARF_result read_statement(statement *the_statement, var_list *the_var, var_lis
                 return_value = traverse(the_statement->code.chose_exp.false_do, the_var, false, global_inter);
             }
             if(!(is_error(&return_value) || is_space(&return_value))){  // Name Error错误
-                return_value = to_object(return_value.value,global_inter);
+                return_value = to_object(return_value,global_inter);
             }
             break;
         }
@@ -192,13 +192,13 @@ GWARF_result read_statement(statement *the_statement, var_list *the_var, var_lis
         case base_list:{  // get value[所有字面量均为这个表达式]
             GWARF_result tmp = parameter_to_list(the_statement->code.base_tuple.value, the_var,global_inter);
             error_space(tmp, return_result, return_value);
-            return_value = to_object(tmp.value,global_inter);  // code
+            return_value = to_object(tmp,global_inter);  // code
             break;
         }
         case base_dict:{  // get value[所有字面量均为这个表达式]
             GWARF_result tmp = parameter_to_dict(the_statement->code.base_tuple.value, the_var,global_inter);
             error_space(tmp, return_result, return_value);
-            return_value = to_object(tmp.value,global_inter);  // code
+            return_value = to_object(tmp,global_inter);  // code
             break;
         }
         case slice:{  // get value[所有字面量均为这个表达式]
@@ -231,7 +231,7 @@ GWARF_result read_statement(statement *the_statement, var_list *the_var, var_lis
             }
 
             the_break_slice: 
-            return_value = to_object(return_value.value, global_inter);
+            return_value = to_object(return_value, global_inter);
             // printf("return_value.value.type = %d\n", return_value.value);
             break;
         }
@@ -281,7 +281,6 @@ GWARF_result read_statement(statement *the_statement, var_list *the_var, var_lis
                 max += 1;
             }
 
-            printf("(the_statement->code).base_var.var_name = %s\n", (the_statement->code).base_var.var_name);
             var *tmp = find_var(the_var, from, (the_statement->code).base_var.var_name, &index);
             // 检查权限
             char *str_tmp;  // 因为goto语句,所以声明放到外面
@@ -442,7 +441,7 @@ GWARF_result read_statement(statement *the_statement, var_list *the_var, var_lis
             *(return_value.father) = base_the_var;
 
             the_break: 
-            return_value = to_object(return_value.value,global_inter);
+            return_value = to_object(return_value,global_inter);
             break;
         }
         case down:{
@@ -458,7 +457,7 @@ GWARF_result read_statement(statement *the_statement, var_list *the_var, var_lis
                     return_value = call_back_core(get, the_var, (the_statement->code).down.child_var, global_inter);
                 }
                 else{
-                    ;  // TODO:: 报错
+                    return_value = to_error("Don't Support Down Number", "TypeException", global_inter);
                 }
             }
             else if(base_the_var.type == OBJECT_value){
@@ -469,12 +468,15 @@ GWARF_result read_statement(statement *the_statement, var_list *the_var, var_lis
                     return_value = call_back_core(get, the_var, (the_statement->code).down.child_var, global_inter);
                 }
                 else{
-                      // TODO:: 报错
+                    return_value = to_error("Don't Support Down Number", "TypeException", global_inter);
                 }
             }
+            else{
+                return_value = to_error("Don't Support Down Number", "TypeException", global_inter);
+            }
 
             the_break_down: 
-            return_value = to_object(return_value.value,global_inter);  // call_back_core 返回值是object
+            return_value = to_object(return_value,global_inter);  // call_back_core 返回值是object
             break;
         }
         case def:{
@@ -828,7 +830,7 @@ GWARF_result read_statement(statement *the_statement, var_list *the_var, var_lis
             else{
                 GWARF_result tmp_result = traverse(the_statement->code.return_code.value, the_var, false, global_inter);
                 error_space(tmp_result, return_result, return_value);
-                return_value = to_object(tmp_result.value,global_inter);
+                return_value = to_object(tmp_result,global_inter);
             }
             return_value.value.lock_token = base;
             break;
@@ -914,7 +916,11 @@ GWARF_result include_func(statement *the_statement, var_list *the_var, inter *gl
     free(new_global_inter->global_var);  // 不需要新的the_var
     new_global_inter->global_var = the_var->hash_var_base;
     
-    parser(file.value.value.string, new_global_inter);
+    int status = parser(file.value.value.string, new_global_inter);
+    if(status){
+        return to_error("Include Error", "IncludeException", global_inter);
+    }
+
     printf("----start run----\n");
     traverse_global(new_global_inter->global_code, the_var, new_global_inter);
     printf("code end...\n");
@@ -939,7 +945,10 @@ GWARF_result import_func(statement *the_statement, var_list *the_var, inter *glo
     
     login(new_the_var, new_global_inter);
     
-    parser(file.value.value.string, new_global_inter);
+    int status = parser(file.value.value.string, new_global_inter);
+    if(status){
+        return to_error("Import Error", "ImportException", global_inter);
+    }
     printf("----start run----\n");
     traverse_global(new_global_inter->global_code, new_the_var, new_global_inter);
     printf("code end...\n");
@@ -1291,7 +1300,7 @@ GWARF_result raise_func(statement *the_statement, var_list *the_var, bool not_cl
         error_value = call_back_core(error_value, the_var, pack_value_parameter(info.value), global_inter);
     }
     else{
-        error_value = to_object(error_value.value,global_inter);  // 直接返回
+        error_value = to_object(error_value,global_inter);  // 直接返回
     }
 
     return_value: return error_value;
@@ -1442,9 +1451,10 @@ GWARF_result forin_func(statement *the_statement, var_list *the_var, inter *glob
         goto return_value;
     }
     
-    GWARF_value iter_value = get__iter__(&(tmp_result.value), the_var, global_inter).value;  // 获取迭代object,一般是返回self
+    GWARF_result iter_value = get__iter__(&(tmp_result.value), the_var, global_inter);  // 获取迭代object,一般是返回self
+    error_space(iter_value, return_value, value);
     while (1){
-        GWARF_result tmp_next = get__next__(&(iter_value), the_var, global_inter);// 执行__next__的返回值
+        GWARF_result tmp_next = get__next__(&(iter_value.value), the_var, global_inter);// 执行__next__的返回值
         if(is_error(&tmp_next)){  // TODO:: 检查是否为IterException
             value.u = statement_end;
             value.value.type = NULL_value;
@@ -1630,7 +1640,7 @@ GWARF_result tmp = func(left_result, right_result, the_var, global_inter); \
 if(is_error(&tmp) || is_space(&tmp)){ \
     return tmp; \
 } \
-tmp = to_object(tmp.value, global_inter); \
+tmp = to_object(tmp, global_inter); \
 if(is_error(&tmp) || is_space(&tmp)){ \
     return tmp; \
 } \
@@ -1654,7 +1664,9 @@ GWARF_result operation_func(statement *the_statement, var_list *the_var, var_lis
             break;
         case MUL_func:
             get_left_result;
+            puts("Get Left");
             get_right_result;
+            puts("Get Right");
             value = mul_func(left_result, right_result, the_var, global_inter);
             break;
         case DIV_func:
@@ -1885,7 +1897,7 @@ GWARF_result operation_func(statement *the_statement, var_list *the_var, var_lis
         default:
             break;
     }
-    value = to_object(value.value,global_inter);  // 返回类型是object[不下放到add func等]
+    value = to_object(value,global_inter);  // 返回类型是object[不下放到add func等]
     return value;
 }
 
@@ -2096,7 +2108,7 @@ GWARF_result call_back(statement *the_statement, var_list *the_var, inter *globa
 
     result = call_back_core(get, the_var, the_statement->code.call.parameter_list, global_inter);
     error_space(get, return_result, result);
-    result = to_object(result.value,global_inter);  // 返回类型是object
+    result = to_object(result,global_inter);  // 返回类型是object
     return_result: return result;
 }
 
@@ -2115,7 +2127,7 @@ GWARF_result login_var(var_list *the_var, var_list *old_var_list, parameter *tmp
         }
         if(assignment_type == 0){  // 对位赋值
             if ((tmp_x == NULL)&&(tmp_s != NULL)){  // 参数过多
-                printf("Warning!!![2]\n");
+                return to_error("Too Many Args", "ArgsException", global_inter);
                 break;
             }
             else if ((tmp_x != NULL)&&(tmp_s == NULL)){  // 使用默认值
@@ -2126,7 +2138,6 @@ GWARF_result login_var(var_list *the_var, var_list *old_var_list, parameter *tmp
                     else if(tmp_x->type == name_value){
                         GWARF_result tmp = traverse(tmp_x->u.value, the_var, false, global_inter);  // 执行形参
                         error_space(tmp, return_base_result, return_result);
-                        printf("tmp_x->u.var->type = %d\n", tmp_x->u.var->type);
                         GWARF_result tmp_assignment = assignment_statement(tmp_x->u.var, the_var, the_var, tmp,global_inter);  // 赋值
                         error_space(tmp_assignment, return_base_result, return_result);
                         tmp_x = tmp_x->next;  // get the next to iter
@@ -2144,7 +2155,7 @@ GWARF_result login_var(var_list *the_var, var_list *old_var_list, parameter *tmp
                         tmp_x = tmp_x->next;  // get the next to iter
                     }
                     else{
-                        printf("warning!!![3]\n");  // 形参不足
+                        return to_error("Too Little Args", "ArgsException", global_inter);
                         break;
                     }
 
@@ -2273,7 +2284,7 @@ GWARF_result login_var(var_list *the_var, var_list *old_var_list, parameter *tmp
             // 放入list中
             GWARF_result dict_tmp = parameter_to_dict(tmp_s, old_var_list, global_inter);
             error_space(dict_tmp, return_base_result, return_result);
-            dict_tmp = to_object(dict_tmp.value, global_inter);  // 把所有name_value变成dict
+            dict_tmp = to_object(dict_tmp, global_inter);  // 把所有name_value变成dict
             error_space(dict_tmp, return_base_result, return_result);
             
             GWARF_result assignment_tmp = assignment_statement(tmp_x->u.var, the_var, the_var, dict_tmp,global_inter);
@@ -2284,8 +2295,7 @@ GWARF_result login_var(var_list *the_var, var_list *old_var_list, parameter *tmp
         }
         else if(assignment_type == 1 || tmp_s->type == name_value){  // 根据tmp_s赋值,同时也是进入assignment_type == 1模式的入口,进入前提是:tmp_x不是put_kwargs[否则直接全部赋值到put_kwargs上即可]
             if(tmp_s->type != name_value){
-                printf("[%d]::Warning!!!\n", tmp_s->type);  // 进入了模式1, 但不是name_value 
-                break;
+                return to_error("Miss '=' in Args", "ArgsException", global_inter);
             }
             assignment_type = 1;
             GWARF_result assignment_tmp = assignment_statement(tmp_s->u.var, old_var_list, tmp_var, tmp,global_inter);  // 先赋值到tmp_var上
@@ -2293,7 +2303,6 @@ GWARF_result login_var(var_list *the_var, var_list *old_var_list, parameter *tmp
             tmp_s = tmp_s->next;
         }
         else if(tmp_s->type == put_args){  // assignment_type不在1模式 -> 把tmp_s列表解释为参数
-            printf("put_args\n");
             parameter *before = tmp_s, *after = tmp_s->next;
             GWARF_result iter_value = get__iter__(&(tmp.value), old_var_list, global_inter);  // 获取迭代object,一般是返回self
             error_space(iter_value, return_base_result, return_result);
@@ -2315,7 +2324,7 @@ GWARF_result login_var(var_list *the_var, var_list *old_var_list, parameter *tmp
             // 放入list中
             GWARF_result list_tmp = parameter_to_list(tmp_s, old_var_list, global_inter);
             error_space(list_tmp, return_base_result, return_result);
-            list_tmp = to_object(list_tmp.value, global_inter);  // 把所有only_value变成list
+            list_tmp = to_object(list_tmp, global_inter);  // 把所有only_value变成list
             error_space(list_tmp, return_base_result, return_result);
 
             GWARF_result assignment_tmp = assignment_statement(tmp_x->u.var, old_var_list, the_var, list_tmp,global_inter);
@@ -2346,7 +2355,6 @@ GWARF_result login_var(var_list *the_var, var_list *old_var_list, parameter *tmp
 GWARF_result call_back_core(GWARF_result get, var_list *the_var, parameter *tmp_s, inter *global_inter){  // the func for add and call from read_statement_list
     GWARF_result result = GWARF_result_reset;
     var_list *old_var_list = the_var;
-    printf("get.value.type = %d\n", get.value.type);
     if(get.value.type == FUNC_value){
         func *func_ = get.value.value.func_value;
         parameter *tmp_x = func_->parameter_list;
@@ -2376,19 +2384,23 @@ GWARF_result call_back_core(GWARF_result get, var_list *the_var, parameter *tmp_
                     }
                     tmp_x = tmp_x->next;  // get the next to iter
                 }
+                // 支持没有father的手动调用
             }
             else if(func_->is_class == cls){
                 if(get.father != NULL){
                     if(get.father->type == CLASS_value){
                         father.value = *(get.father);
                     }
-                    else{
+                    else if(get.father->type == OBJECT_value){
                         class_object *class_tmp = malloc(sizeof(class_object));
                         father.value.value.class_value = class_tmp;
                         father.value.type = CLASS_value;
                         class_tmp->the_var = get.father->value.object_value->cls;
                         class_tmp->out_var = old_var_list;
                     }
+                    else{
+                        goto out;
+                    }
                     GWARF_result assignment_tmp = assignment_statement_core(tmp_x->u.var, old_var_list, the_var, father, true, auto_public, global_inter);
                     if(is_error(&assignment_tmp) || is_space(&assignment_tmp)){  // Name Error错误
                         the_var = free_var_list(the_var);  // free the new var
@@ -2396,11 +2408,9 @@ GWARF_result call_back_core(GWARF_result get, var_list *the_var, parameter *tmp_
                     }
                     tmp_x = tmp_x->next;  // get the next to iter
                 }
-                else{
-                    printf("Warning!!![1]\n");
-                }
+                out:
+                ;
             }
-
             GWARF_result tmp_return = login_var(the_var, old_var_list, tmp_x, tmp_s, global_inter);
             if(tmp_return.u != statement_end){
                 the_var = free_var_list(the_var);  // free the new var
@@ -2492,12 +2502,7 @@ GWARF_result call_back_core(GWARF_result get, var_list *the_var, parameter *tmp_
                 father.value.object_value = object_tmp;
                 tmp_get.father = &father;
                 GWARF_result tmp = func_->paser(func_, tmp_s, the_var, tmp_get, old_var_list, global_inter);   // 返回值不记录
-                if(is_error(&tmp)){  // Name Error错误
-                    the_var = free_var_list(the_var);  // free the new var
-                    // puts("STOP:: Name No Found!");
-                    return tmp;
-                }
-                else if(is_space(&tmp)){
+                if(is_error(&tmp) || is_space(&tmp)){  // Name Error错误
                     the_var = free_var_list(the_var);  // free the new var
                     return tmp;
                 }
@@ -2585,6 +2590,9 @@ 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
         }
+        else{
+            return to_error("Don't Support to CallBack", "ValueException", global_inter);
+        }
     }
     back:
     if(result.u == return_def){
@@ -2747,6 +2755,11 @@ GWARF_result not_func(GWARF_result right_result, var_list *the_var, inter *globa
     return_back: return return_value;
 }
 
+#define NotSupportCul() \
+else{ \
+    return to_error("Don't Support to Calculation", "TypeException", global_inter); \
+}
+
 // ---------  BITAND &
 GWARF_result bit_and_func(GWARF_result left_result, GWARF_result right_result, var_list *the_var, inter *global_inter){  // the func for add and call from read_statement_list
     GWARF_result return_value, get;  // the result by call read_statement_list with left and right = GWARF_result_reset; value is the result for add
@@ -2813,6 +2826,7 @@ GWARF_result bit_and_func(GWARF_result left_result, GWARF_result right_result, v
             return_value.value.type = INT_value;
             return_value.value.value.int_value = (int)left_result.value.value.double_value & right_result.value.value.int_value;
         }
+        NotSupportCul();
     }
     return_back: return return_value;
 }
@@ -2883,6 +2897,7 @@ GWARF_result bit_or_func(GWARF_result left_result, GWARF_result right_result, va
             return_value.value.type = INT_value;
             return_value.value.value.int_value = (int)left_result.value.value.double_value | right_result.value.value.int_value;
         }
+        NotSupportCul();
     }
     return_back: return return_value;
 }
@@ -2954,6 +2969,7 @@ GWARF_result bit_notor_func(GWARF_result left_result, GWARF_result right_result,
             return_value.value.type = INT_value;
             return_value.value.value.int_value = (int)left_result.value.value.double_value ^ right_result.value.value.int_value;
         }
+        NotSupportCul();
     }
     return_back: return return_value;
 }
@@ -3024,6 +3040,7 @@ GWARF_result bit_left_func(GWARF_result left_result, GWARF_result right_result,
             return_value.value.type = INT_value;
             return_value.value.value.int_value = (int)left_result.value.value.double_value << right_result.value.value.int_value;
         }
+        NotSupportCul();
     }
     return_back: return return_value;
 }
@@ -3094,6 +3111,7 @@ GWARF_result bit_right_func(GWARF_result left_result, GWARF_result right_result,
             return_value.value.type = INT_value;
             return_value.value.value.int_value = (int)left_result.value.value.double_value >> right_result.value.value.int_value;
         }
+        NotSupportCul();
     }
     return_back: return return_value;
 }
@@ -3145,6 +3163,7 @@ GWARF_result bit_not_func(GWARF_result right_result, var_list *the_var, inter *g
             return_value.value.type = INT_value;
             return_value.value.value.int_value = ~((int)right_result.value.value.double_value);
         }
+        NotSupportCul();
     }
     return return_value;
 }
@@ -3223,7 +3242,7 @@ GWARF_result add_func(GWARF_result left_result, GWARF_result right_result, var_l
             strcpy(return_value.value.value.string, l);  // 复制字符串
             strcat(return_value.value.value.string, r);  // 追加字符串
         }
-        
+        NotSupportCul();
     }
     return_back: return return_value;
 }
@@ -3290,6 +3309,7 @@ GWARF_result sub_func(GWARF_result left_result, GWARF_result right_result, var_l
             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);
         }
+        NotSupportCul();
     }
     return_back: return return_value;
 }
@@ -3352,6 +3372,7 @@ GWARF_result negative_func(GWARF_result right_result, var_list *the_var, inter *
                 return_value.value.value.string[i] = tmp[strlen(tmp) - i - 1];  // 反转
             }
         }
+        NotSupportCul();
     }
     return_back: return return_value;
 }
@@ -3379,6 +3400,7 @@ GWARF_result mul_func(GWARF_result left_result, GWARF_result right_result, var_l
 
         var *tmp = find_var(call_var, 0, "__mul__", NULL);
         if(tmp != NULL){
+            puts("FWW");
             get.value = tmp->value;
             get.father = &base_the_var;  // 设置father
             return_value = call_back_core(get, the_var, pack_value_parameter(left_result.value), global_inter);
@@ -3477,6 +3499,7 @@ GWARF_result mul_func(GWARF_result left_result, GWARF_result right_result, var_l
             }
             
         }
+        NotSupportCul();
     }
     return_back: return return_value;
 }
@@ -3521,7 +3544,7 @@ GWARF_result div_func(GWARF_result left_result, GWARF_result right_result, var_l
         }
         else if(right_result.value.type == NULL_value){
             return_value.value = left_result.value;  // NULL除发相当于1
-            goto return_result;
+            goto return_back;
         }
         // 此处不是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
@@ -3544,8 +3567,9 @@ GWARF_result div_func(GWARF_result left_result, GWARF_result right_result, var_l
             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);
         }
+        NotSupportCul();
     }
-    return_back: return_result: return return_value;
+    return_back: return return_value;
 }
 
 // ---------  MOD_func
@@ -3588,7 +3612,7 @@ GWARF_result mod_func(GWARF_result left_result, GWARF_result right_result, var_l
         }
         else if(right_result.value.type == NULL_value){
             return_value.value = left_result.value;  // NULL除 相当于1
-            goto return_result;
+            goto return_back;
         }
         // 此处不是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
@@ -3611,8 +3635,9 @@ GWARF_result mod_func(GWARF_result left_result, GWARF_result right_result, var_l
             return_value.value.type = INT_value;
             return_value.value.value.int_value = ((int)left_result.value.value.double_value % right_result.value.value.int_value);
         }
+        NotSupportCul();
     }
-    return_back: return_result: return return_value;
+    return_back: return return_value;
 }
 
 // ---------  int_div[整除]
@@ -3655,7 +3680,7 @@ GWARF_result int_div_func(GWARF_result left_result, GWARF_result right_result, v
         }
         else if(right_result.value.type == NULL_value){
             return_value.value = left_result.value;  // NULL除发相当于1
-            goto return_result;
+            goto return_back;
         }
         // 此处不是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
@@ -3678,8 +3703,9 @@ GWARF_result int_div_func(GWARF_result left_result, GWARF_result right_result, v
             return_value.value.type = INT_value;
             return_value.value.value.int_value = ((int)left_result.value.value.double_value / (int)right_result.value.value.int_value);
         }
+        NotSupportCul();
     }
-    return_back: return_result: return return_value;
+    return_back: return return_value;
 }
 
 // ---------  POW
@@ -3744,6 +3770,7 @@ GWARF_result pow_func(GWARF_result left_result, GWARF_result right_result, var_l
             return_value.value.type = NUMBER_value;
             return_value.value.value.double_value = (double)pow((double)left_result.value.value.double_value, (double)right_result.value.value.int_value);
         }
+        NotSupportCul();
     }
     return_back: return return_value;
 }
@@ -3810,6 +3837,7 @@ GWARF_result log_func(GWARF_result left_result, GWARF_result right_result, var_l
             return_value.value.type = NUMBER_value;
             return_value.value.value.double_value = (double)log_((double)left_result.value.value.double_value, (double)right_result.value.value.int_value);
         }
+        NotSupportCul();
     }
     return_back: return return_value;
 }
@@ -3876,6 +3904,7 @@ GWARF_result sqrt_func(GWARF_result left_result, GWARF_result right_result, var_
             return_value.value.type = NUMBER_value;
             return_value.value.value.double_value = (double)sqrt_((double)left_result.value.value.double_value, (double)right_result.value.value.int_value);
         }
+        NotSupportCul();
     }
     return_back: return return_value;
 }
@@ -3933,19 +3962,19 @@ GWARF_result equal_func(GWARF_result left_result, GWARF_result right_result, var
             if ((left_result.value.value.int_value == right_result.value.value.int_value) && (type == 0)){  // 如果相等:: __eq__
                 return_bool = true;  // 返回1 否则(默认)为0
             }
-            if ((left_result.value.value.int_value > right_result.value.value.int_value) && (type == 1)){  // 如果大于::__more__
+            else if ((left_result.value.value.int_value > right_result.value.value.int_value) && (type == 1)){  // 如果大于::__more__
                 return_bool = true;  // 返回1 否则(默认)为0
             }
-            if ((left_result.value.value.int_value < right_result.value.value.int_value) && (type == 2)){  // 如果小于::__less__
+            else if ((left_result.value.value.int_value < right_result.value.value.int_value) && (type == 2)){  // 如果小于::__less__
                 return_bool = true;  // 返回1 否则(默认)为0
             }
-            if ((left_result.value.value.int_value >= right_result.value.value.int_value) && (type == 3)){  // 如果大于等于::__eqmore__
+            else if ((left_result.value.value.int_value >= right_result.value.value.int_value) && (type == 3)){  // 如果大于等于::__eqmore__
                 return_bool = true;  // 返回1 否则(默认)为0
             }
-            if ((left_result.value.value.int_value <= right_result.value.value.int_value) && (type == 4)){  // 如果小于等于::__eqless__
+            else if ((left_result.value.value.int_value <= right_result.value.value.int_value) && (type == 4)){  // 如果小于等于::__eqless__
                 return_bool = true;  // 返回1 否则(默认)为0
             }
-            if ((left_result.value.value.int_value != right_result.value.value.int_value) && (type == 5)){  // 如果不相等::__noteq__
+            else if ((left_result.value.value.int_value != right_result.value.value.int_value) && (type == 5)){  // 如果不相等::__noteq__
                 return_bool = true;  // 返回1 否则(默认)为0
             }
         }
@@ -3953,19 +3982,19 @@ GWARF_result equal_func(GWARF_result left_result, GWARF_result right_result, var
             if ((left_result.value.value.double_value == right_result.value.value.double_value) && (type == 0)){  // 如果相等
                 return_bool = true;  // 返回1 否则(默认)为0
             }
-            if ((left_result.value.value.double_value > right_result.value.value.double_value) && (type == 1)){  // 如果大于
+            else if ((left_result.value.value.double_value > right_result.value.value.double_value) && (type == 1)){  // 如果大于
                 return_bool = true;  // 返回1 否则(默认)为0
             }
-            if ((left_result.value.value.double_value < right_result.value.value.double_value) && (type == 2)){  // 如果小于
+            else if ((left_result.value.value.double_value < right_result.value.value.double_value) && (type == 2)){  // 如果小于
                 return_bool = true;  // 返回1 否则(默认)为0
             }
-            if ((left_result.value.value.double_value >= right_result.value.value.double_value) && (type == 3)){  // 如果大于等于
+            else if ((left_result.value.value.double_value >= right_result.value.value.double_value) && (type == 3)){  // 如果大于等于
                 return_bool = true;  // 返回1 否则(默认)为0
             }
-            if ((left_result.value.value.double_value <= right_result.value.value.double_value) && (type == 4)){  // 如果小于等于
+            else if ((left_result.value.value.double_value <= right_result.value.value.double_value) && (type == 4)){  // 如果小于等于
                 return_bool = true;  // 返回1 否则(默认)为0
             }
-            if ((left_result.value.value.double_value != right_result.value.value.double_value) && (type == 5)){  // 如果不相等
+            else if ((left_result.value.value.double_value != right_result.value.value.double_value) && (type == 5)){  // 如果不相等
                 return_bool = true;  // 返回1 否则(默认)为0
             }
         }
@@ -3973,19 +4002,19 @@ GWARF_result equal_func(GWARF_result left_result, GWARF_result right_result, var
             if ((left_result.value.value.double_value == right_result.value.value.int_value) && (type == 0)){  // 如果相等
                 return_bool = true;  // 返回1 否则(默认)为0
             }
-            if ((left_result.value.value.double_value > right_result.value.value.int_value) && (type == 1)){  // 如果大于
+            else if ((left_result.value.value.double_value > right_result.value.value.int_value) && (type == 1)){  // 如果大于
                 return_bool = true;  // 返回1 否则(默认)为0
             }
-            if ((left_result.value.value.double_value < right_result.value.value.int_value) && (type == 2)){  // 如果小于
+            else if ((left_result.value.value.double_value < right_result.value.value.int_value) && (type == 2)){  // 如果小于
                 return_bool = true;  // 返回1 否则(默认)为0
             }
-            if ((left_result.value.value.double_value >= right_result.value.value.int_value) && (type == 3)){  // 如果大于等于
+            else if ((left_result.value.value.double_value >= right_result.value.value.int_value) && (type == 3)){  // 如果大于等于
                 return_bool = true;  // 返回1 否则(默认)为0
             }
-            if ((left_result.value.value.double_value <= right_result.value.value.int_value) && (type == 4)){  // 如果小于等于
+            else if ((left_result.value.value.double_value <= right_result.value.value.int_value) && (type == 4)){  // 如果小于等于
                 return_bool = true;  // 返回1 否则(默认)为0
             }
-            if ((left_result.value.value.double_value != right_result.value.value.int_value) && (type == 5)){  // 如果不相等
+            else if ((left_result.value.value.double_value != right_result.value.value.int_value) && (type == 5)){  // 如果不相等
                 return_bool = true;  // 返回1 否则(默认)为0
             }
         }
@@ -3993,22 +4022,23 @@ GWARF_result equal_func(GWARF_result left_result, GWARF_result right_result, var
             if ((left_result.value.value.int_value == right_result.value.value.double_value) && (type == 0)){  // 如果相等
                 return_bool = true;  // 返回1 否则(默认)为0
             }
-            if ((left_result.value.value.int_value > right_result.value.value.double_value) && (type == 1)){  // 如果大于
+            else if ((left_result.value.value.int_value > right_result.value.value.double_value) && (type == 1)){  // 如果大于
                 return_bool = true;  // 返回1 否则(默认)为0
             }
-            if ((left_result.value.value.int_value < right_result.value.value.double_value) && (type == 2)){  // 如果小于
+            else if ((left_result.value.value.int_value < right_result.value.value.double_value) && (type == 2)){  // 如果小于
                 return_bool = true;  // 返回1 否则(默认)为0
             }
-            if ((left_result.value.value.int_value >= right_result.value.value.double_value) && (type == 3)){  // 如果大于等于
+            else if ((left_result.value.value.int_value >= right_result.value.value.double_value) && (type == 3)){  // 如果大于等于
                 return_bool = true;  // 返回1 否则(默认)为0
             }
-            if ((left_result.value.value.int_value <= right_result.value.value.double_value) && (type == 4)){  // 如果小于等于
+            else if ((left_result.value.value.int_value <= right_result.value.value.double_value) && (type == 4)){  // 如果小于等于
                 return_bool = true;  // 返回1 否则(默认)为0
             }
-            if ((left_result.value.value.int_value != right_result.value.value.double_value) && (type == 5)){  // 如果不相等
+            else if ((left_result.value.value.int_value != right_result.value.value.double_value) && (type == 5)){  // 如果不相等
                 return_bool = true;  // 返回1 否则(默认)为0
             }
         }
+        NotSupportCul();
         return_value.value.value.bool_value = return_bool;
         return_value.value.type = BOOL_value;
     }
@@ -4058,9 +4088,6 @@ GWARF_result traverse(statement *the_statement, var_list *the_var, bool new, int
         if(!lock){
             result = result2;
         }
-        else{
-            puts("local");
-        }
         tmp = tmp->next;
     }
     if(new){  // need to make new var

+ 11 - 4
inter/interpreter.h

@@ -641,7 +641,7 @@ int len_only_double(double num);
 int len_double(double num);
 int len_int(int num);
 int len_intx(unsigned int num);
-GWARF_result to_object(GWARF_value, inter *);
+GWARF_result to_object(GWARF_result, inter *);
 GWARF_result get_object(parameter *, char *, var_list *, inter *);
 class_object *make_object(var_list *the_var, var_list *father_var_list);
 
@@ -696,6 +696,16 @@ class_object *NameException_login_official(var_list *the_var, var_list *father_v
 class_object *IterException_login_official(var_list *the_var, var_list *father_var_list,inter *global_inter);
 class_object *AssertException_login_official(var_list *the_var, var_list *father_var_list,inter *global_inter);
 class_object *AssignmentException_login_official(var_list *the_var, var_list *father_var_list,inter *global_inter);
+class_object *IndexException_login_official(var_list *the_var, var_list *father_var_list, inter *global_inter);
+class_object *KeyException_login_official(var_list *the_var, var_list *father_var_list, inter *global_inter);
+class_object *ImportException_login_official(var_list *the_var, var_list *father_var_list, inter *global_inter);
+class_object *IncludeException_login_official(var_list *the_var, var_list *father_var_list, inter *global_inter);
+class_object *DivZeroException_login_official(var_list *the_var, var_list *father_var_list, inter *global_inter);
+class_object *ValueException_login_official(var_list *the_var, var_list *father_var_list, inter *global_inter);
+class_object *TypeException_login_official(var_list *the_var, var_list *father_var_list, inter *global_inter);
+class_object *ArgsException_login_official(var_list *the_var, var_list *father_var_list, inter *global_inter);
+class_object *SystemctlException_login_official(var_list *the_var, var_list *father_var_list, inter *global_inter);
+class_object *VarException_login_official(var_list *the_var, var_list *father_var_list, inter *global_inter);
 
 // 生成错误
 GWARF_result to_error(char *, char *, inter *);
@@ -760,7 +770,4 @@ GWARF_result traverse_get_value(statement *, var_list *, var_list *,inter *);
 inter *get_inter();
 void login(var_list *the_var, inter *global_inter);
 
-// inter *global_inter;
-// statement_list *statement_base;
-
 #endif

+ 3 - 0
paser/paser.c

@@ -15,6 +15,9 @@ int parser(char *file_address, inter *global_inter){
     
     paser_status.global_paser = login_paser();  // 注册解释器[往global_paser写入数据]
     paser_status.file_p = fopen(file_address, "r");  // 打开文件
+    if(paser_status.file_p == NULL){
+        return 0;
+    }
     paser_status.statement_base = global_inter->global_code;
     safe_get_token(&paser_status, global_token_node);
     command_list(&paser_status, global_token_node);