Jelajahi Sumber

feat: 允许使用解包赋值

解包赋值: a,b = 3,4
SongZihuan 4 tahun lalu
induk
melakukan
5e6314ac9d
7 mengubah file dengan 49 tambahan dan 14 penghapusan
  1. 1 0
      include/parameter.h
  2. 1 1
      include/value.h
  3. 3 1
      main.c
  4. 1 2
      parser/syntax.c
  5. 24 1
      src/operation.c
  6. 18 8
      src/parameter.c
  7. 1 1
      src/value.c

+ 1 - 0
include/parameter.h

@@ -46,6 +46,7 @@ Parameter *connectNameValueParameter(struct Statement *value, struct Statement *
 Parameter *connectOnlyArgsParameter(struct Statement *st, Parameter *base);
 void freeParameter(Parameter *pt, bool free_st);
 
+Result setParameterCore(Argument *call, Parameter *function_base, VarList *function_var, INTER_FUNCTIONSIG_CORE);
 Result setParameter(Parameter *call, Parameter *function, VarList *function_var, INTER_FUNCTIONSIG_CORE);
 Result iterParameter(Parameter *call, Argument **base_ad, INTER_FUNCTIONSIG_CORE);
 Argument *getArgument(Parameter *call, Result *result, INTER_FUNCTIONSIG_CORE);

+ 1 - 1
include/value.h

@@ -66,7 +66,7 @@ void freeLinkValue(LinkValue *value, Inter *inter);
 Value *makeNumberValue(long num, Inter *inter);
 Value *makeStringValue(char *str, Inter *inter);
 Value *makeFunctionValue(struct Statement *st, struct Parameter *pt, struct VarList *var_list, Inter *inter);
-Value *makeListValue(struct Argument **arg_ad, Inter *inter, int type);
+Value *makeListValue(struct Argument **arg_ad, Inter *inter, enum ListType type);
 
 void setResult(Result *ru, bool link, Inter *inter);
 void setResultError(Result *ru, Inter *inter);

+ 3 - 1
main.c

@@ -118,5 +118,7 @@ void freeArgs(){
 }
 
 /*
- *  TODO-szh 列表、字典
+ *  TODO-szh 字典
+ *  TODO-szh 运行错误的内存释放检查
+ *  TODO-szh syntax错误的内存释放检查
  */

+ 1 - 2
parser/syntax.c

@@ -163,8 +163,7 @@ void strMather(signed char p, LexMather *mather, const char *dest_p){
  * @param dest_p
  */
 void charMather(signed char p, LexMather *mather, signed char dest_p){
-    int tmp_p = (int)p, tmp_dest = (int)dest_p;  // TODO-szh 去除设定
-    if (tmp_p == tmp_dest && mather->status == LEXMATHER_START){
+    if (p == dest_p && mather->status == LEXMATHER_START){
         mather->str = memStrcpy(mather->str, 1, true, true, p);
         mather->len ++;
         mather->status = LEXMATHER_ING;

+ 24 - 1
src/operation.c

@@ -160,6 +160,28 @@ Result assCore(Statement *name, LinkValue *value, INTER_FUNCTIONSIG_CORE){
         not_times:
         addFromVarList(name->u.base_var.name, var_list, int_times, value);
     }
+    else if (name->type == base_list){
+        Result tmp_result;
+        Statement *tmp_st = makeStatement();
+        tmp_st->type = base_value;
+        tmp_st->u.base_value.value = value;
+        Parameter *pt = makeOnlyArgsParameter(tmp_st);
+        Argument *call = getArgument(pt, &tmp_result, CALL_INTER_FUNCTIONSIG_CORE(var_list));
+        if (!run_continue(tmp_result)) {
+            freeArgument(call, false);
+            freeParameter(pt, true);
+            return tmp_result;
+        }
+        tmp_result = setParameterCore(call, name->u.base_list.list, var_list, CALL_INTER_FUNCTIONSIG_CORE(var_list));
+        if (run_continue(tmp_result)) {
+            Argument *tmp = call;
+            result.value->value = makeListValue(&tmp, inter, value_tuple);
+        }
+        else
+            result = tmp_result;
+        freeArgument(call, false);
+        freeParameter(pt, true);
+    }
     return result;
 }
 
@@ -197,7 +219,8 @@ Result getBaseValue(INTER_FUNCTIONSIG) {
 
 Result getList(INTER_FUNCTIONSIG) {
     Result result;
-    Argument *at = getArgument(st->u.base_list.list, &result, CALL_INTER_FUNCTIONSIG_CORE(var_list)), *at_tmp = at;
+    Argument *at = getArgument(st->u.base_list.list, &result, CALL_INTER_FUNCTIONSIG_CORE(var_list));
+    Argument *at_tmp = at;
     if (!run_continue(result)){
         freeArgument(at_tmp, true);
         return result;

+ 18 - 8
src/parameter.c

@@ -1,7 +1,7 @@
 #include "__virtualmath.h"
 #define returnResult(result) do{ \
 if (!run_continue(result)) { \
-return result; \
+goto return_; \
 } \
 }while(0)
 
@@ -293,8 +293,10 @@ Result iterParameter(Parameter *call, Argument **base_ad, INTER_FUNCTIONSIG_CORE
     Argument *base = *base_ad;
     while (call != NULL){
         Result tmp;
-        if(operationSafeInterStatement(&tmp, CALL_INTER_FUNCTIONSIG(call->data.value, var_list)))
+        if(operationSafeInterStatement(&tmp, CALL_INTER_FUNCTIONSIG(call->data.value, var_list))) {
+            *base_ad = base;
             return tmp;
+        }
 
         if (call->type == value_par)
             base = connectOnlyValueArgument(tmp.value, base);
@@ -333,13 +335,22 @@ Argument *getArgument(Parameter *call, Result *result, INTER_FUNCTIONSIG_CORE){
  * @param var_list
  * @return
  */
-Result setParameter(Parameter *call_base, Parameter *function_base, VarList *function_var, INTER_FUNCTIONSIG_CORE){
+Result setParameter(Parameter *call_base, Parameter *function_base, VarList *function_var, INTER_FUNCTIONSIG_CORE) {
     Result result;
-    Argument *call, *tmp_call;
-    Parameter *function = copyParameter(function_base), *tmp_function = function;  // 释放使用
-    tmp_call = call = getArgument(call_base, &result, CALL_INTER_FUNCTIONSIG_CORE(var_list));
-    returnResult(result);
+    Argument *call;
+    call = getArgument(call_base, &result, CALL_INTER_FUNCTIONSIG_CORE(var_list));
+    if (!run_continue(result)) {
+        freeArgument(call, false);
+        return result;
+    }
+    result = setParameterCore(call, function_base, function_var, CALL_INTER_FUNCTIONSIG_CORE(var_list));
+    freeArgument(call, false);
+    return result;
+}
 
+Result setParameterCore(Argument *call, Parameter *function_base, VarList *function_var, INTER_FUNCTIONSIG_CORE){
+    Result result;
+    Parameter *function = copyParameter(function_base), *tmp_function = function;  // 释放使用
     enum {
         match_status = 1,
         default_status = 2,
@@ -405,7 +416,6 @@ Result setParameter(Parameter *call_base, Parameter *function_base, VarList *fun
         }
     }
     return_:
-    freeArgument(tmp_call, false);
     freeParameter(tmp_function, false);
     return result;
 }

+ 1 - 1
src/value.c

@@ -47,7 +47,7 @@ Value *makeFunctionValue(Statement *st, Parameter *pt, VarList *var_list, Inter
     return tmp;
 }
 
-Value *makeListValue(Argument **arg_ad, Inter *inter, int type) {
+Value *makeListValue(Argument **arg_ad, Inter *inter, enum ListType type) {
     Value *tmp;
     Argument *at = *arg_ad;
     tmp = makeValue(inter);