SongZihuan 5 лет назад
Родитель
Сommit
231f5fbda0
7 измененных файлов с 973 добавлено и 803 удалено
  1. BIN
      gwarf
  2. 107 37
      inter/cfunc.c
  3. 42 3
      inter/interpreter.c
  4. 6 1
      inter/interpreter.h
  5. 31 2
      paser/gwarf_yacc.y
  6. 377 372
      paser/y.output
  7. 410 388
      paser/y.tab.c

+ 107 - 37
inter/cfunc.c

@@ -1511,16 +1511,14 @@ GWARF_value to_str_dict(GWARF_value value, var_list *the_var){
 
     if((value.type == STRING_value)){
         size_t size = (size_t)(5 + strlen(value.value.string));
-        return_number.value.string = (char *)malloc(size);
+        return_number.value.string = calloc(sizeof(char), size);
         snprintf(return_number.value.string, size, "str_%s", value.value.string);
-        goto return_value;
     }
-
-    if(value.type == OBJECT_value){  // 调用__value__方法
+    else if(value.type == OBJECT_value){  // 调用__value__方法
         GWARF_value tmp_str = to_str_dict(get__value__(&value, the_var).value, the_var);  // 递归
-        size_t size = (size_t)(20 + strlen(tmp_str.value.string));
-        return_number.value.string = (char *)malloc(size);
-        snprintf(return_number.value.string, size, "object_%s", tmp_str.value.string);
+        size_t size = strlen(tmp_str.value.string) + 2;
+        return_number.value.string = calloc(sizeof(char), size);
+        snprintf(return_number.value.string, size, "%s", tmp_str.value.string);
     }
     else{
         if(value.type == BOOL_value){
@@ -1533,32 +1531,86 @@ GWARF_value to_str_dict(GWARF_value value, var_list *the_var){
         }
         else if(value.type == INT_value){
             size_t size = (size_t)(6 + len_int(value.value.int_value));
-            return_number.value.string = (char *)malloc(size);
+            return_number.value.string = calloc(sizeof(char), size);
             snprintf(return_number.value.string, size, "int_%d", value.value.int_value);
         }
         else if(value.type == NUMBER_value){
             size_t size = (size_t)(10 + len_double(value.value.double_value));
-            return_number.value.string = (char *)malloc(size);
+            return_number.value.string = calloc(sizeof(char), size);
             snprintf(return_number.value.string, size, "double_%f", value.value.double_value);
         }
-        else if(value.type == NULL_value){
-            return_number.value.string = "none_<-None->";
-        }
         else if(value.type == FUNC_value){
             size_t size = (size_t)(29 + len_intx((unsigned long int)value.value.func_value));  // 转换为无符号整形数字
-            return_number.value.string = (char *)malloc(size);
-            snprintf(return_number.value.string, size, "function_<-function on %u->", value.value.func_value);
+            return_number.value.string = calloc(sizeof(char), size);
+            snprintf(return_number.value.string, size, "str_<-function on %u->", value.value.func_value);
         }
         else if(value.type == CLASS_value){
             size_t size = (size_t)(22 + len_intx((unsigned long int)value.value.class_value));
-            return_number.value.string = (char *)malloc(size);
-            snprintf(return_number.value.string, size, "class_<-class on %u->", value.value.class_value);
+            return_number.value.string = calloc(sizeof(char), size);
+            snprintf(return_number.value.string, size, "str_<-class on %u->", value.value.class_value);
         }
         else{
-            return_number.value.string = "other_other";
+            return_number.value.string = "none_<-None->";
         }
     }
-    return_value: return return_number;
+    return_value: 
+    return return_number;
+}
+
+bool start_with(char *str, char *start){
+   int a = strlen(str),b = strlen(start);
+   if(a <= b){ // 长度相等也不用检查
+      return false;
+   }
+   else{
+      for(int i = 0;i < b; i += 1){
+         if(str[i] != start[i]){
+            return false;
+         }
+      }
+   }
+   return true;
+}
+
+char *del_start(char *str, char *start){
+   int a = strlen(str),b = strlen(start);
+   if(a <= b){ // 长度相等也不用检查
+      return NULL;
+   }
+   else{
+      char *new = (char *)calloc(sizeof(char) ,a - b + 1);  // 预留一个空位
+      strncpy(new, str+b, (a - b));
+      return new;
+   }
+}
+
+GWARF_value key_to_str(char *key){  // 复原key
+    GWARF_value return_value;
+    if(start_with(key, "str_")){
+        return_value.type = STRING_value;
+        return_value.value.string = del_start(key, "str_");
+    }
+    else if(start_with(key, "int_")){
+        return_value.type = INT_value;
+        return_value.value.int_value = atoi(del_start(key, "int_"));
+    }
+    else if(start_with(key, "double_")){
+        return_value.type = NUMBER_value;
+        return_value.value.double_value = atof(del_start(key, "double_"));
+    }
+    else if(!strcmp(key, "bool_true")){
+        return_value.type = BOOL_value;
+        return_value.value.bool_value = true;
+    }
+    else if(!strcmp(key, "bool_false")){
+        return_value.type = BOOL_value;
+        return_value.value.bool_value = false;
+    }
+    else{
+        return_value.type = NULL_value;
+        return_value.value.int_value = 0;
+    }
+    return return_value;
 }
 
 class_object *bool_login_official(var_list *the_var, GWARF_result (*paser)(func *, parameter *, var_list *, GWARF_result, var_list *), var_list *father_var_list){
@@ -1718,7 +1770,7 @@ GWARF_result list_official_func(func *the_func, parameter *tmp_s, var_list *the_
                 assignment_func("value", tmp_result, login_var, 0);  // 注册到self
                 return_value.u = statement_end;  // __init__没有return
             }
-            else{
+            else if(tmp_s->next == NULL){  // 只有一个参数
                 GWARF_result tmp, tmp_result = traverse(tmp_s->u.value, out_var, false);
                 if(is_error(&tmp_result)){  // Name Error错误
                     return_value = tmp_result;
@@ -1732,6 +1784,15 @@ GWARF_result list_official_func(func *the_func, parameter *tmp_s, var_list *the_
                 assignment_func("value", tmp, login_var, 0);  // 注册到self
                 return_value.u = statement_end;  // __init__没有return
             }
+            else{
+                GWARF_result tmp_result;
+                GWARF_value list_tmp;
+                list_tmp.type = LIST_value;
+                list_tmp.value.list_value = parameter_to_list(tmp_s, out_var).value.list_value;
+                tmp_result.value = list_tmp;
+                assignment_func("value", tmp_result, login_var, 0);  // 注册到self
+                return_value.u = statement_end;  // __init__没有return
+            }
             GWARF_result iter_value;
             iter_value.value.type = INT_value;
             iter_value.value.value.int_value = 0;
@@ -1977,12 +2038,12 @@ GWARF_value parameter_to_dict(parameter *tmp_s, var_list *the_var){  // 把param
 
     int index = 0;
     GWARF_result result_tmp;
+    var_list *tmp_var_list = make_var_base(return_dict.value.dict_value->dict_value);
     while(1){
         if(tmp_s == NULL){
             break;
         }
         if(tmp_s->type != name_value){
-            printf("tmp_s->type = %d\n", tmp_s->type);
             goto next;  // 跳过这一个
         }
         result_tmp = traverse(tmp_s->u.value, the_var, false);  // 不需要取__value__
@@ -1993,9 +2054,16 @@ GWARF_value parameter_to_dict(parameter *tmp_s, var_list *the_var){  // 把param
             goto next;
         }
 
-        GWARF_result key_tmp = traverse(tmp_s->u.var, the_var, 0);
-        char *key = to_str_dict(key_tmp.value, the_var).value.string;
-
+        char *key;
+        if(tmp_s->u.var->type == base_var){
+            size_t size = (size_t)(13 + strlen(tmp_s->u.var->code.base_var.var_name));
+            key = (char *)malloc(size);
+            snprintf(key, size, "str_%s", tmp_s->u.var->code.base_var.var_name);
+        }
+        else{
+            GWARF_result key_tmp = traverse(tmp_s->u.var, the_var, 0);
+            key = to_str_dict(key_tmp.value, the_var).value.string;
+        }
         login_node(key, result_tmp.value, return_dict.value.dict_value->dict_value);  // 插入
         dict_key *tmp_dict_name = return_dict.value.dict_value->name_list;
         while (1){  // 迭代
@@ -2005,7 +2073,7 @@ GWARF_value parameter_to_dict(parameter *tmp_s, var_list *the_var){  // 把param
             else if(tmp_dict_name->next == NULL){
                 tmp_dict_name->next = malloc(sizeof(dict_key));
                 tmp_dict_name->next->next = NULL;
-                tmp_dict_name->next->key = malloc(sizeof(key));
+                tmp_dict_name->next->key = malloc(strlen(key));
                 strcpy(tmp_dict_name->next->key, key);  // 复制key
                 index += 1;  // 不存在才+1
                 break;
@@ -2072,7 +2140,7 @@ GWARF_result dict_official_func(func *the_func, parameter *tmp_s, var_list *the_
                 assignment_func("value", tmp_result, login_var, 0);  // 注册到self
                 return_value.u = statement_end;  // __init__没有return
             }
-            else{
+            else if(tmp_s->next == NULL){  // 只有一个参数
                 GWARF_result tmp, tmp_result = traverse(tmp_s->u.value, out_var, false);
                 if(is_error(&tmp_result)){  // Name Error错误
                     return_value = tmp_result;
@@ -2086,6 +2154,15 @@ GWARF_result dict_official_func(func *the_func, parameter *tmp_s, var_list *the_
                 assignment_func("value", tmp, login_var, 0);  // 注册到self
                 return_value.u = statement_end;  // __init__没有return
             }
+            else{  // 有多个实参
+                GWARF_result tmp_result;
+                GWARF_value dict_tmp;
+                dict_tmp.type = DICT_value;
+                dict_tmp.value.dict_value = parameter_to_dict(tmp_s, out_var).value.dict_value;
+                tmp_result.value = dict_tmp;
+                assignment_func("value", tmp_result, login_var, 0);  // 注册到self
+                return_value.u = statement_end;  // __init__没有return
+            }
 
             GWARF_result iter_value;
             iter_value.value.type = INT_value;
@@ -2133,18 +2210,11 @@ GWARF_result dict_official_func(func *the_func, parameter *tmp_s, var_list *the_
                     tmp_dict_key = tmp_dict_key->next;
                 }
 
-                var *find_var = find_node(tmp_dict_key->key, tmp->value.value.dict_value->dict_value);
-                if(find_var == NULL){  // not found
-                    printf("key = '%s'\n", tmp_dict_key->key);
-                    return_value = to_error("Dict key Not Found", "NameException", out_var);
-                }
-                else{
-                    return_value.value = find_var->value;
-                    GWARF_result iter_value;
-                    iter_value.value.type = INT_value;
-                    iter_value.value.value.int_value = iter_index + 1;
-                    assignment_func("iter_value", iter_value, login_var, 0);  // 注册到self
-                }
+                GWARF_result iter_value;
+                iter_value.value.type = INT_value;
+                iter_value.value.value.int_value = iter_index + 1;
+                assignment_func("iter_value", iter_value, login_var, 0);  // 注册到self
+                return_value.value = key_to_str(tmp_dict_key->key);
             }
 
             next_break: break;

+ 42 - 3
inter/interpreter.c

@@ -1658,6 +1658,9 @@ GWARF_result assignment_statement(statement *the_statement, var_list *the_var, v
     value.u = statement_end;
     value.value.type = NULL_value;
     value.value.value.int_value = 0;
+    if(the_statement->type != base_var && the_statement->type != point && the_statement->type != down){
+        goto the_else;  // 非法的赋值语句
+    }
     if(right_result.value.type == OBJECT_value || right_result.value.type == CLASS_value){
         right_result = get__assignment__(&(right_result.value), the_var);
         if(is_error(&right_result)){  // Name Error错误
@@ -1780,7 +1783,8 @@ GWARF_result assignment_statement(statement *the_statement, var_list *the_var, v
         }
     }
     else{ 
-        the_else: puts("Bad Assignment");
+        the_else: value = to_error("Bad Assignment", "__AssignmentException__", the_var);
+        puts("Bad Assignment");
     }
     return value;
 }
@@ -1884,8 +1888,43 @@ GWARF_result login_var(var_list *the_var, var_list *old_var_list, parameter *tmp
         else if(is_space(&tmp)){
             return tmp;
         }
+        if(tmp_s->type == put_kwargs){  // 实参出现**kwargs
+            parameter *before = tmp_s, *after = tmp_s->next;
+            GWARF_value iter_value = get__iter__(&(tmp.value), old_var_list).value;  // 获取迭代object,一般是返回self
+            while (1){
+                GWARF_result tmp_next = get__next__(&(iter_value), old_var_list), tmp_next_down;// 执行__next__的返回值
+                if(is_error(&tmp_next)){  // TODO:: 检查是否为IterException
+                    break;  // goto return_value;
+                }
+                if(is_space(&tmp_next)){  // TODO:: 检查是否为IterException
+                    return tmp_next;
+                }
+
+                GWARF_result get;
+                GWARF_value base_the_var = tmp.value;  // 只有一个参数
+                var_list *call_var = base_the_var.value.object_value->the_var;
 
-        if(assignment_type == 1 || tmp_s->type == name_value){
+                var *__down__tmp = find_var(call_var, 0, "__down__");
+                if(__down__tmp != NULL){
+                    get.value = __down__tmp->value;
+                    get.father = &base_the_var;  // 设置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, old_var_list).value.string;
+                before->next->u.var->code.base_var.from = NULL;
+                before->next->type = name_value;
+                before = before->next;
+            }
+            before->next = after;
+            tmp_s = tmp_s->next;  // 实参去下一位, 形参不变
+
+            assignment_type = 1;
+        }
+        else if(assignment_type == 1 || tmp_s->type == name_value){
             if(tmp_s->type != name_value){
                 printf("Warning!!!");  // 进入了模式1, 但不是name_value
                 break;
@@ -1911,7 +1950,7 @@ GWARF_result login_var(var_list *the_var, var_list *old_var_list, parameter *tmp
             before->next = after;
             tmp_s = tmp_s->next;  // 实参去下一位, 形参不变
         }
-        else if(assignment_type == 0 && tmp_x->type == put_args){
+        else if(assignment_type == 0 && tmp_x->type == put_args){  // 形参出现了*args,收归所有无默认值的实参
             // 放入list中
             GWARF_result list_tmp;
             list_tmp.value = to_object(parameter_to_list(tmp_s, old_var_list), old_var_list);

+ 6 - 1
inter/interpreter.h

@@ -57,7 +57,7 @@ typedef struct parameter{
         only_value,  // 实参
         name_value,  // 形参/实参
         put_args,
-        // put_kwargs,
+        put_kwargs,
         // get_args,
         // get_kwargs,
     } type;
@@ -541,6 +541,11 @@ GWARF_value to_list(GWARF_value value, var_list *the_var);
 GWARF_value to_dict(GWARF_value value, var_list *the_var);
 GWARF_value parameter_to_list(parameter *tmp_s, var_list *the_var);
 GWARF_value parameter_to_dict(parameter *tmp_s, var_list *the_var);
+
+bool start_with(char *, char *);
+char *del_start(char *, char *);
+GWARF_value key_to_str(char *);
+
 bool to_bool(GWARF_value);
 
 GWARF_result get__value__(GWARF_value *, var_list *);

+ 31 - 2
paser/gwarf_yacc.y

@@ -299,6 +299,11 @@ formal_parameter
         $$ = make_parameter_name($2);
         $$->type = put_args;
     }
+    | POW top_exp
+    {
+        $$ = make_parameter_name($2);
+        $$->type = put_kwargs;
+    }
     | top_exp EQ top_exp
     {
         $$ = make_parameter_name($1);
@@ -317,6 +322,12 @@ formal_parameter
         tmp->type = put_args;
         $$ = $1;
     }
+    | formal_parameter COMMA POW top_exp
+    {
+        parameter *tmp = append_parameter_name($4, $1);
+        tmp->type = put_kwargs;
+        $$ = $1;
+    }
     | formal_parameter COMMA top_exp EQ top_exp
     {
         parameter *tmp = append_parameter_name($3, $1);
@@ -343,6 +354,7 @@ arguments
         $$ = make_parameter_name($1);
         $$->u.value = $3;
         $$->type = name_value;
+        puts("SSSS");
     }
     | arguments COMMA base_var_ EQ top_exp
     {
@@ -356,6 +368,23 @@ arguments
         $$ = make_parameter_value($2);
         $$->type = put_args;
     }
+    | arguments COMMA MUL top_exp
+    {
+        parameter *tmp = append_parameter_value($4, $1);
+        tmp->type = put_args;
+        $$ = $1;
+    }
+    | POW top_exp
+    {
+        $$ = make_parameter_value($2);
+        $$->type = put_kwargs;
+    }
+    | arguments COMMA POW top_exp
+    {
+        parameter *tmp = append_parameter_value($4, $1);
+        tmp->type = put_kwargs;
+        $$ = $1;
+    }
     ;
 
 slice_arguments
@@ -821,13 +850,13 @@ list_arguments
     ;
 
 dict_arguments
-    : element EQ element
+    : element COLON element
     {
         $$ = make_parameter_name($1);
         $$->u.value = $3;
         $$->type = name_value;
     }
-    | dict_arguments COMMA element EQ element
+    | dict_arguments COMMA element COLON element
     {
         parameter *tmp = append_parameter_name($3, $1);
         tmp->u.value = $5;

Разница между файлами не показана из-за своего большого размера
+ 377 - 372
paser/y.output


Разница между файлами не показана из-за своего большого размера
+ 410 - 388
paser/y.tab.c


Некоторые файлы не были показаны из-за большого количества измененных файлов