Browse Source

refactor: 允许af_Code的block拥有0个元素

SongZihuan 3 years ago
parent
commit
47e40b2a2c
5 changed files with 73 additions and 64 deletions
  1. 3 0
      src/core/__env.h
  2. 0 2
      src/core/code.c
  3. 25 14
      src/core/env.c
  4. 29 38
      src/core/run.c
  5. 16 10
      src/main.c

+ 3 - 0
src/core/__env.h

@@ -107,6 +107,9 @@ struct af_Environment {  // 运行环境
     struct af_EnvVarSpace *esv;
     struct af_EnvVarSpace *esv;
     struct af_Activity *activity;
     struct af_Activity *activity;
     struct af_TopMsgProcess *process;
     struct af_TopMsgProcess *process;
+
+    /* 运行时信息 */
+    bool process_msg_first;  // 优先处理msg而不是运行代码
 };
 };
 
 
 /* Core管理寒素 */
 /* Core管理寒素 */

+ 0 - 2
src/core/code.c

@@ -52,8 +52,6 @@ static bool countElement(af_Code *element, CodeUint *elements, CodeUint *count,
             to_next += element->block.elements;
             to_next += element->block.elements;
     }
     }
 
 
-    if (to_next != 0 || *elements == 0)  // elements不允许为0
-        return false;
     return true;
     return true;
 }
 }
 
 

+ 25 - 14
src/core/env.c

@@ -470,37 +470,48 @@ bool pushExecutionActivity(af_Code *bt, bool return_first, af_Environment *env)
 
 
 bool pushFuncActivity(af_Code *bt, af_Environment *env) {
 bool pushFuncActivity(af_Code *bt, af_Environment *env) {
     af_Code *next;
     af_Code *next;
-    af_Object **parentheses_call = &env->activity->parentheses_call;
+    af_Code *func;
+    af_Object *parentheses_call = env->activity->parentheses_call;
+
+    env->activity->parentheses_call = false;
+    if (parentheses_call != NULL)
+        gc_delReference(parentheses_call);
+
     if (!getCodeBlockNext(bt, &next)) {
     if (!getCodeBlockNext(bt, &next)) {
         pushMessageDown(makeMessage("ERROR-STR", 0), env);
         pushMessageDown(makeMessage("ERROR-STR", 0), env);
         return false;
         return false;
     }
     }
 
 
+    if (bt->block.type == curly) {  // 大括号
+        if (bt->block.elements == 0) {
+            pushMessageDown(makeMessage("ERROR-STR", 0), env);
+            return false;
+        } else
+            func = bt->next;
+    } else if (bt->block.type == brackets) {  // 暂时不考虑中括号
+        pushMessageDown(makeMessage("ERROR-STR", 0), env);
+        return false;
+    } else
+        func = NULL;  // 小括号则不在需要匹配
+
     env->activity->bt_next = next;
     env->activity->bt_next = next;
     if (next == NULL && env->activity->body_next == NULL) {
     if (next == NULL && env->activity->body_next == NULL) {
-        printf("Tail tone recursive optimization\n");
         env->activity->bt_top = bt;
         env->activity->bt_top = bt;
-        env->activity->bt_start = bt->next;
-        env->activity->bt_next = bt->next;
+        env->activity->bt_start = func;
+        env->activity->bt_next = func;
         freeMark(env);
         freeMark(env);
         /* 保持原有的 return_first */
         /* 保持原有的 return_first */
     } else {
     } else {
-        af_Activity *activity = makeActivity(bt, bt->next, false, env->activity->msg_up,
-                                             env->activity->var_list, env->activity->belong, env->activity->func);
+        af_Activity *activity = makeActivity(bt, func, false, env->activity->msg_up, env->activity->var_list,
+                                             env->activity->belong, env->activity->func);
         activity->prev = env->activity;
         activity->prev = env->activity;
         env->activity = activity;
         env->activity = activity;
     }
     }
 
 
     env->activity->call_type = env->activity->bt_top->block.type;
     env->activity->call_type = env->activity->bt_top->block.type;
-
-    if (env->activity->call_type == parentheses) {  // 对于类前缀调用, 已经获得func的实际值了
-        bool re = setFuncActivityToArg(*parentheses_call, env);
-        gc_delReference(*parentheses_call);
-        *parentheses_call = NULL;
-        return re;
-    }
-
     env->activity->status = act_func;
     env->activity->status = act_func;
+    if (env->activity->call_type == parentheses)  // 对于类前缀调用, 已经获得func的实际值了
+        return setFuncActivityToArg(parentheses_call, env);
     return true;
     return true;
 }
 }
 
 

