浏览代码

虚解包设计,如:a,b,* = 1,2,3,4,5,6,7的这种语法形式

SongZihuan 5 年之前
父节点
当前提交
03f002df1a
共有 2 个文件被更改,包括 31 次插入12 次删除
  1. 20 7
      inter/interpreter.c
  2. 11 5
      paser/syntax.c

+ 20 - 7
inter/interpreter.c

@@ -280,11 +280,9 @@ GWARF_result read_statement(statement *the_statement, var_list *the_var, var_lis
             break;
         }
         case base_svar:{    // because the var tmp, we should ues a {} to make a block[name space] for the tmp var;
-            puts("[tag 2]");
             int from = 0;
             if(the_statement->code.base_svar.from == NULL){
                 from = 0;
-                puts("[tag 3]");
             }
             else{
                 GWARF_result tmp_result, tmp_object = traverse(the_statement->code.base_svar.from, the_var, false);
@@ -1922,6 +1920,9 @@ GWARF_result assignment_statement_core(statement *the_statement, var_list *the_v
         else if(is_space(&eq_object)){
             return eq_object;
         }
+        if(eq_object.value.type == NULL_value){  // NULL value 不赋值
+            return right_result;
+        }
         char *str = to_str_dict(eq_object.value, the_var).value.string;
         value = assignment_func(str, right_result, login_var, from);
         value.base_name = str;  // str来自value,本身就是malloc申请的内存
@@ -1934,6 +1935,9 @@ GWARF_result assignment_statement_core(statement *the_statement, var_list *the_v
         else if(is_space(&eq_object)){
             return eq_object;
         }
+        if(eq_object.value.type == NULL_value){  // NULL value 不赋值
+            return right_result;
+        }
         char *str = to_str_dict(eq_object.value, the_var).value.string;
         value = assignment_func(str, right_result, login_var, 0);
         value.base_name = str;
@@ -2055,7 +2059,6 @@ GWARF_result login_var(var_list *the_var, var_list *old_var_list, parameter *tmp
                         tmp_x->next = NULL;  // 理论上没有下一个
                     }
                     else{
-                        printf("[tag 12221] %d\n",tmp_x->u.var->type);
                         GWARF_result tmp_x_var = traverse_get_value(tmp_x->u.var, tmp_var, old_var_list);  // 使用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, old_var_list, the_var, tmp_x_var);
@@ -2175,12 +2178,10 @@ GWARF_result login_var(var_list *the_var, var_list *old_var_list, parameter *tmp
                 if(tmp_s->type != only_value && tmp_s->type != put_args){
                     break;
                 }
-                puts("GO");
                 tmp_s = tmp_s->next;  // tmp_s迭代到only_value的最后一个
             }
         }
         else if(assignment_type == 0){
-            puts("[tag 1]");
             assignment_statement(tmp_x->u.var, old_var_list, the_var, tmp);
             tmp_x = tmp_x->next;  // get the next to iter
             tmp_s = tmp_s->next;
@@ -3783,6 +3784,12 @@ GWARF_result traverse(statement *the_statement, var_list *the_var, bool new){  /
 GWARF_result traverse_global(statement *the_statement, var_list *the_var){  // traverse the statement[not break、broken、and others] but error
     statement *tmp = the_statement;
     GWARF_result result;
+    if(the_statement == NULL){
+        result.u = statement_end;  // 正常设置[正常语句结束]
+        result.value.type = NULL_value;  // 默认设置
+        result.value.value.int_value = 0;  // 默认设置
+        goto return_back;
+    }
     while(1){
         if(tmp == NULL){
             break;  // off
@@ -3794,12 +3801,18 @@ GWARF_result traverse_global(statement *the_statement, var_list *the_var){  // t
         }
         tmp = tmp->next;
     }
-    return result;
+    return_back: return result;
 }
 
 GWARF_result traverse_get_value(statement *the_statement, var_list *the_var, var_list *out_var){  // traverse the statement[not break、broken、and others] but error
     statement *tmp = the_statement;
     GWARF_result result;
+    if(the_statement == NULL){
+        result.u = statement_end;  // 正常设置[正常语句结束]
+        result.value.type = NULL_value;  // 默认设置
+        result.value.value.int_value = 0;  // 默认设置
+        goto return_back;
+    }
     while(1){
         if(tmp == NULL){
             break;  // off
@@ -3811,7 +3824,7 @@ GWARF_result traverse_get_value(statement *the_statement, var_list *the_var, var
         }
         tmp = tmp->next;
     }
-    return result;
+    return_back: return result;
 }
 
 inter *get_inter(){

+ 11 - 5
paser/syntax.c

@@ -546,11 +546,17 @@ void formal_parameter(p_status *status, token_node *list){  // 因试分解
             new_status = *status;
             new_status.not_match_eq = true;
             new_status.not_match_tuple = true;
-            get_right_token(&new_status, list, top_exp, next);
-            if(next.type != NON_top_exp){  // 结尾分号
-                back_one_token(list, left);  // 分号忽略
-                back_again(list, next);
-                return;
+            token tmp_next;
+            get_right_token(&new_status, list, top_exp, tmp_next);
+            if(tmp_next.type != NON_top_exp){  // 结尾分号 -> xun
+                back_again(list, tmp_next);
+                next.type = NON_top_exp;
+                next.data_type = statement_value;
+                next.data.statement_value = make_statement();  // NULL返回None
+                puts("FFFFFFFFFf");
+            }
+            else{
+                next = tmp_next;
             }
 
             new_token = left;