فهرست منبع

修复了链表复制的逻辑错误和允许定义def和class时设定层数

SongZihuan 5 سال پیش
والد
کامیت
816e4dd158
7فایلهای تغییر یافته به همراه151 افزوده شده و 79 حذف شده
  1. BIN
      gwarf
  2. 73 11
      inter/interpreter.c
  3. 2 0
      inter/interpreter.h
  4. 0 0
      inter/tree.c
  5. 4 4
      inter/var.c
  6. 5 1
      paser/gwarf_yacc.y
  7. 67 63
      paser/y.tab.c

+ 73 - 11
inter/interpreter.c

@@ -14,7 +14,10 @@ double sqrt_(double base, double num){  // 定义根号sqrt
 
 bool is_space(GWARF_result *tmp){  // 使用指针是不想复制数据
     if(tmp->u == cycle_break || tmp->u == code_broken || tmp->u == cycle_continue || tmp->u == code_continued || 
-            tmp->u == cycle_restart || tmp->u == code_restarted || tmp->u == return_def || tmp->u == code_rego || tmp->u == code_rewent){
+            tmp->u == cycle_restart || tmp->u == code_restarted || tmp->u == code_rego || tmp->u == code_rewent){
+        return true;
+    }
+    if(tmp->u == return_def && tmp->return_times != 0){  // return def
         return true;
     }
     return false;
@@ -320,6 +323,12 @@ GWARF_result read_statement(statement *the_statement, var_list *the_var, var_lis
             func_tmp->done = the_statement->code.def.done;
             func_tmp->parameter_list = the_statement->code.def.parameter_list;
             func_tmp->the_var = copy_var_list(the_var);
+            if(find_var(func_tmp->the_var, 0,"int") == NULL){
+                puts("NOT FOUND");
+            }
+            else{
+                puts("FOUND");
+            }
             func_tmp->type = customize;  // func by user
             if(login_var != the_var){  // 定义为类方法
                 func_tmp->is_class = 1;
@@ -331,7 +340,34 @@ GWARF_result read_statement(statement *the_statement, var_list *the_var, var_lis
             func_value.value.type = FUNC_value;
             func_value.value.value.func_value = func_tmp;
 
-            assigment_func(the_statement->code.def.name, func_value, login_var, 0);  // 注册函数到指定的位置
+            int from;
+            if(the_statement->code.def.from == NULL){
+                from = 0;
+            }
+            else{
+                GWARF_result tmp_result, tmp_object = traverse(the_statement->code.def.from, the_var, false);
+                if(is_error(&tmp_object)){  // Name Error错误
+                    // puts("STOP:: Name No Found!");
+                    from = 0;
+                }
+                else if(is_space(&tmp_object)){
+                    from = 0;
+                }
+                else{
+                    tmp_result = get__value__(&(tmp_object.value), the_var);  // 从object中提取value
+                    if(tmp_result.value.type == INT_value){
+                        from = tmp_result.value.value.int_value;
+                    }
+                    else if(tmp_result.value.type == NUMBER_value){
+                        from = (int)tmp_result.value.value.double_value;
+                    }
+                    else{
+                        from = 0;
+                    }
+                }
+            }
+            printf("[tag 1]def address = %x\n", login_var);
+            assigment_func(the_statement->code.def.name, func_value, login_var, from);  // 注册函数到指定的位置
             // 无返回值
             break;
         }
@@ -394,7 +430,34 @@ GWARF_result read_statement(statement *the_statement, var_list *the_var, var_lis
                 tmp = tmp->next;
             }
 
-            assigment_func(the_statement->code.set_class.name, class_value, login_var, 0);  // 注册class 的 位置
+            int from;
+            if(the_statement->code.set_class.from == NULL){
+                from = 0;
+            }
+            else{
+                GWARF_result tmp_result, tmp_object = traverse(the_statement->code.set_class.from, the_var, false);
+                if(is_error(&tmp_object)){  // Name Error错误
+                    // puts("STOP:: Name No Found!");
+                    from = 0;
+                }
+                else if(is_space(&tmp_object)){
+                    from = 0;
+                }
+                else{
+                    tmp_result = get__value__(&(tmp_object.value), the_var);  // 从object中提取value
+                    if(tmp_result.value.type == INT_value){
+                        from = tmp_result.value.value.int_value;
+                    }
+                    else if(tmp_result.value.type == NUMBER_value){
+                        from = (int)tmp_result.value.value.double_value;
+                    }
+                    else{
+                        from = 0;
+                    }
+                }
+            }
+
+            assigment_func(the_statement->code.set_class.name, class_value, login_var, from);  // 注册class 的 位置
             puts("----stop set class----");
             // 无返回值
             break;
@@ -1245,10 +1308,9 @@ GWARF_result operation_func(statement *the_statement, var_list *the_var, var_lis
     }
     right_result = traverse((*the_statement).code.operation.right_exp, the_var, false);
     if(is_error(&right_result)){  // Name Error错误
-        // puts("STOP:: Name No Found!");
         return right_result;
     }
-    else if(is_space(&right_result)){
+    else if(right_result.u != return_def && is_space(&right_result)){
         return right_result;
     }
 
@@ -1297,6 +1359,7 @@ GWARF_result operation_func(statement *the_statement, var_list *the_var, var_lis
                     }
                 }
 
+                printf("[tag 3]name = %s, address = %x, from = %d\n", left, login_var, from);
                 value = assigment_func(left, right_result, login_var, from);
             }
             else if((the_statement->code.operation.left_exp)->type == point){  // 通过point赋值
@@ -2444,7 +2507,10 @@ GWARF_result traverse(statement *the_statement, var_list *the_var, bool new){  /
             break;
         }
         // TODO::rewent语句得优化一下 设置result2.is_rewent值
-        if(result2.u == code_rewent){
+        if(result2.u == return_def && result2.return_times != 0){  // return def
+            result2.return_times -= 1;
+        }
+        else if(result2.u == code_rewent){
             lock = true;  // keep the result is rewent for return
             result = result2;
         }
@@ -2490,8 +2556,4 @@ inter *get_inter(){
     tmp->global_var = make_var();
     tmp->global_code = make_statement();
     return tmp;
-}
-
-// TODO::设置func和NULL均为object,设置object无__add___等方法时的操作:: NULL永远只有一个实例, object回调__call__ malloc返回值检查
-// TODO::错误捕捉
-// TODO::使用Var的地方都允许使用层数
+}

+ 2 - 0
inter/interpreter.h

@@ -213,6 +213,7 @@ typedef struct statement{
             char *name;
             parameter *parameter_list;  // def parameter
             struct statement *done;  // def to do
+            struct statement *from;  // from where
         } def;
 
         struct{
@@ -229,6 +230,7 @@ typedef struct statement{
             char *name;  // class name
             struct statement *done;  // class to do
             parameter *father_list;  // 继承
+            struct statement *from;  // from where [double->int]
         } set_class;
 
         struct

+ 0 - 0
inter/tree.c


+ 4 - 4
inter/var.c

@@ -231,14 +231,14 @@ var_list *copy_var_list(var_list *var_list_base){  // 复制一条var链到另
     memcpy(start, var_list_base, sizeof(var_list_base));  // 复制base节点
     tmp = start;  // 记录base节点
     while(1){  // 复制var_list链
-        if((start == NULL) || (start->next == NULL)){
+        if(var_list_base == NULL){  // 已经匹配到了最后一个
             break;
         }
-        puts("F1");
-        var_list *next_tmp = malloc(sizeof(start->next));
-        memcpy(next_tmp, start->next, sizeof(start->next));  // 复制到新的地方
+        var_list *next_tmp = malloc(sizeof(var_list_base));
+        memcpy(next_tmp, var_list_base, sizeof(var_list_base));  // 复制到新的地方
         start->next = next_tmp;  // 应用新的地方
         start = start->next;
+        var_list_base = var_list_base->next;
     }
     return tmp;
 }

+ 5 - 1
paser/gwarf_yacc.y

@@ -775,6 +775,7 @@ class_exp
         statement *class_tmp =  make_statement();
         class_tmp->type = set_class;
 
+        class_tmp->code.set_class.from = $2->code.base_var.from;
         class_tmp->code.set_class.name = malloc(sizeof($2->code.base_var.var_name));
         char *name_tmp = class_tmp->code.set_class.name;
         strcpy(name_tmp, $2->code.base_var.var_name);
@@ -796,6 +797,7 @@ class_exp
         class_tmp->code.set_class.name = malloc(sizeof($2->code.base_var.var_name));
         char *name_tmp = class_tmp->code.set_class.name;
         strcpy(name_tmp, $2->code.base_var.var_name);
+        class_tmp->code.set_class.from = $2->code.base_var.from;
 
         class_tmp->code.set_class.done = make_statement();
         class_tmp->code.set_class.father_list = $4;  // set father
@@ -825,11 +827,12 @@ def_exp
         char *name_tmp = def_tmp->code.def.name;
         strcpy(name_tmp, $2->code.base_var.var_name);
 
+        def_tmp->code.def.from = $2->code.base_var.from;
         def_tmp->code.def.parameter_list = NULL;
         def_tmp->code.def.done = make_statement();
         statement_base = append_statement_list(def_tmp->code.def.done, statement_base);  // new statement_base (FILO)
 
-        free($2->code.base_var.var_name);
+        free($2->code.base_var.var_name);  // 实际上会内存泄露[from没有被释放]
         free($2);
         $$ = def_tmp;
     }
@@ -842,6 +845,7 @@ def_exp
         char *name_tmp = def_tmp->code.def.name;
         strcpy(name_tmp, $2->code.base_var.var_name);
 
+        def_tmp->code.def.from = $2->code.base_var.from;
         def_tmp->code.def.parameter_list = $4;
         def_tmp->code.def.done = make_statement();
         statement_base = append_statement_list(def_tmp->code.def.done, statement_base);  // new statement_base (FILO)

+ 67 - 63
paser/y.tab.c

@@ -650,11 +650,11 @@ static const yytype_int16 yyrline[] =
      415,   427,   444,   456,   457,   465,   478,   485,   494,   508,
      522,   537,   542,   551,   557,   566,   577,   584,   595,   602,
      613,   624,   635,   646,   657,   668,   679,   693,   701,   711,
-     719,   734,   745,   753,   765,   772,   790,   811,   818,   836,
-     856,   862,   869,   873,   881,   885,   890,   898,   905,   909,
-     910,   915,   924,   935,   936,   944,   954,   955,   963,   973,
-     974,   982,   992,   993,  1001,  1011,  1012,  1020,  1030,  1031,
-    1038,  1048,  1049,  1050,  1051
+     719,   734,   745,   753,   765,   772,   791,   813,   820,   839,
+     860,   866,   873,   877,   885,   889,   894,   902,   909,   913,
+     914,   919,   928,   939,   940,   948,   958,   959,   967,   977,
+     978,   986,   996,   997,  1005,  1015,  1016,  1024,  1034,  1035,
+    1042,  1052,  1053,  1054,  1055
 };
 #endif
 
@@ -2634,6 +2634,7 @@ yyreduce:
         statement *class_tmp =  make_statement();
         class_tmp->type = set_class;
 
+        class_tmp->code.set_class.from = (yyvsp[-2].statement_value)->code.base_var.from;
         class_tmp->code.set_class.name = malloc(sizeof((yyvsp[-2].statement_value)->code.base_var.var_name));
         char *name_tmp = class_tmp->code.set_class.name;
         strcpy(name_tmp, (yyvsp[-2].statement_value)->code.base_var.var_name);
@@ -2646,11 +2647,11 @@ yyreduce:
         free((yyvsp[-2].statement_value));
         (yyval.statement_value) = class_tmp;
     }
-#line 2650 "y.tab.c"
+#line 2651 "y.tab.c"
     break;
 
   case 96:
-#line 791 "gwarf_yacc.y"
+#line 792 "gwarf_yacc.y"
     {   
         //无参数方法
         statement *class_tmp =  make_statement();
@@ -2659,6 +2660,7 @@ yyreduce:
         class_tmp->code.set_class.name = malloc(sizeof((yyvsp[-3].statement_value)->code.base_var.var_name));
         char *name_tmp = class_tmp->code.set_class.name;
         strcpy(name_tmp, (yyvsp[-3].statement_value)->code.base_var.var_name);
+        class_tmp->code.set_class.from = (yyvsp[-3].statement_value)->code.base_var.from;
 
         class_tmp->code.set_class.done = make_statement();
         class_tmp->code.set_class.father_list = (yyvsp[-1].parameter_list);  // set father
@@ -2668,19 +2670,19 @@ yyreduce:
         free((yyvsp[-3].statement_value));
         (yyval.statement_value) = class_tmp;
     }
-#line 2672 "y.tab.c"
+#line 2674 "y.tab.c"
     break;
 
   case 97:
-#line 812 "gwarf_yacc.y"
+#line 814 "gwarf_yacc.y"
     {
         statement_base = free_statement_list(statement_base);  // new statement_base (FILO)
     }
-#line 2680 "y.tab.c"
+#line 2682 "y.tab.c"
     break;
 
   case 98:
-#line 819 "gwarf_yacc.y"
+#line 821 "gwarf_yacc.y"
     {   
         //无参数方法
         statement *def_tmp =  make_statement();
@@ -2690,19 +2692,20 @@ yyreduce:
         char *name_tmp = def_tmp->code.def.name;
         strcpy(name_tmp, (yyvsp[-2].statement_value)->code.base_var.var_name);
 
+        def_tmp->code.def.from = (yyvsp[-2].statement_value)->code.base_var.from;
         def_tmp->code.def.parameter_list = NULL;
         def_tmp->code.def.done = make_statement();
         statement_base = append_statement_list(def_tmp->code.def.done, statement_base);  // new statement_base (FILO)
 
-        free((yyvsp[-2].statement_value)->code.base_var.var_name);
+        free((yyvsp[-2].statement_value)->code.base_var.var_name);  // 实际上会内存泄露[from没有被释放]
         free((yyvsp[-2].statement_value));
         (yyval.statement_value) = def_tmp;
     }
-#line 2702 "y.tab.c"
+#line 2705 "y.tab.c"
     break;
 
   case 99:
-#line 837 "gwarf_yacc.y"
+#line 840 "gwarf_yacc.y"
     {   
         statement *def_tmp =  make_statement();
         def_tmp->type = def;
@@ -2711,6 +2714,7 @@ yyreduce:
         char *name_tmp = def_tmp->code.def.name;
         strcpy(name_tmp, (yyvsp[-3].statement_value)->code.base_var.var_name);
 
+        def_tmp->code.def.from = (yyvsp[-3].statement_value)->code.base_var.from;
         def_tmp->code.def.parameter_list = (yyvsp[-1].parameter_list);
         def_tmp->code.def.done = make_statement();
         statement_base = append_statement_list(def_tmp->code.def.done, statement_base);  // new statement_base (FILO)
@@ -2719,100 +2723,100 @@ yyreduce:
         free((yyvsp[-3].statement_value));
         (yyval.statement_value) = def_tmp;
     }
-#line 2723 "y.tab.c"
+#line 2727 "y.tab.c"
     break;
 
   case 100:
-#line 857 "gwarf_yacc.y"
+#line 861 "gwarf_yacc.y"
     {
         (yyval.parameter_list) = make_parameter_name((yyvsp[0].statement_value)->code.base_var.var_name);
         free((yyvsp[0].statement_value)->code.base_var.var_name);
         free((yyvsp[0].statement_value));
     }
-#line 2733 "y.tab.c"
+#line 2737 "y.tab.c"
     break;
 
   case 101:
-#line 863 "gwarf_yacc.y"
+#line 867 "gwarf_yacc.y"
     {
         append_parameter_name((yyvsp[0].statement_value)->code.base_var.var_name, (yyvsp[-2].parameter_list));
         (yyval.parameter_list) = (yyvsp[-2].parameter_list);
     }
-#line 2742 "y.tab.c"
+#line 2746 "y.tab.c"
     break;
 
   case 102:
-#line 870 "gwarf_yacc.y"
+#line 874 "gwarf_yacc.y"
     {
         (yyval.parameter_list) = make_parameter_value((yyvsp[0].statement_value));
     }
-#line 2750 "y.tab.c"
+#line 2754 "y.tab.c"
     break;
 
   case 103:
-#line 874 "gwarf_yacc.y"
+#line 878 "gwarf_yacc.y"
     {
         append_parameter_value((yyvsp[0].statement_value), (yyvsp[-2].parameter_list));
         (yyval.parameter_list) = (yyvsp[-2].parameter_list);
     }
-#line 2759 "y.tab.c"
+#line 2763 "y.tab.c"
     break;
 
   case 104:
-#line 882 "gwarf_yacc.y"
+#line 886 "gwarf_yacc.y"
     {
         (yyval.parameter_list) = make_parameter_value((yyvsp[0].statement_value));
     }
-#line 2767 "y.tab.c"
+#line 2771 "y.tab.c"
     break;
 
   case 105:
-#line 886 "gwarf_yacc.y"
+#line 890 "gwarf_yacc.y"
     {
         append_parameter_value((yyvsp[0].statement_value), (yyvsp[-1].parameter_list));
         (yyval.parameter_list) = (yyvsp[-1].parameter_list);
     }
-#line 2776 "y.tab.c"
+#line 2780 "y.tab.c"
     break;
 
   case 106:
-#line 891 "gwarf_yacc.y"
+#line 895 "gwarf_yacc.y"
     {
         append_parameter_value((yyvsp[0].statement_value), (yyvsp[-1].parameter_list));
         (yyval.parameter_list) = (yyvsp[-1].parameter_list);
     }
-#line 2785 "y.tab.c"
+#line 2789 "y.tab.c"
     break;
 
   case 107:
-#line 899 "gwarf_yacc.y"
+#line 903 "gwarf_yacc.y"
     {
         (yyval.statement_value) = (yyvsp[-1].statement_value);
     }
-#line 2793 "y.tab.c"
+#line 2797 "y.tab.c"
     break;
 
   case 110:
-#line 911 "gwarf_yacc.y"
+#line 915 "gwarf_yacc.y"
     {
         (yyvsp[-1].statement_value)->code.return_code.value = (yyvsp[0].statement_value);
         (yyval.statement_value) = (yyvsp[-1].statement_value);
     }
-#line 2802 "y.tab.c"
+#line 2806 "y.tab.c"
     break;
 
   case 111:
-#line 916 "gwarf_yacc.y"
+#line 920 "gwarf_yacc.y"
     {
         (yyvsp[-2].statement_value)->code.return_code.value = (yyvsp[-1].statement_value);
         (yyvsp[-2].statement_value)->code.return_code.times = (yyvsp[0].statement_value);
         (yyval.statement_value) = (yyvsp[-2].statement_value);
     }
-#line 2812 "y.tab.c"
+#line 2816 "y.tab.c"
     break;
 
   case 112:
-#line 925 "gwarf_yacc.y"
+#line 929 "gwarf_yacc.y"
     {
         statement *code_tmp =  make_statement();
         code_tmp->type = return_code;
@@ -2820,131 +2824,131 @@ yyreduce:
         code_tmp->code.return_code.value = NULL;
         (yyval.statement_value) = code_tmp;
     }
-#line 2824 "y.tab.c"
+#line 2828 "y.tab.c"
     break;
 
   case 114:
-#line 937 "gwarf_yacc.y"
+#line 941 "gwarf_yacc.y"
     {
         (yyvsp[-1].statement_value)->code.restarted.times = (yyvsp[0].statement_value);
         (yyval.statement_value) = (yyvsp[-1].statement_value);
     }
-#line 2833 "y.tab.c"
+#line 2837 "y.tab.c"
     break;
 
   case 115:
-#line 945 "gwarf_yacc.y"
+#line 949 "gwarf_yacc.y"
     {
         statement *code_tmp =  make_statement();
         code_tmp->type = restarted;
         code_tmp->code.restarted.times = NULL;
         (yyval.statement_value) = code_tmp;
     }
-#line 2844 "y.tab.c"
+#line 2848 "y.tab.c"
     break;
 
   case 117:
-#line 956 "gwarf_yacc.y"
+#line 960 "gwarf_yacc.y"
     {
         (yyvsp[-1].statement_value)->code.restart.times = (yyvsp[0].statement_value);
         (yyval.statement_value) = (yyvsp[-1].statement_value);
     }
-#line 2853 "y.tab.c"
+#line 2857 "y.tab.c"
     break;
 
   case 118:
-#line 964 "gwarf_yacc.y"
+#line 968 "gwarf_yacc.y"
     {
         statement *code_tmp =  make_statement();
         code_tmp->type = restart;
         code_tmp->code.restart.times = NULL;
         (yyval.statement_value) = code_tmp;
     }
-#line 2864 "y.tab.c"
+#line 2868 "y.tab.c"
     break;
 
   case 120:
-#line 975 "gwarf_yacc.y"
+#line 979 "gwarf_yacc.y"
     {
         (yyvsp[-1].statement_value)->code.continued.times = (yyvsp[0].statement_value);
         (yyval.statement_value) = (yyvsp[-1].statement_value);
     }
-#line 2873 "y.tab.c"
+#line 2877 "y.tab.c"
     break;
 
   case 121:
-#line 983 "gwarf_yacc.y"
+#line 987 "gwarf_yacc.y"
     {
         statement *code_tmp =  make_statement();
         code_tmp->type = continued;
         code_tmp->code.continued.times = NULL;
         (yyval.statement_value) = code_tmp;
     }
-#line 2884 "y.tab.c"
+#line 2888 "y.tab.c"
     break;
 
   case 123:
-#line 994 "gwarf_yacc.y"
+#line 998 "gwarf_yacc.y"
     {
         (yyvsp[-1].statement_value)->code.continue_cycle.times = (yyvsp[0].statement_value);
         (yyval.statement_value) = (yyvsp[-1].statement_value);
     }
-#line 2893 "y.tab.c"
+#line 2897 "y.tab.c"
     break;
 
   case 124:
-#line 1002 "gwarf_yacc.y"
+#line 1006 "gwarf_yacc.y"
     {
         statement *code_tmp =  make_statement();
         code_tmp->type = continue_cycle;
         code_tmp->code.continue_cycle.times = NULL;
         (yyval.statement_value) = code_tmp;
     }
-#line 2904 "y.tab.c"
+#line 2908 "y.tab.c"
     break;
 
   case 126:
-#line 1013 "gwarf_yacc.y"
+#line 1017 "gwarf_yacc.y"
     {
         (yyvsp[-1].statement_value)->code.break_cycle.times = (yyvsp[0].statement_value);
         (yyval.statement_value) = (yyvsp[-1].statement_value);
     }
-#line 2913 "y.tab.c"
+#line 2917 "y.tab.c"
     break;
 
   case 127:
-#line 1021 "gwarf_yacc.y"
+#line 1025 "gwarf_yacc.y"
     {
         statement *code_tmp =  make_statement();
         code_tmp->type = break_cycle;
         code_tmp->code.break_cycle.times = NULL;
         (yyval.statement_value) = code_tmp;
     }
-#line 2924 "y.tab.c"
+#line 2928 "y.tab.c"
     break;
 
   case 129:
-#line 1032 "gwarf_yacc.y"
+#line 1036 "gwarf_yacc.y"
     {
         (yyvsp[-1].statement_value)->code.broken.times = (yyvsp[0].statement_value);
         (yyval.statement_value) = (yyvsp[-1].statement_value);
     }
-#line 2933 "y.tab.c"
+#line 2937 "y.tab.c"
     break;
 
   case 130:
-#line 1039 "gwarf_yacc.y"
+#line 1043 "gwarf_yacc.y"
     {
         statement *code_tmp =  make_statement();
         code_tmp->type = broken;
         code_tmp->code.broken.times = NULL;
         (yyval.statement_value) = code_tmp;
     }
-#line 2944 "y.tab.c"
+#line 2948 "y.tab.c"
     break;
 
 
-#line 2948 "y.tab.c"
+#line 2952 "y.tab.c"
 
       default: break;
     }
@@ -3176,7 +3180,7 @@ yyreturn:
 #endif
   return yyresult;
 }
-#line 1054 "gwarf_yacc.y"
+#line 1058 "gwarf_yacc.y"
 
 int yyerror(char const *str)
 {