+ 29 - 38
src/core/run.c

@@ -6,7 +6,7 @@
 /* Code 执行函数 */
 /* Code 执行函数 */
 static void codeVariable(af_Code *code, af_Environment *env);
 static void codeVariable(af_Code *code, af_Environment *env);
 static void codeLiteral(af_Code *code, af_Environment *env);
 static void codeLiteral(af_Code *code, af_Environment *env);
-static void codeBlock(af_Code *code, af_Environment *env);
+static bool codeBlock(af_Code *code, af_Environment *env);
 
 
 /* 工具函数 */
 /* 工具函数 */
 static bool checkInMsgType(char *type, af_Environment *env);
 static bool checkInMsgType(char *type, af_Environment *env);
@@ -42,16 +42,13 @@ static void codeLiteral(af_Code *code, af_Environment *env) {
     env->activity->bt_next = env->activity->bt_next->next;
     env->activity->bt_next = env->activity->bt_next->next;
 }
 }
 
 
-static void codeBlock(af_Code *code, af_Environment *env) {
+static bool codeBlock(af_Code *code, af_Environment *env) {
     if (code->prefix == env->core->prefix[B_EXEC] && code->block.type == parentheses)  // 顺序执行, 返回尾项
     if (code->prefix == env->core->prefix[B_EXEC] && code->block.type == parentheses)  // 顺序执行, 返回尾项
-        pushExecutionActivity(code, false, env);
+        return pushExecutionActivity(code, false, env);
     else if (code->prefix == env->core->prefix[B_EXEC_FIRST] && code->block.type == brackets)  // 顺序执行, 返回首项
     else if (code->prefix == env->core->prefix[B_EXEC_FIRST] && code->block.type == brackets)  // 顺序执行, 返回首项
-        pushExecutionActivity(code, true, env);
-    else if (code->prefix == NUL) {
-        pushFuncActivity(env->activity->bt_next, env);
-    } else
-        pushMessageDown(makeMessage("ERROR-STR", 0), env);
-
+        return pushExecutionActivity(code, true, env);
+    else
+        return pushFuncActivity(env->activity->bt_next, env);
 }
 }
 
 
 static bool checkInMsgType(char *type, af_Environment *env) {
 static bool checkInMsgType(char *type, af_Environment *env) {
@@ -65,6 +62,8 @@ static bool checkInMsgType(char *type, af_Environment *env) {
 }
 }
 
 
 static void popLastActivity(af_Message *msg, af_Environment *env) {
 static void popLastActivity(af_Message *msg, af_Environment *env) {
+    env->process_msg_first = true;
+
     do {  // 如果返回一级后仍是执行完成则继续返回
     do {  // 如果返回一级后仍是执行完成则继续返回
         if (env->activity->return_first) {
         if (env->activity->return_first) {
             if (msg != NULL) {
             if (msg != NULL) {
@@ -86,7 +85,7 @@ static void popLastActivity(af_Message *msg, af_Environment *env) {
 }
 }
 
 
 bool iterCode(af_Code *code, af_Environment *env) {
 bool iterCode(af_Code *code, af_Environment *env) {
-    bool process_msg_first = false;  // 优先处理msg而不是运行代码
+    env->process_msg_first = false;  // 优先处理msg而不是运行代码
     if (!addTopActivity(code, env))
     if (!addTopActivity(code, env))
         return false;
         return false;
 
 
@@ -101,7 +100,7 @@ bool iterCode(af_Code *code, af_Environment *env) {
 
 
         if (env->activity->bt_next != NULL) {
         if (env->activity->bt_next != NULL) {
             run_code = true;
             run_code = true;
-            if (!process_msg_first) {
+            if (!env->process_msg_first) {
                 switch (env->activity->bt_next->type) {
                 switch (env->activity->bt_next->type) {
                     case literal:
                     case literal:
                         codeLiteral(env->activity->bt_next, env);
                         codeLiteral(env->activity->bt_next, env);
@@ -110,13 +109,13 @@ bool iterCode(af_Code *code, af_Environment *env) {
                         codeVariable(env->activity->bt_next, env);
                         codeVariable(env->activity->bt_next, env);
                         break;
                         break;
                     case block:
                     case block:
-                        codeBlock(env->activity->bt_next, env);
-                        continue;  // 该步骤没有任何实质性运算
+                        if (codeBlock(env->activity->bt_next, env))
+                            continue;  // 若运行成功则跳转到下一次运行, 该步骤没有任何实质性运算
                     default:
                     default:
                         break;  // 错误
                         break;  // 错误
                 }
                 }
             } else
             } else
-                process_msg_first = false;
+                env->process_msg_first = false;
 
 
             if (env->activity->msg_down == NULL)  // 若未获得 msg
             if (env->activity->msg_down == NULL)  // 若未获得 msg
                 msg = makeMessage("ERROR-STR", 0);
                 msg = makeMessage("ERROR-STR", 0);
@@ -130,7 +129,6 @@ bool iterCode(af_Code *code, af_Environment *env) {
                         gc_delReference(env->activity->return_obj);
                         gc_delReference(env->activity->return_obj);
                     env->activity->return_obj = NULL;
                     env->activity->return_obj = NULL;
                     popLastActivity(NULL, env);  // msg 已经 push进去了
                     popLastActivity(NULL, env);  // msg 已经 push进去了
-                    process_msg_first = true;
                     continue;
                     continue;
                 }
                 }
             } else if (env->activity->return_first && env->activity->return_obj == NULL) {  // 设置return_first
             } else if (env->activity->return_first && env->activity->return_obj == NULL) {  // 设置return_first
@@ -141,20 +139,17 @@ bool iterCode(af_Code *code, af_Environment *env) {
 
 
         switch (env->activity->status) {
         switch (env->activity->status) {
             case act_normal:
             case act_normal:
-                if (!run_code) {
+                if (!run_code)
                     popLastActivity(makeMessage("ERROR-STR", 0), env);
                     popLastActivity(makeMessage("ERROR-STR", 0), env);
-                    process_msg_first = true;
-                } else if (env->activity->bt_next == NULL) { // 执行完成
+                else if (env->activity->bt_next == NULL) { // 执行完成
                     switch (setFuncActivityToNormal(env)) {
                     switch (setFuncActivityToNormal(env)) {
                         case -1:  // 已经没有下一步了 (原msg不释放)
                         case -1:  // 已经没有下一步了 (原msg不释放)
                             popLastActivity(msg, env);
                             popLastActivity(msg, env);
-                            process_msg_first = true;
                             break;
                             break;
                         case 0:  // 已经没有下一步了 (但原msg释放)
                         case 0:  // 已经没有下一步了 (但原msg释放)
                             gc_delReference(*(af_Object **)(msg->msg));  // msg->msg是一个指针, 这个指针的内容是一个af_Object *
                             gc_delReference(*(af_Object **)(msg->msg));  // msg->msg是一个指针, 这个指针的内容是一个af_Object *
                             freeMessage(msg);
                             freeMessage(msg);
                             popLastActivity(NULL, env);
                             popLastActivity(NULL, env);
-                            process_msg_first = true;
                             break;
                             break;
                         default:
                         default:
                         case 1:  // 继续运行
                         case 1:  // 继续运行
@@ -162,8 +157,8 @@ bool iterCode(af_Code *code, af_Environment *env) {
                             freeMessage(msg);
                             freeMessage(msg);
                             break;
                             break;
                     }
                     }
-                } else if (env->activity->bt_next->type == block && env->activity->bt_next->block.type == parentheses
-                           && env->activity->bt_next->prefix != env->core->prefix[B_EXEC]) {  // 类前缀调用
+                } else if (env->activity->bt_next->type == block && env->activity->bt_next->block.type == parentheses &&
+                           env->activity->bt_next->prefix != env->core->prefix[B_EXEC]) {  // 类前缀调用
                     env->activity->parentheses_call = *(af_Object **)(msg->msg);
                     env->activity->parentheses_call = *(af_Object **)(msg->msg);
                     freeMessage(msg);
                     freeMessage(msg);
                 } else {  // 继续运行
                 } else {  // 继续运行
@@ -172,35 +167,31 @@ bool iterCode(af_Code *code, af_Environment *env) {
                 }
                 }
                 break;
                 break;
             case act_func: {
             case act_func: {
-                if (!run_code) {
+                if (!run_code)
                     popLastActivity(makeMessage("ERROR-STR", 0), env);
                     popLastActivity(makeMessage("ERROR-STR", 0), env);
-                    process_msg_first = true;
-                } else {
+                else {
                     af_Object *func = *(af_Object **)(msg->msg);  // func仍保留了msg的gc计数
                     af_Object *func = *(af_Object **)(msg->msg);  // func仍保留了msg的gc计数
                     gc_delReference(func);  // 释放计数
                     gc_delReference(func);  // 释放计数
                     freeMessage(msg);
                     freeMessage(msg);
-                    if (!setFuncActivityToArg(func, env)) {  // 该函数会设定bt_next到arg计算的bt上
+                    if (!setFuncActivityToArg(func, env))  // 该函数会设定bt_next到arg计算的bt上
                         popLastActivity(NULL, env);  // setFuncActivityToArg中已设置msg
                         popLastActivity(NULL, env);  // setFuncActivityToArg中已设置msg
-                        process_msg_first = true;
-                    }
                 }
                 }
                 break;
                 break;
             }
             }
             case act_arg: {
             case act_arg: {
-                if (!run_code) {
-                    act_arg_end:
-                    if (!setFuncActivityAddVar(true, false, env) || !setFuncActivityToNormal(env)) {
+                if (!run_code) {  // 无参数设定
+                    if (!setFuncActivityAddVar(true, false, env) || !setFuncActivityToNormal(env))
                         popLastActivity(NULL, env);
                         popLastActivity(NULL, env);
-                        process_msg_first = true;
-                    }
                 } else {
                 } else {
                     env->activity->acl_next->result = *(af_Object **)(msg->msg);
                     env->activity->acl_next->result = *(af_Object **)(msg->msg);
                     freeMessage(msg);
                     freeMessage(msg);
-                    if (env->activity->acl_next->next == NULL)
-                        goto act_arg_end;  // 参数设定结束
-
-                    env->activity->acl_next = env->activity->acl_next->next;
-                    env->activity->bt_next = env->activity->acl_next->code;
+                    if (env->activity->acl_next->next == NULL) { // 参数设定结束
+                        if (!setFuncActivityAddVar(true, false, env) || !setFuncActivityToNormal(env))
+                            popLastActivity(NULL, env);
+                    } else {
+                        env->activity->acl_next = env->activity->acl_next->next;
+                        env->activity->bt_next = env->activity->acl_next->code;
+                    }
                 }
                 }
                 break;
                 break;
             }
             }

+ 16 - 10
src/main.c

@@ -171,9 +171,24 @@ int main() {
         connectCode(&bt1, bt2);
         connectCode(&bt1, bt2);
 
 
         af_Code *bt3 = makeVariableCode("global", 0, 1, NULL);
         af_Code *bt3 = makeVariableCode("global", 0, 1, NULL);
-        af_Code *bt5 = makeBlockCode(parentheses, bt3, 0, 1, NULL, NULL);  // TODO-szh 参数个数允许为0
+        af_Code *bt5 = makeBlockCode(parentheses, NULL, 0, 1, NULL, NULL);
         connectCode(&bt2, bt5);
         connectCode(&bt2, bt5);
 
 
+
+        af_Code *bt6 = makeVariableCode("global", 0, 1, NULL);
+        connectCode(&bt5, bt6);
+
+        iterCode(bt1, env);
+        freeAllCode(bt1);
+        printf("\n");
+    }
+
+    {  // 测试错误 (无函数指定)
+        af_Code *bt1 = makeLiteralCode("data", "func", false, ',', 0, "Unknow");
+
+        af_Code *bt5 = makeBlockCode(curly, NULL, 0, 1, NULL, NULL);
+        connectCode(&bt1, bt5);
+
         af_Code *bt6 = makeVariableCode("global", 0, 1, NULL);
         af_Code *bt6 = makeVariableCode("global", 0, 1, NULL);
         connectCode(&bt5, bt6);
         connectCode(&bt5, bt6);
 
 
@@ -186,16 +201,7 @@ int main() {
         af_Code *bt1 = makeLiteralCode("data", "func", false, ',', 0, "Unknow");
         af_Code *bt1 = makeLiteralCode("data", "func", false, ',', 0, "Unknow");
         af_Code *bt2 = makeVariableCode("object2", 0, 1, NULL);
         af_Code *bt2 = makeVariableCode("object2", 0, 1, NULL);
 
 
-        af_Code *bt3 = makeLiteralCode("data2", "func", false, 0, 0, NULL);
-        af_Code *bt4 = makeVariableCode("global", 0, 1, NULL);
-        af_Code *bt6 = makeVariableCode("object", 0, 1, NULL);
-
         connectCode(&bt1, bt2);
         connectCode(&bt1, bt2);
-        connectCode(&bt3, bt4);
-        connectCode(&bt4, bt6);
-
-        af_Code *bt5 = makeBlockCode(curly, bt3, 0, 1, NULL, NULL);
-        connectCode(&bt2, bt5);
 
 
         iterCode(bt1, env);
         iterCode(bt1, env);
         freeAllCode(bt1);
         freeAllCode(bt1);