Browse Source

修复了list和dict解包的bug

SongZihuan 5 năm trước cách đây
mục cha
commit
e1d4dcf892
6 tập tin đã thay đổi với 783 bổ sung677 xóa
  1. BIN
      gwarf
  2. 50 4
      inter/cfunc.c
  3. 4 2
      inter/interpreter.c
  4. 26 1
      paser/gwarf_yacc.y
  5. 297 291
      paser/y.output
  6. 406 379
      paser/y.tab.c

BIN
gwarf


+ 50 - 4
inter/cfunc.c

@@ -2023,16 +2023,31 @@ GWARF_value parameter_to_list(parameter *tmp_s, var_list *the_var){  // 把param
         if(tmp_s == NULL){
             break;
         }
+        if(tmp_s->type == put_args){  // 解包
+            parameter *before = tmp_s, *after = tmp_s->next;
+
+            GWARF_result tmp = traverse(tmp_s->u.value, the_var, false);  // 不会和下面发生重复计算
+            GWARF_value iter_value = get__iter__(&(tmp.value), the_var).value;
+            while (1){
+                GWARF_result tmp_next = get__next__(&(iter_value), the_var);
+                if(is_error(&tmp_next) || is_space(&tmp_next)){  // TODO:: 检查是否为IterException
+                    break;
+                }
+                before->next = pack_value_parameter(tmp_next.value);
+                before = before->next;
+            }
+            before->next = after;
+            // 此处不需要“tmp_s = tmp_s->next;”  goto next已经包含
+            goto next;
+        }
         if(tmp_s->type != only_value){
             goto next;  // 跳过这一个
         }
+        
         result_tmp = traverse(tmp_s->u.value, the_var, false);  // 不需要取__value__
-        if(is_error(&result_tmp)){  // Name Error错误
+        if(is_error(&result_tmp) || is_space(&result_tmp)){  // Name Error错误
             goto next;  // 直接指向下一个
         }
-        else if(is_space(&result_tmp)){
-            goto next;
-        }
         index += 1;
         return_list.value.list_value->list_value = realloc(return_list.value.list_value->list_value, sizeof(GWARF_value) * index);  // 申请新空间
         return_list.value.list_value->list_value[index - 1] = result_tmp.value;  // 保存value
@@ -2059,6 +2074,37 @@ GWARF_value parameter_to_dict(parameter *tmp_s, var_list *the_var){  // 把param
         if(tmp_s == NULL){
             break;
         }
+        if(tmp_s->type == put_kwargs){
+            parameter *before = tmp_s, *after = tmp_s->next;
+            GWARF_result get, tmp = traverse(tmp_s->u.value, the_var, false);  // 不会和下面发生重复计算
+            GWARF_value iter_value = get__iter__(&(tmp.value), the_var).value;  // 获取迭代object,一般是返回self
+            while (1){
+                GWARF_result tmp_next = get__next__(&(iter_value), the_var), tmp_next_down;// 执行__next__的返回值
+                if(is_error(&tmp_next) || is_space(&tmp_next)){  // TODO:: 检查是否为IterException
+                    goto next;  // goto return_value;
+                }
+
+                GWARF_result get;  // 不会和下面发生重复计算
+                var_list *call_var = tmp.value.value.object_value->the_var;
+
+                var *__down__tmp = find_var(call_var, 0, "__down__");
+                if(__down__tmp != NULL){
+                    get.value = __down__tmp->value;
+                    get.father = &(tmp.value);  // 设置father
+                    tmp_next_down = call_back_core(get, the_var, pack_value_parameter(tmp_next.value));
+                }
+
+                before->next = pack_value_parameter(tmp_next_down.value);
+                before->next->u.var = make_statement();
+                before->next->u.var->type = base_var;
+                before->next->u.var->code.base_var.var_name = to_str(tmp_next.value, the_var).value.string;
+                before->next->u.var->code.base_var.from = NULL;
+                before->next->type = name_value;
+                before = before->next;
+            }
+            before->next = after;
+            goto next;  // 跳过这一个
+        }
         if(tmp_s->type != name_value){
             goto next;  // 跳过这一个
         }

+ 4 - 2
inter/interpreter.c

@@ -1978,7 +1978,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("Warning!!!");  // 进入了模式1, 但不是name_value 
+                printf("[%d]::Warning!!!\n", tmp_s->type);  // 进入了模式1, 但不是name_value 
                 break;
             }
             assignment_type = 1;
@@ -1986,6 +1986,7 @@ 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_value iter_value = get__iter__(&(tmp.value), old_var_list).value;  // 获取迭代object,一般是返回self
             while (1){
@@ -2013,9 +2014,10 @@ GWARF_result login_var(var_list *the_var, var_list *old_var_list, parameter *tmp
                 if(tmp_s == NULL){
                     break;
                 }
-                if(tmp_s->type != only_value){
+                if(tmp_s->type != only_value && tmp_s->type != put_args){
                     break;
                 }
+                puts("GO");
                 tmp_s = tmp_s->next;  // tmp_s迭代到only_value的最后一个
             }
         }

+ 26 - 1
paser/gwarf_yacc.y

@@ -326,7 +326,6 @@ formal_parameter
     {
         parameter *tmp = append_parameter_name($4, $1);
         tmp->type = put_kwargs;
-        puts("WSSDD");
         $$ = $1;
     }
     | formal_parameter COMMA top_exp EQ top_exp
@@ -354,6 +353,7 @@ arguments
     {
         $$ = make_parameter_name($1);
         $$->u.value = $3;
+        puts("SW");
         $$->type = name_value;
     }
     | arguments COMMA base_var_ EQ top_exp
@@ -361,6 +361,7 @@ arguments
         parameter *tmp = append_parameter_name($3, $1);
         tmp->u.value = $5;
         tmp->type = name_value;
+        puts("SW");
         $$ = $1;
     }
     | MUL top_exp
@@ -378,11 +379,13 @@ arguments
     {
         $$ = make_parameter_value($2);
         $$->type = put_kwargs;
+        puts("SW");
     }
     | arguments COMMA POW top_exp
     {
         parameter *tmp = append_parameter_value($4, $1);
         tmp->type = put_kwargs;
+        puts("SW");
         $$ = $1;
     }
     ;
@@ -847,6 +850,17 @@ list_arguments
         tmp->type = only_value;
         $$ = $1;
     }
+    | MUL top_exp
+    {
+        $$ = make_parameter_value($2);
+        $$->type = put_args;
+    }
+    | list_arguments COMMA MUL top_exp
+    {
+        parameter *tmp = append_parameter_value($4, $1);
+        tmp->type = put_args;
+        $$ = $1;
+    }
     ;
 
 dict_arguments
@@ -863,6 +877,17 @@ dict_arguments
         tmp->type = name_value;
         $$ = $1;
     }
+    | POW top_exp
+    {
+        $$ = make_parameter_value($2);
+        $$->type = put_kwargs;
+    }
+    | dict_arguments COMMA POW top_exp
+    {
+        parameter *tmp = append_parameter_value($4, $1);
+        tmp->type = put_kwargs;
+        $$ = $1;
+    }
     ;
 
 element

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 297 - 291
paser/y.output


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 406 - 379
paser/y.tab.c


Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác