Kaynağa Gözat

修复了bug和优化了yacc

SongZihuan 5 yıl önce
ebeveyn
işleme
9658a58cb9
8 değiştirilmiş dosya ile 956 ekleme ve 1061 silme
  1. BIN
      gwarf
  2. 12 1
      inter/cfunc.c
  3. 13 9
      inter/interpreter.c
  4. 8 4
      inter/interpreter.h
  5. 1 1
      inter/parameter.c
  6. 54 139
      paser/gwarf_yacc.y
  7. 431 453
      paser/y.output
  8. 437 454
      paser/y.tab.c

+ 12 - 1
inter/cfunc.c

@@ -2084,11 +2084,13 @@ 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);
+    puts("[tag 2]");
     while(1){
         if(tmp_s == NULL){
             break;
         }
         if(tmp_s->type == put_kwargs){
+            puts("[tag 3]");
             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
@@ -2119,7 +2121,9 @@ GWARF_value parameter_to_dict(parameter *tmp_s, var_list *the_var){  // 把param
             before->next = after;
             goto next;  // 跳过这一个
         }
+        puts("[tag 7]");
         if(tmp_s->type != name_value){
+            puts("[tag 4]");
             goto next;  // 跳过这一个
         }
         result_tmp = traverse(tmp_s->u.value, the_var, false);  // 不需要取__value__
@@ -2129,18 +2133,24 @@ GWARF_value parameter_to_dict(parameter *tmp_s, var_list *the_var){  // 把param
         else if(is_space(&result_tmp)){
             goto next;
         }
-
         char *key;
         if(tmp_s->u.var->type == base_var){
+            puts("[tag 11.2]");
             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);
+            puts("[tag 8.1]");
         }
         else{
+            puts("[tag 10.2]");
             GWARF_result key_tmp = traverse(tmp_s->u.var, the_var, 0);
             key = to_str_dict(key_tmp.value, the_var).value.string;
+            puts("[tag 8.2]");
         }
+        puts("[tag 9]");
+        printf("result_tmp.value.type = %d\n",result_tmp.value.type);
         login_node(key, result_tmp.value, return_dict.value.dict_value->dict_value);  // 插入
+        printf("NEW KEY = %s, type = %d\n", key, result_tmp.value.type);
         dict_key *tmp_dict_name = return_dict.value.dict_value->name_list;
         while (1){  // 迭代
             if(!strcmp(tmp_dict_name->key, key)){  // 已经存在
@@ -2159,6 +2169,7 @@ GWARF_value parameter_to_dict(parameter *tmp_s, var_list *the_var){  // 把param
         next: tmp_s = tmp_s->next;  // 指向下一个
     }
     return_dict.value.dict_value->index = index;
+    puts("[tag 8]");
     return return_dict;
 }
 

+ 13 - 9
inter/interpreter.c

@@ -59,9 +59,9 @@ bool to_bool(GWARF_value value){
 }
 
 
-GWARF_result read_statement(statement *the_statement, var_list *the_var, var_list *login_var){  // read the statement list with case to run by func
-    if(login_var == NULL){
-        login_var = the_var;
+GWARF_result read_statement(statement *the_statement, var_list *the_var, var_list *the_login_var){  // read the statement list with case to run by func
+    if(the_login_var == NULL){
+        the_login_var = the_var;
     }
     GWARF_result return_value;
     return_value.u = statement_end;  // 正常设置[正常语句结束]
@@ -71,7 +71,7 @@ GWARF_result read_statement(statement *the_statement, var_list *the_var, var_lis
     {
         case operation:  // 表达式运算
             puts("----code----");
-            return_value = operation_func(the_statement, the_var, login_var);
+            return_value = operation_func(the_statement, the_var, the_login_var);
             if((return_value.value.type == INT_value)){
                 printf("operation value = %d\n", return_value.value.value.int_value);
             }
@@ -157,6 +157,9 @@ GWARF_result read_statement(statement *the_statement, var_list *the_var, var_lis
                 return_value.value.value.int_value = 0;
             }
             break;
+        case pack_eq:
+            login_var(the_login_var, the_var, the_statement->code.pack_eq.left, the_statement->code.pack_eq.right);
+            break;
         case base_value:  // get value[所有字面量均为这个表达式]
             return_value.value = (the_statement->code).base_value.value;  // code
             if((return_value.value.type == INT_value) || (return_value.value.type == BOOL_value)){
@@ -177,10 +180,10 @@ GWARF_result read_statement(statement *the_statement, var_list *the_var, var_lis
             // base_value返回字面量 -> 主要返回object类型,还会返回GWARF_value的其他类型供生成object类型
             break;
         case base_list:  // get value[所有字面量均为这个表达式]
-            return_value.value = parameter_to_list(the_statement->code.base_list.value, the_var);  // code
+            return_value.value = to_object(parameter_to_list(the_statement->code.base_list.value, the_var), the_var);  // code
             break;
         case base_dict:  // get value[所有字面量均为这个表达式]
-            return_value.value = parameter_to_dict(the_statement->code.base_dict.value, the_var);  // code
+            return_value.value = to_object(parameter_to_dict(the_statement->code.base_dict.value, the_var), the_var);  // code
             break;
         case slice:{  // get value[所有字面量均为这个表达式]
             GWARF_result tmp_result = traverse((the_statement->code).slice.base_var, the_var, false), get;  // 把a[1:2:3]的a取出来
@@ -356,7 +359,7 @@ GWARF_result read_statement(statement *the_statement, var_list *the_var, var_lis
             func_tmp->parameter_list = the_statement->code.def.parameter_list;
             func_tmp->the_var = copy_var_list(the_var);
             func_tmp->type = customize;  // func by user
-            if(login_var != the_var){  // 定义为类方法
+            if(the_login_var != the_var){  // 定义为类方法
                 func_tmp->is_class = true;
             }
             else{
@@ -367,7 +370,7 @@ 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;
 
-            assignment_statement(the_statement->code.def.var, the_var, login_var, func_value);  // 注册函数到指定的位置
+            assignment_statement(the_statement->code.def.var, the_var, the_login_var, func_value);  // 注册函数到指定的位置
             // 无返回值
             break;
         }
@@ -445,7 +448,7 @@ GWARF_result read_statement(statement *the_statement, var_list *the_var, var_lis
                 tmp = tmp->next;
             }
 
-            assignment_statement(the_statement->code.set_class.var, the_var,login_var, class_value);  // 注册class 的 位置
+            assignment_statement(the_statement->code.set_class.var, the_var,the_login_var, class_value);  // 注册class 的 位置
             puts("----stop set class----");
             // 无返回值
             break;
@@ -1969,6 +1972,7 @@ GWARF_result login_var(var_list *the_var, var_list *old_var_list, parameter *tmp
         }
         else if(assignment_type == 0 && tmp_x->type == put_kwargs){  // tmp_s还没到根据name_value的阶段, 遇到了**kwargs,则把后面的所有直接变成dict
             // 放入list中
+            puts("[tag 1]");
             GWARF_result dict_tmp;
             dict_tmp.value = to_object(parameter_to_dict(tmp_s, old_var_list), old_var_list);  // 把所有name_value变成dict
             assignment_statement(tmp_x->u.var, old_var_list, the_var, dict_tmp);

+ 8 - 4
inter/interpreter.h

@@ -53,13 +53,10 @@ typedef struct parameter{
         struct statement *value;  // var value
     } u;
     enum {
-        only_name,  // 形参
-        only_value,  // 实参
+        only_value,
         name_value,  // 形参/实参
         put_args,
         put_kwargs,
-        // get_args,
-        // get_kwargs,
     } type;
     struct parameter *next;  // for list
 } parameter;
@@ -118,6 +115,7 @@ typedef struct statement{
         for_in_cycle,  // for i in a
         assert_e,
         chose_exp,
+        pack_eq,
     } type;  // the statement type
 
     union
@@ -212,6 +210,11 @@ typedef struct statement{
             parameter *value;  // [1,2,3,4] -> to_list
         } base_list;
 
+        struct{
+            parameter *right;  // 实参
+            parameter *left;  // 形参
+        } pack_eq;
+
         struct{
             parameter *value;  // [1,2,3,4] -> to_list
         } base_dict;
@@ -497,6 +500,7 @@ GWARF_result while_func(statement *, var_list *);
 GWARF_result if_func(if_list *, var_list *);
 GWARF_result for_func(statement *, var_list *);
 GWARF_result call_back(statement *, var_list *);
+GWARF_result login_var(var_list *, var_list *, parameter *, parameter *);
 GWARF_result call_back_core(GWARF_result, var_list *, parameter *);
 GWARF_result block_func(statement *, var_list *);
 GWARF_result try_func(statement *, var_list *);

+ 1 - 1
inter/parameter.c

@@ -7,7 +7,7 @@ parameter *make_parameter_name(statement *var){
     tmp = malloc(sizeof(parameter));  // get an address for base var
     tmp->next = NULL;
     tmp->u.var = var;
-    tmp->type = only_name;
+    tmp->type = only_value;
     return tmp;
 }
 

+ 54 - 139
paser/gwarf_yacc.y

@@ -33,10 +33,10 @@
 %type <statement_value> default_token global_token nonlocal_token
 // 计算
 %type <statement_value> base_value base_var_token base_var_ element iter_value call_slice call_down attribute bit_not negative bit_move bit_and bit_or bit_or_not bool_not bool_and bool_or
-%type <statement_value> second_number first_number zero_number top_exp third_number eq_number chose_exp lambda_exp call_number 
+%type <statement_value> second_number first_number zero_number top_exp third_number eq_number chose_exp lambda_exp call_number pack_eq_exp
 
 %type <statement_value> slice_arguments_token
-%type <parameter_list> formal_parameter arguments slice_arguments dict_arguments list_arguments
+%type <parameter_list> formal_parameter slice_arguments
 %type <string_value> base_string
 %type <if_list_base> elif_exp
 %%
@@ -166,6 +166,21 @@ command
     {
         $$ = $1;
     }
+    | pack_eq_exp stop_token
+    {
+        $$ = $1;
+    }
+    ;
+
+pack_eq_exp
+    : formal_parameter EQ formal_parameter
+    {
+        statement *code_tmp =  make_statement();
+        code_tmp->type = pack_eq;
+        code_tmp->code.pack_eq.right = $3;
+        code_tmp->code.pack_eq.left = $1;
+        $$ = code_tmp;
+    }
     ;
 
 // 顶级表达式[权限最低]
@@ -176,6 +191,7 @@ top_exp
     }
     ;
 
+
 eq_number
     : call_number
     | call_number EQ eq_number
@@ -291,20 +307,23 @@ eq_number
 formal_parameter
     : top_exp
     {
-        $$ = make_parameter_name($1);
-        $$->type = only_name;
+        $$ = make_parameter_value($1);
+        $$->u.var = $$->u.value;
+        $$->type = only_value;
     }
     | MUL top_exp
     {
-        $$ = make_parameter_name($2);
+        $$ = make_parameter_value($2);
+        $$->u.var = $$->u.value;
         $$->type = put_args;
     }
     | POW top_exp
     {
-        $$ = make_parameter_name($2);
+        $$ = make_parameter_value($2);
+        $$->u.var = $$->u.value;
         $$->type = put_kwargs;
     }
-    | top_exp EQ top_exp
+    | top_exp COLON top_exp
     {
         $$ = make_parameter_name($1);
         $$->u.value = $3;
@@ -312,23 +331,26 @@ formal_parameter
     }
     | formal_parameter COMMA top_exp
     {
-        parameter *tmp = append_parameter_name($3, $1);
-        tmp->type = only_name;
+        parameter *tmp = append_parameter_value($3, $1);
+        tmp->type = only_value;
+        tmp->u.var = tmp->u.value;
         $$ = $1;
     }
     | formal_parameter COMMA MUL top_exp
     {
-        parameter *tmp = append_parameter_name($4, $1);
+        parameter *tmp = append_parameter_value($4, $1);
         tmp->type = put_args;
+        tmp->u.var = tmp->u.value;
         $$ = $1;
     }
     | formal_parameter COMMA POW top_exp
     {
-        parameter *tmp = append_parameter_name($4, $1);
+        parameter *tmp = append_parameter_value($4, $1);
         tmp->type = put_kwargs;
+        tmp->u.var = tmp->u.value;
         $$ = $1;
     }
-    | formal_parameter COMMA top_exp EQ top_exp
+    | formal_parameter COMMA top_exp COLON top_exp
     {
         parameter *tmp = append_parameter_name($3, $1);
         tmp->u.value = $5;
@@ -337,58 +359,6 @@ formal_parameter
     }
     ;
 
-arguments
-    : top_exp
-    {
-        $$ = make_parameter_value($1);
-        $$->type = only_value;
-    }
-    | arguments COMMA top_exp
-    {
-        parameter *tmp = append_parameter_value($3, $1);
-        tmp->type = only_value;
-        $$ = $1;
-    }
-    | base_var_ EQ top_exp
-    {
-        $$ = make_parameter_name($1);
-        $$->u.value = $3;
-        puts("SW");
-        $$->type = name_value;
-    }
-    | arguments COMMA base_var_ EQ top_exp
-    {
-        parameter *tmp = append_parameter_name($3, $1);
-        tmp->u.value = $5;
-        tmp->type = name_value;
-        puts("SW");
-        $$ = $1;
-    }
-    | MUL top_exp
-    {
-        $$ = 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;
-        puts("SW");
-    }
-    | arguments COMMA POW top_exp
-    {
-        parameter *tmp = append_parameter_value($4, $1);
-        tmp->type = put_kwargs;
-        puts("SW");
-        $$ = $1;
-    }
-    ;
 
 slice_arguments
     : slice_arguments_token
@@ -425,7 +395,7 @@ call_number
         code_tmp->code.call.parameter_list = NULL;
         $$ = code_tmp;
     }
-    | call_number LB arguments RB
+    | call_number LB formal_parameter RB
     {
         statement *code_tmp =  make_statement();
         code_tmp->type = call;
@@ -801,92 +771,37 @@ call_slice
 // 列表、字典
 iter_value
     : element
-    | LI list_arguments RI
+    | LI RI
     {
-        parameter *tmp;
-        tmp = malloc(sizeof(parameter));  // get an address for base var
-        tmp->next = NULL;
         statement *statement_tmp = malloc(sizeof(statement));
         statement_tmp->type = base_list;
-        statement_tmp->code.base_list.value = $2;
-        tmp->u.value = statement_tmp;
-
-        statement *code_tmp =  make_statement();
-        code_tmp->type = call;
-        code_tmp->code.call.func = pack_call_name("list", NULL);
-        code_tmp->code.call.parameter_list = tmp;
+        statement_tmp->code.base_list.value = NULL;
 
-        $$ = code_tmp;
+        $$ = statement_tmp;
     }
-    | LP dict_arguments RP
+    | LI formal_parameter RI
     {
-        parameter *tmp;
-        tmp = malloc(sizeof(parameter));  // get an address for base var
-        tmp->next = NULL;
         statement *statement_tmp = malloc(sizeof(statement));
-        statement_tmp->type = base_dict;
-        statement_tmp->code.base_dict.value = $2;
-        tmp->u.value = statement_tmp;
-
-        statement *code_tmp =  make_statement();
-        code_tmp->type = call;
-        code_tmp->code.call.func = pack_call_name("dict", NULL);
-        code_tmp->code.call.parameter_list = tmp;
-
-        $$ = code_tmp;
-    }
-    ;
+        statement_tmp->type = base_list;
+        statement_tmp->code.base_list.value = $2;
 
-list_arguments
-    : top_exp
-    {
-        $$ = make_parameter_value($1);
-        $$->type = only_value;
-        puts("Fss");
-    }
-    | list_arguments COMMA top_exp
-    {
-        parameter *tmp = append_parameter_value($3, $1);
-        tmp->type = only_value;
-        $$ = $1;
-    }
-    | MUL top_exp
-    {
-        $$ = make_parameter_value($2);
-        $$->type = put_args;
+        $$ = statement_tmp;
     }
-    | list_arguments COMMA MUL top_exp
+    | LP RP
     {
-        parameter *tmp = append_parameter_value($4, $1);
-        tmp->type = put_args;
-        $$ = $1;
-    }
-    ;
+        statement *statement_tmp = malloc(sizeof(statement));
+        statement_tmp->type = base_dict;
+        statement_tmp->code.base_dict.value = NULL;
 
-dict_arguments
-    : element COLON element
-    {
-        $$ = make_parameter_name($1);
-        $$->u.value = $3;
-        $$->type = name_value;
-    }
-    | dict_arguments COMMA element COLON element
-    {
-        parameter *tmp = append_parameter_name($3, $1);
-        tmp->u.value = $5;
-        tmp->type = name_value;
-        $$ = $1;
-    }
-    | POW top_exp
-    {
-        $$ = make_parameter_value($2);
-        $$->type = put_kwargs;
+        $$ = statement_tmp;
     }
-    | dict_arguments COMMA POW top_exp
+    | LP formal_parameter RP
     {
-        parameter *tmp = append_parameter_value($4, $1);
-        tmp->type = put_kwargs;
-        $$ = $1;
+        statement *statement_tmp = malloc(sizeof(statement));
+        statement_tmp->type = base_dict;
+        statement_tmp->code.base_dict.value = $2;
+
+        $$ = statement_tmp;
     }
     ;
 
@@ -1497,7 +1412,7 @@ class_exp
 
         $$ = class_tmp;
     }
-    | CLASS  element LB arguments RB
+    | CLASS  element LB formal_parameter RB
     {   
         //无参数方法
         statement *class_tmp =  make_statement();

Dosya farkı çok büyük olduğundan ihmal edildi
+ 431 - 453
paser/y.output


Dosya farkı çok büyük olduğundan ihmal edildi
+ 437 - 454
paser/y.tab.c


Bu fark içinde çok fazla dosya değişikliği olduğu için bazı dosyalar gösterilmiyor