From e6c8e23f563ff3b637c06d2c210c4ae8c2ab911a Mon Sep 17 00:00:00 2001 From: lyon1998 <645275593@qq.com> Date: Sat, 16 Oct 2021 17:48:01 +0800 Subject: [PATCH] supporting contral in pikaParser --- .../PikaRunExternControl/PikaBlock.c | 88 -------------- .../PikaRunExternControl/PikaBlock.h | 22 ---- .../PikaRunExternControl/PikaIf.c | 39 ------ .../PikaRunExternControl/PikaIf.h | 13 -- .../PikaRunExternContral.c | 73 ----------- .../PikaRunExternControl/PikaWhile.c | 47 ------- .../PikaRunExternControl/PikaWhile.h | 14 --- port/linux/test/block-test.cpp | 115 ------------------ src/PikaParser.c | 13 +- src/PikaVM.c | 1 + 10 files changed, 12 insertions(+), 413 deletions(-) delete mode 100644 port/linux/package/pikascript/pikascript-lib/PikaRunExternControl/PikaBlock.c delete mode 100644 port/linux/package/pikascript/pikascript-lib/PikaRunExternControl/PikaBlock.h delete mode 100644 port/linux/package/pikascript/pikascript-lib/PikaRunExternControl/PikaIf.c delete mode 100644 port/linux/package/pikascript/pikascript-lib/PikaRunExternControl/PikaIf.h delete mode 100644 port/linux/package/pikascript/pikascript-lib/PikaRunExternControl/PikaRunExternContral.c delete mode 100644 port/linux/package/pikascript/pikascript-lib/PikaRunExternControl/PikaWhile.c delete mode 100644 port/linux/package/pikascript/pikascript-lib/PikaRunExternControl/PikaWhile.h delete mode 100644 port/linux/test/block-test.cpp diff --git a/port/linux/package/pikascript/pikascript-lib/PikaRunExternControl/PikaBlock.c b/port/linux/package/pikascript/pikascript-lib/PikaRunExternControl/PikaBlock.c deleted file mode 100644 index a3ee65171..000000000 --- a/port/linux/package/pikascript/pikascript-lib/PikaRunExternControl/PikaBlock.c +++ /dev/null @@ -1,88 +0,0 @@ -/* - Author: lyon - Tencent QQ: 645275593 -*/ - -#include "PikaBlock.h" -#include -#include "PikaObj.h" -#include "TinyObj.h" -#include "dataArgs.h" -#include "dataMemory.h" -#include "dataString.h" -#include "dataStrs.h" - -void block_deinit(PikaObj* self) { - obj_deinit(self); -} - -PikaObj* block_init(Args* args) { - PikaObj* self = New_TinyObj(args); - obj_setStr(self, "mode", ""); - obj_setStr(self, "assert", ""); - obj_setStr(self, "body", ""); - obj_setInt(self, "lineSize", 0); - obj_setStr(self, "lineNow", ""); - return self; -} - -char* block_getBody(PikaObj* self) { - return obj_getStr(self, "body"); -} - -void block_setBody(PikaObj* self, char* body) { - obj_setStr(self, "body", body); -} - -uint8_t block_checkAssert(PikaObj* self) { - Args* buffs = New_strBuff(); - PikaObj* host = obj_getContext(self); - char* assert = block_getAssert(self); - obj_run(host, strsFormat(buffs, 32, "_res = %s", assert)); - int res = obj_getInt(host, "_res"); - obj_removeArg(host, "_res"); - args_deinit(buffs); - return res; -} - -uint16_t block_getLineSize(PikaObj* self) { - return obj_getInt(self, "lineSize"); -} - -void block_setAssert(PikaObj* self, char* assert) { - obj_setStr(self, "assert", assert); -} - -char* block_getAssert(PikaObj* self) { - return obj_getStr(self, "assert"); -} - -void block_setMode(PikaObj* self, char* mode) { - obj_setStr(self, "mode", mode); -} - -char* block_getMode(PikaObj* self) { - return obj_getStr(self, "mode"); -} - -void block_pushLine(PikaObj* self, char* line) { - Args* buffs = New_strBuff(); - char* body = obj_getStr(self, "body"); - body = strsAppend(buffs, body, line); - body = strsAppend(buffs, body, "\n"); - obj_setStr(self, "body", body); - obj_setInt(self, "lineSize", obj_getInt(self, "lineSize") + 1); - args_deinit(buffs); -} - -char* block_popLine(PikaObj* self) { - Args* buffs = New_strBuff(); - char* body = obj_getStr(self, "body"); - char* line = strsPopToken(buffs, body, '\n'); - - obj_setStr(self, "body", body); - obj_setStr(self, "lineNow", line); - obj_setInt(self, "lineSize", obj_getInt(self, "lineSize") - 1); - args_deinit(buffs); - return obj_getStr(self, "lineNow"); -} diff --git a/port/linux/package/pikascript/pikascript-lib/PikaRunExternControl/PikaBlock.h b/port/linux/package/pikascript/pikascript-lib/PikaRunExternControl/PikaBlock.h deleted file mode 100644 index 283b9637f..000000000 --- a/port/linux/package/pikascript/pikascript-lib/PikaRunExternControl/PikaBlock.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - Author: lyon - Tencent QQ: 645275593 -*/ - -#ifndef _pikaBlock__H -#define _pikaBlock__H -#include "PikaObj.h" - -void block_deinit(PikaObj* self); -PikaObj* block_init(Args* args); -char* block_popLine(PikaObj* self); -void block_pushLine(PikaObj* self, char* line); -char* block_getBody(PikaObj* self); -char* block_getAssert(PikaObj* self); -void block_setAssert(PikaObj* self, char* assert); -uint8_t block_checkAssert(PikaObj* self); -uint16_t block_getLineSize(PikaObj* self); -void block_setMode(PikaObj* self, char* mode); -char* block_getMode(PikaObj* self); -void block_setBody(PikaObj* self, char* body); -#endif diff --git a/port/linux/package/pikascript/pikascript-lib/PikaRunExternControl/PikaIf.c b/port/linux/package/pikascript/pikascript-lib/PikaRunExternControl/PikaIf.c deleted file mode 100644 index 81e2885f8..000000000 --- a/port/linux/package/pikascript/pikascript-lib/PikaRunExternControl/PikaIf.c +++ /dev/null @@ -1,39 +0,0 @@ -/* - Author: lyon - Tencent QQ: 645275593 -*/ - -#include "PikaIf.h" -#include -#include "PikaBlock.h" -#include "TinyObj.h" -#include "dataStrs.h" - -void if_setAssert(PikaObj* self, char* line) { - Args* buffs = New_strBuff(); - char* assert = strsRemovePrefix(buffs, line, "if "); - assert = strsGetFirstToken(buffs, assert, ':'); - block_setAssert(self, assert); - block_setMode(self, "if"); - args_deinit(buffs); -} - -void if_pushLine(PikaObj* self, char* line) { - Args* buffs = New_strBuff(); - char* bodyLine = strsRemovePrefix(buffs, line, " "); - block_pushLine(self, bodyLine); - goto exit; -exit: - args_deinit(buffs); - return; -} - -void if_run(PikaObj* self) { - if (block_checkAssert(self)) { - PikaObj* host = obj_getContext(self); - while (0 != block_getLineSize(self)) { - char* line = block_popLine(self); - obj_run(host, line); - } - } -} diff --git a/port/linux/package/pikascript/pikascript-lib/PikaRunExternControl/PikaIf.h b/port/linux/package/pikascript/pikascript-lib/PikaRunExternControl/PikaIf.h deleted file mode 100644 index d11dcdce0..000000000 --- a/port/linux/package/pikascript/pikascript-lib/PikaRunExternControl/PikaIf.h +++ /dev/null @@ -1,13 +0,0 @@ -/* - Author: lyon - Tencent QQ: 645275593 -*/ - -#ifndef _pikaIf__H -#define _pikaIf__H -#include "PikaObj.h" - -void if_pushLine(PikaObj* self, char* line); -void if_setAssert(PikaObj* self, char* line); -void if_run(PikaObj* self); -#endif diff --git a/port/linux/package/pikascript/pikascript-lib/PikaRunExternControl/PikaRunExternContral.c b/port/linux/package/pikascript/pikascript-lib/PikaRunExternControl/PikaRunExternContral.c deleted file mode 100644 index 731aaddbd..000000000 --- a/port/linux/package/pikascript/pikascript-lib/PikaRunExternControl/PikaRunExternContral.c +++ /dev/null @@ -1,73 +0,0 @@ -/* - Author: lyon - Tencent QQ: 645275593 -*/ -#include "PikaObj.h" -#include -#include "BaseObj.h" -#include "PikaBlock.h" -#include "PikaIf.h" -#include "PikaWhile.h" -#include "dataArgs.h" -#include "dataMemory.h" -#include "dataString.h" -#include "dataStrs.h" - -int __runExtern_contral(PikaObj* self, char* cmd) { - int isExit = 0; - /* in block */ - if (NULL != obj_getArg(self, "_isInBlock")) { - PikaObj* block = obj_getObj(self, "_block", 0); - if (strIsStartWith(cmd, " ")) { - if (strEqu(block_getMode(block), "if")) { - if_pushLine(block, cmd); - isExit = 1; - goto exit; - } - if (strEqu(block_getMode(block), "while")) { - while_pushLine(block, cmd); - isExit = 1; - goto exit; - } - isExit = 1; - goto exit; - } - /* the block is end */ - else { - obj_removeArg(self, "_isInBlock"); - if (strEqu(block_getMode(block), "if")) { - if_run(block); - } - if (strEqu(block_getMode(block), "while")) { - while_run(block); - } - obj_removeArg(self, "_block"); - /* not finished */ - } - } - - /* if block */ - if (strIsStartWith(cmd, "if ")) { - obj_setInt(self, "_isInBlock", 1); - obj_setObjWithoutClass(self, "_block", block_init); - PikaObj* block = obj_getObj(self, "_block", 0); - if_setAssert(block, cmd); - /* this line processed ok */ - isExit = 1; - goto exit; - } - - /* while block */ - if (strIsStartWith(cmd, "while ")) { - obj_setInt(self, "_isInBlock", 1); - obj_setObjWithoutClass(self, "_block", block_init); - PikaObj* block = obj_getObj(self, "_block", 0); - while_setAssert(block, cmd); - /* this line processed ok */ - isExit = 1; - goto exit; - } - -exit: - return isExit; -} \ No newline at end of file diff --git a/port/linux/package/pikascript/pikascript-lib/PikaRunExternControl/PikaWhile.c b/port/linux/package/pikascript/pikascript-lib/PikaRunExternControl/PikaWhile.c deleted file mode 100644 index de5054629..000000000 --- a/port/linux/package/pikascript/pikascript-lib/PikaRunExternControl/PikaWhile.c +++ /dev/null @@ -1,47 +0,0 @@ -/* - Author: lyon - Tencent QQ: 645275593 -*/ - -#include -#include "PikaBlock.h" -#include "PikaObj.h" -#include "dataArgs.h" -#include "dataMemory.h" -#include "dataString.h" -#include "dataStrs.h" - -void while_setAssert(PikaObj* self, char* line) { - Args* buffs = New_strBuff(); - char* assert = strsRemovePrefix(buffs, line, "while "); - assert = strsGetFirstToken(buffs, assert, ':'); - block_setAssert(self, assert); - block_setMode(self, "while"); - args_deinit(buffs); -} - -void while_pushLine(PikaObj* self, char* line) { - Args* buffs = New_strBuff(); - char* bodyLine = strsRemovePrefix(buffs, line, " "); - block_pushLine(self, bodyLine); - goto exit; -exit: - args_deinit(buffs); - return; -} - -void while_run(PikaObj* self) { - Args* buffs = New_strBuff(); - char* body = strsCopy(buffs, block_getBody(self)); - uint16_t lineSize = block_getLineSize(self); - while (block_checkAssert(self)) { - PikaObj* host = obj_getContext(self); - for (int i = 0; i < lineSize; i++) { - char* line = block_popLine(self); - obj_run(host, line); - } - block_setBody(self, body); - } -exit: - args_deinit(buffs); -} diff --git a/port/linux/package/pikascript/pikascript-lib/PikaRunExternControl/PikaWhile.h b/port/linux/package/pikascript/pikascript-lib/PikaRunExternControl/PikaWhile.h deleted file mode 100644 index 0c9c75e36..000000000 --- a/port/linux/package/pikascript/pikascript-lib/PikaRunExternControl/PikaWhile.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - Author: lyon - Tencent QQ: 645275593 -*/ - -#ifndef _pikaWhile__H -#define _pikaWhile__H -#include "PikaObj.h" - -void while_setAssert(PikaObj* self, char* line); -void while_pushLine(PikaObj* self, char* line); -void while_run(PikaObj* self); - -#endif diff --git a/port/linux/test/block-test.cpp b/port/linux/test/block-test.cpp deleted file mode 100644 index 8a0bb99c5..000000000 --- a/port/linux/test/block-test.cpp +++ /dev/null @@ -1,115 +0,0 @@ -#include "gtest/gtest.h" -extern "C" { -#include "BaseObj.h" -#include "PikaBlock.h" -#include "PikaIf.h" -#include "PikaObj.h" -#include "TinyObj.h" -#include "dataStrs.h" -} - -TEST(block, init) { - PikaObj* block = block_init(NULL); - block_deinit(block); - EXPECT_EQ(pikaMemNow(), 0); -} - -TEST(block, push) { - PikaObj* block = block_init(NULL); - block_pushLine(block, (char*)"line1"); - block_pushLine(block, (char*)"line2"); - block_deinit(block); - EXPECT_EQ(pikaMemNow(), 0); -} - -TEST(block, pop) { - PikaObj* block = block_init(NULL); - block_pushLine(block, (char*)"line1"); - block_pushLine(block, (char*)"line2"); - char* line1 = block_popLine(block); - ASSERT_STREQ(line1, (char*)"line1"); - char* line2 = block_popLine(block); - ASSERT_STREQ(line2, (char*)"line2"); - char* line3 = block_popLine(block); - ASSERT_STREQ(line3, (char*)""); - block_deinit(block); - EXPECT_EQ(pikaMemNow(), 0); -} - -TEST(block, assert1) { - PikaObj* block = block_init(NULL); - { - block_setAssert(block, (char*)"1"); - int res = block_checkAssert(block); - ASSERT_EQ(1, res); - } - - { - block_setAssert(block, (char*)"0"); - int res = block_checkAssert(block); - ASSERT_EQ(0, res); - } - block_deinit(block); -} - -TEST(block, if1) { - PikaObj* block = block_init(NULL); - if_setAssert(block, (char*)"if 1 :"); - if_pushLine(block, (char*)" print('hello')"); - if_pushLine(block, (char*)" print('hello2')"); - char* assert = block_getAssert(block); - ASSERT_STREQ((char*)"1 ", assert); - int res = block_checkAssert(block); - char* line1 = block_popLine(block); - ASSERT_STREQ((char*)"print('hello')", line1); - char* line2 = block_popLine(block); - ASSERT_STREQ((char*)"print('hello2')", line2); - ASSERT_EQ(1, res); - block_deinit(block); -} - -TEST(block, if2) { - PikaObj* obj = New_TinyObj(NULL); - obj_run(obj, (char*)"if 1 :"); - obj_deinit(obj); -} - -TEST(block, if3) { - PikaObj* obj = New_TinyObj(NULL); - obj_run(obj, (char*)"if 1 :"); - obj_run(obj, (char*)" print('hello')"); - obj_run(obj, (char*)" print('hello2')"); - PikaObj* block = obj_getObj(obj, (char*)"_block", 0); - char* mode = block_getMode(block); - ASSERT_STREQ((char*)"if", mode); - char* assert = block_getAssert(block); - ASSERT_STREQ((char*)"1 ", assert); - char* line1 = block_popLine(block); - ASSERT_STREQ((char*)"print('hello')", line1); - char* line2 = block_popLine(block); - ASSERT_STREQ((char*)"print('hello2')", line2); - obj_deinit(obj); -} - -TEST(block, ifrun1) { - PikaObj* obj = newRootObj((char*)"root", New_BaseObj); - obj_run(obj, (char*)"if 1 :"); - obj_run(obj, (char*)" a = 1"); - obj_run(obj, (char*)" b = 2"); - obj_run(obj, (char*)""); - int a = obj_getInt(obj, (char*)"a"); - int b = obj_getInt(obj, (char*)"b"); - ASSERT_EQ(a, 1); - ASSERT_EQ(b, 2); - obj_deinit(obj); -} - -TEST(block, ifrun2) { - PikaObj* obj = newRootObj((char*)"root", New_BaseObj); - obj_run(obj, (char*)"if 0 :"); - PikaObj* block = obj_getObj(obj, (char*)"_block", 0); - char* assert = block_getAssert(block); - uint8_t res = block_checkAssert(block); - ASSERT_EQ(res, 0); - obj_deinit(obj); -} diff --git a/src/PikaParser.c b/src/PikaParser.c index 81382325e..199814c78 100644 --- a/src/PikaParser.c +++ b/src/PikaParser.c @@ -141,8 +141,17 @@ static int32_t getPyLineBlockDeepth(char* line) { AST* pikaParseLine(char* line) { AST* ast = New_queueObj(); Args* buffs = New_strBuff(); - obj_setInt(ast, "blockDeepth", getPyLineBlockDeepth(line)); - char* stmt = strsGetCleanCmd(buffs, line); + uint8_t blockDeepth = getPyLineBlockDeepth(line); + obj_setInt(ast, "blockDeepth", blockDeepth); + char* lineStart = line + blockDeepth * 4; + char* stmt = lineStart; + if (0 == strncmp(lineStart, (char*)"while ", 6)) { + stmt = strsCut(buffs, lineStart, ' ', ':'); + } + if (0 == strncmp(lineStart, (char*)"if ", 3)) { + stmt = strsCut(buffs, lineStart, ' ', ':'); + } + stmt = strsGetCleanCmd(buffs, stmt); ast = AST_parseStmt(ast, stmt); goto exit; exit: diff --git a/src/PikaVM.c b/src/PikaVM.c index 46f78dd75..37a62a8f5 100644 --- a/src/PikaVM.c +++ b/src/PikaVM.c @@ -238,6 +238,7 @@ int32_t pikaVM_runAsmLine(PikaObj* self, /* Found new script Line, clear the queues*/ if ('B' == line[0]) { clearQueues(self); + uint8_t blockDeepth = line[1] - '0'; goto nextLine; }