From 9dea4765fd9db17cd2aa9216bf4250030194655b Mon Sep 17 00:00:00 2001 From: lyon1998 Date: Sat, 2 Apr 2022 15:48:44 +0800 Subject: [PATCH] reconnize '-' as operator always --- port/linux/.vscode/launch.json | 2 +- port/linux/test/parse-test.cpp | 72 +++++++++++++++++++++++----------- src/PikaParser.c | 38 ++++++------------ src/PikaVM.c | 36 ++++++++++++++++- 4 files changed, 95 insertions(+), 53 deletions(-) diff --git a/port/linux/.vscode/launch.json b/port/linux/.vscode/launch.json index 8f6f1fde9..a0afd6b6a 100644 --- a/port/linux/.vscode/launch.json +++ b/port/linux/.vscode/launch.json @@ -19,7 +19,7 @@ // "program": "${workspaceFolder}/../build/src/boot/demo06-pikamain/pikascript_demo06-pikamain", "args": [ // "--gtest_filter=VM.a_jjcc", - "--gtest_filter=parser.a_cuohao_j", + // "--gtest_filter=parser.a_cuohao_j", // "--gtest_filter=lexser.jjcc", // "--gtest_filter=lexser.a_j", // "--gtest_filter=VM.for_break_byte", diff --git a/port/linux/test/parse-test.cpp b/port/linux/test/parse-test.cpp index fef396d06..cd255d63a 100644 --- a/port/linux/test/parse-test.cpp +++ b/port/linux/test/parse-test.cpp @@ -857,11 +857,16 @@ TEST(parser, signed_num) { char* lines = (char*)"a = -1\n"; printf("%s", lines); char* pikaAsm = Parser_multiLineToAsm(buffs, (char*)lines); + char* tokens_print = + Lexer_printTokens(buffs, Lexer_getTokens(buffs, lines)); + printf("%s", tokens_print); + EXPECT_STREQ(tokens_print, (char*)"{sym}a{opt}={opt}-{lit}1\n"); printf("%s", pikaAsm); EXPECT_STREQ(pikaAsm,(char *) - "B0\n" - "0 NUM -1\n" - "0 OUT a\n" + "B0\n" + "1 NUM 1\n" + "0 OPT -\n" + "0 OUT a\n" ); args_deinit(buffs); EXPECT_EQ(pikaMemNow(), 0); @@ -877,7 +882,8 @@ TEST(parser, comp_signed_num) { EXPECT_STREQ(pikaAsm,(char *) "B0\n" "1 REF a\n" - "1 NUM -1\n" + "2 NUM 1\n" + "1 OPT -\n" "0 OPT >\n" "0 JEZ 1\n" ); @@ -949,7 +955,7 @@ TEST(lexser, symbol_Nag) { printf((char*)"%s\n", printTokens); /* assert */ - EXPECT_STREQ(printTokens, "{lit}-10{opt}-{lit}20"); + EXPECT_STREQ(printTokens, "{opt}-{lit}10{opt}-{lit}20"); /* deinit */ args_deinit(buffs); @@ -1001,7 +1007,7 @@ TEST(lexser, symbol_2) { /* assert */ EXPECT_STREQ(printTokens, "{sym}a{opt}+{sym}b{opt}-{sym}c{dvd}({lit}25{opt}**={sym}ek{" - "dvd}){opt}!={lit}-28"); + "dvd}){opt}!={opt}-{lit}28"); /* deinit */ args_deinit(buffs); @@ -1105,9 +1111,10 @@ TEST(parser, mm) { printf("%s", pikaAsm); EXPECT_STREQ(pikaAsm,(char *) "B0\n" - "1 REF a\n" - "1 NUM -1\n" - "0 OPT **\n" + "2 REF a\n" + "1 OPT **\n" + "1 NUM 1\n" + "0 OPT -\n" "0 OUT a\n" ); args_deinit(buffs); @@ -1135,51 +1142,61 @@ TEST(parser, self_inc) { EXPECT_STREQ(pikaAsm,(char *) "B0\n" "1 REF a\n" - "2 NUM -1\n" + "3 NUM 1\n" + "2 OPT -\n" "1 RUN \n" "0 OPT +\n" "0 OUT a\n" "B0\n" "1 REF a\n" - "2 NUM -1\n" + "3 NUM 1\n" + "2 OPT -\n" "1 RUN \n" "0 OPT -\n" "0 OUT a\n" "B0\n" "1 REF a\n" - "2 NUM -1\n" + "3 NUM 1\n" + "2 OPT -\n" "1 RUN \n" "0 OPT *\n" "0 OUT a\n" "B0\n" "1 REF a\n" - "2 NUM -1\n" + "3 NUM 1\n" + "2 OPT -\n" "1 RUN \n" "0 OPT /\n" "0 OUT a\n" "B0\n" "1 REF a\n" - "1 NUM -1\n" + "2 NUM 1\n" + "1 OPT -\n" "0 OPT **=\n" "B0\n" "1 REF a\n" - "1 NUM -1\n" + "2 NUM 1\n" + "1 OPT -\n" "0 OPT //=\n" "B0\n" "1 REF a\n" - "1 NUM -1\n" + "2 NUM 1\n" + "1 OPT -\n" "0 OPT >=\n" "B0\n" "1 REF a\n" - "1 NUM -1\n" + "2 NUM 1\n" + "1 OPT -\n" "0 OPT <=\n" "B0\n" "1 REF a\n" - "1 NUM -1\n" + "2 NUM 1\n" + "1 OPT -\n" "0 OPT !=\n" "B0\n" "1 REF a\n" - "1 NUM -1\n" + "2 NUM 1\n" + "1 OPT -\n" "0 OPT %=\n" ); args_deinit(buffs); @@ -1195,8 +1212,9 @@ TEST(parser, n_n1) { printf("%s", pikaAsm); EXPECT_STREQ(pikaAsm,(char *) "B0\n" - "1 NUM -1\n" - "0 OPT ~\n" + "1 OPT ~\n" + "1 NUM 1\n" + "0 OPT -\n" "0 OUT a\n" ); args_deinit(buffs); @@ -2719,10 +2737,18 @@ TEST(parser, a_cuohao_j) { pikaMemInfo.heapUsedMax = 0; Args* buffs = New_strBuff(); char* lines = (char*)"a = (3 - 4) - 4\n"; - char* tokens = Lexer_getTokens(buffs, lines); - printf("%s\n", Lexer_printTokens(buffs, tokens)); + printf("%s\n", Lexer_printTokens(buffs, Lexer_getTokens(buffs, lines))); printf("%s", lines); char* pikaAsm = Parser_multiLineToAsm(buffs, (char*)lines); + EXPECT_STREQ(pikaAsm, (char*) + "B0\n" + "3 NUM 3\n" + "3 NUM 4\n" + "2 OPT -\n" + "1 RUN \n" + "1 NUM 4\n" + "0 OPT -\n" + "0 OUT a\n"); printf("%s", pikaAsm); args_deinit(buffs); EXPECT_EQ(pikaMemNow(), 0); diff --git a/src/PikaParser.c b/src/PikaParser.c index 110d0a82e..a85159f41 100644 --- a/src/PikaParser.c +++ b/src/PikaParser.c @@ -305,8 +305,7 @@ Arg* Lexer_setSymbel(Arg* tokens_arg, __platform_memcpy(symbol_buff, stmt + *symbol_start_index, i - *symbol_start_index); /* literal */ - if ((symbol_buff[0] == '-') || (symbol_buff[0] == '\'') || - (symbol_buff[0] == '"') || + if ((symbol_buff[0] == '\'') || (symbol_buff[0] == '"') || ((symbol_buff[0] >= '0') && (symbol_buff[0] <= '9'))) { tokens_arg = Lexer_setToken(tokens_arg, TOKEN_literal, symbol_buff); } else { @@ -458,33 +457,18 @@ char* Lexer_getTokens(Args* outBuffs, char* stmt) { continue; } } - /* single */ + + /* single operator */ + /* + +, -, *, ... / + */ char content[2] = {0}; content[0] = c0; - if ('-' != c0) { - tokens_arg = - Lexer_setSymbel(tokens_arg, stmt, i, &symbol_start_index); - tokens_arg = - Lexer_setToken(tokens_arg, TOKEN_operator, content); - continue; - } - /* when c0 is '-' */ - if (!((c1 >= '0') && (c1 <= '9'))) { - /* is a '-' */ - tokens_arg = - Lexer_setSymbel(tokens_arg, stmt, i, &symbol_start_index); - tokens_arg = - Lexer_setToken(tokens_arg, TOKEN_operator, content); - continue; - } - if (i != symbol_start_index) { - /* is a '-' */ - tokens_arg = - Lexer_setSymbel(tokens_arg, stmt, i, &symbol_start_index); - tokens_arg = - Lexer_setToken(tokens_arg, TOKEN_operator, content); - continue; - } + tokens_arg = + Lexer_setSymbel(tokens_arg, stmt, i, &symbol_start_index); + tokens_arg = Lexer_setToken(tokens_arg, TOKEN_operator, content); + continue; + /* is a symbel */ continue; } diff --git a/src/PikaVM.c b/src/PikaVM.c index ca398e4ac..61685b4ec 100644 --- a/src/PikaVM.c +++ b/src/PikaVM.c @@ -430,10 +430,42 @@ static Arg* VM_instruction_handler_JEZ(PikaObj* self, VMState* vs, char* data) { return NULL; } +static uint8_t VMState_getInputArgNum(VMState* vs) { + InstructUnit* ins_unit_now = VMState_getInstructNow(vs); + uint8_t invode_deepth_this = instructUnit_getInvokeDeepth(ins_unit_now); + int32_t pc_this = vs->pc; + uint8_t num = 0; + while (1) { + ins_unit_now--; + pc_this -= instructUnit_getSize(ins_unit_now); + uint8_t invode_deepth = instructUnit_getInvokeDeepth(ins_unit_now); + if (invode_deepth == invode_deepth_this + 1) { + num++; + } + if (invode_deepth <= invode_deepth_this) { + break; + } + if (pc_this <= 0) { + break; + } + } + return num; +} + static Arg* VM_instruction_handler_OPT(PikaObj* self, VMState* vs, char* data) { Arg* outArg = NULL; - Arg* arg2 = stack_popArg(&(vs->stack)); - Arg* arg1 = stack_popArg(&(vs->stack)); + uint8_t input_arg_num = VMState_getInputArgNum(vs); + Arg* arg2; + Arg* arg1; + if (input_arg_num == 2) { + /* tow input */ + arg2 = stack_popArg(&(vs->stack)); + arg1 = stack_popArg(&(vs->stack)); + } else if (input_arg_num == 1) { + /* only one input */ + arg2 = stack_popArg(&(vs->stack)); + arg1 = arg_setNull(NULL); + } ArgType type_arg1 = arg_getType(arg1); ArgType type_arg2 = arg_getType(arg2); int num1_i = 0;