Browse Source

调整了EQ赋值机制和权限机制

SongZihuan 5 năm trước cách đây
mục cha
commit
c8af2aabcf
3 tập tin đã thay đổi với 18 bổ sung19 xóa
  1. 10 10
      inter/interpreter.c
  2. 2 1
      inter/interpreter.h
  3. 6 8
      inter/var.c

+ 10 - 10
inter/interpreter.c

@@ -1793,7 +1793,7 @@ GWARF_result operation_func(statement *the_statement, var_list *the_var, var_lis
             break;
         case ASSIGnMENT_func:{  // because the var char, we should ues a {} to make a block[name space] for the tmp var;
             get_right_result;
-            value = assignment_statement(the_statement->code.operation.left_exp, the_var, login_var, right_result, global_inter);
+            value = assignment_statement_eq(the_statement->code.operation.left_exp, the_var, login_var, right_result, global_inter);
             break;
         }
         case EQUAL_func:
@@ -2012,15 +2012,15 @@ GWARF_result assignment_statement_core(statement *the_statement, var_list *the_v
         
         GWARF_value base_the_var = tmp_result.value;  // 不用取value
         if(base_the_var.type == CLASS_value){
-            value = assignment_statement(the_statement->code.point.child_var, the_var, base_the_var.value.class_value->the_var, right_result,global_inter);
+            value = assignment_statement_eq(the_statement->code.point.child_var, the_var, base_the_var.value.class_value->the_var, right_result,global_inter);
             value.base_name = NULL;  // 默认是NULL
         }
         else if(base_the_var.type == OBJECT_value){
-            value = assignment_statement(the_statement->code.point.child_var, the_var, base_the_var.value.object_value->the_var, right_result,global_inter);
+            value = assignment_statement_eq(the_statement->code.point.child_var, the_var, base_the_var.value.object_value->the_var, right_result,global_inter);
             value.base_name = NULL;  // 默认是NULL
         }
         else if(base_the_var.type == FUNC_value){
-            value = assignment_statement(the_statement->code.point.child_var, the_var, base_the_var.value.func_value->self, right_result,global_inter);
+            value = assignment_statement_eq(the_statement->code.point.child_var, the_var, base_the_var.value.func_value->self, right_result,global_inter);
             value.base_name = NULL;  // 默认是NULL
         }
         else if(base_the_var.type == NULL_value){
@@ -2170,7 +2170,7 @@ 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);
-                        GWARF_result tmp_assignment = assignment_statement(tmp_x->u.var, the_var, the_var, tmp,global_inter);  // 赋值
+                        GWARF_result tmp_assignment = assignment_statement_eq(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
                     }
@@ -2182,7 +2182,7 @@ GWARF_result login_var(var_list *the_var, var_list *old_var_list, parameter *tmp
                         if(list_init != NULL){
                             func_result.value = list_init->value;
                         }
-                        GWARF_result tmp_assignment = assignment_statement(tmp_x->u.var, the_var, the_var,call_back_core(func_result, old_var_list, NULL, global_inter), global_inter);  // old_var_list用于计算from等
+                        GWARF_result tmp_assignment = assignment_statement_eq(tmp_x->u.var, the_var, the_var,call_back_core(func_result, old_var_list, NULL, global_inter), global_inter);  // old_var_list用于计算from等
                         error_space(tmp_assignment, return_base_result, return_result);
                         tmp_x = tmp_x->next;  // get the next to iter
                     }
@@ -2240,14 +2240,14 @@ GWARF_result login_var(var_list *the_var, var_list *old_var_list, parameter *tmp
                         }
                         GWARF_result dict_result = GWARF_result_reset;
                         dict_result.value = dict_tmp;
-                        GWARF_result assignment_tmp = assignment_statement(tmp_x->u.var, the_var, the_var, dict_result,global_inter);
+                        GWARF_result assignment_tmp = assignment_statement_eq(tmp_x->u.var, the_var, the_var, dict_result,global_inter);
                         error_space(assignment_tmp, return_base_result, return_result);
                         tmp_x->next = NULL;  // 理论上没有下一个
                     }
                     else{
                         GWARF_result tmp_x_var = traverse_get_value(tmp_x->u.var, tmp_var, the_var, global_inter);  // 使用tmp_x->u.var在tmp_var中获取变量的值
                         if((!is_error(&tmp_x_var)) && (!is_space(&tmp_x_var))){  // 如果找到了,就赋值
-                            GWARF_result tmp = assignment_statement(tmp_x->u.var, the_var, the_var, tmp_x_var,global_inter);  // tmp_x的外部变量使用the_var
+                            GWARF_result tmp = assignment_statement_eq(tmp_x->u.var, the_var, the_var, tmp_x_var,global_inter);  // tmp_x的外部变量使用the_var
                             error_space(tmp, return_base_result, return_result);
                             if(tmp.base_name != NULL){  // 删除变量
                                 del_var_var_list(tmp_var, 0, tmp.base_name);  // 从中删除变量
@@ -2257,7 +2257,7 @@ GWARF_result login_var(var_list *the_var, var_list *old_var_list, parameter *tmp
                             GWARF_result tmp = traverse(tmp_x->u.value, the_var, false, global_inter);  // 执行形参
                             error_space(tmp, return_base_result, return_result);
 
-                            tmp = assignment_statement(tmp_x->u.var, the_var, the_var, tmp,global_inter);
+                            tmp = assignment_statement_eq(tmp_x->u.var, the_var, the_var, tmp,global_inter);  // 带等于号的赋值
                             error_space(tmp, return_base_result, return_result);
                         }
                         else{
@@ -2330,7 +2330,7 @@ GWARF_result login_var(var_list *the_var, var_list *old_var_list, parameter *tmp
                 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上
+            GWARF_result assignment_tmp = assignment_statement(tmp_s->u.var, old_var_list, tmp_var, tmp,global_inter);  // 先赋值到tmp_var上(先不用EQ,后面赋值在用EQ)
             error_space(assignment_tmp, return_base_result, return_result);
             tmp_s = tmp_s->next;
         }

+ 2 - 1
inter/interpreter.h

@@ -8,7 +8,8 @@
 #define true 1
 #define bool int
 
-#define assignment_statement(the_statement,the_var,login_var,right_result,global_inter) assignment_statement_core(the_statement,the_var,login_var,right_result,0,auto_public,global_inter)
+#define assignment_statement(the_statement,the_var,login_var,right_result,global_inter) assignment_statement_core(the_statement,the_var,login_var,right_result,1,auto_public,global_inter)
+#define assignment_statement_eq(the_statement,the_var,login_var,right_result,global_inter) assignment_statement_core(the_statement,the_var,login_var,right_result,0,auto_public,global_inter)
 #define read_statement_list(the_statement,the_var,global_inter) read_statement(the_statement,the_var,NULL,NULL,lock,global_inter)
 #define run_func(base_the_var,the_var,name,global_inter) run_func_core(base_the_var,the_var,name,false,global_inter)
 #define GWARF_value_reset {.type=NULL_value,.value.int_value=0,.lock_token=base}

+ 6 - 8
inter/var.c

@@ -13,7 +13,10 @@ var *make_var(){  // make var with base
     return tmp;
 }
 
-void append_var(char *name, GWARF_value value, var *base_var, int lock){
+void append_var(char *name, GWARF_value value, var *base_var, int lock){  // lock本质为var token
+    if(lock == auto_public){
+        lock = public;  // 使用自动权限
+    }
 
     int break_ = 1;  // get var[2] or not[1]
     var *tmp = base_var;  // iter var
@@ -30,7 +33,7 @@ void append_var(char *name, GWARF_value value, var *base_var, int lock){
         tmp = tmp->next;  // get the next to iter
     }
     if(break_ == 2){
-        if(tmp->lock == lock || tmp->lock == public || (tmp->lock == protect && lock == private_token)){  // 检查是否具有修改的权限
+        if(tmp->lock == lock || tmp->lock == public || (tmp->lock == protect && lock == private)){  // 检查是否具有修改的权限
             tmp->value = value;
             if(lock != auto_public){  // 检查是否可以改变权限
                 tmp->lock = lock;
@@ -41,12 +44,7 @@ void append_var(char *name, GWARF_value value, var *base_var, int lock){
 
     var *new_tmp = make_var();
     tmp->next = new_tmp;
-    if(lock == auto_public){
-        tmp->lock = public;  // 使用自动权限
-    }
-    else{
-        new_tmp->lock = lock;
-    }
+    new_tmp->lock = lock;
     new_tmp->name = malloc(sizeof(name));
     strcpy(new_tmp->name, name);
     new_tmp->value = value;