mirror of
https://gitee.com/Lyon1998/pikapython.git
synced 2025-01-29 17:22:56 +08:00
reconnize '-' as operator always
This commit is contained in:
parent
85f5265f98
commit
9dea4765fd
2
port/linux/.vscode/launch.json
vendored
2
port/linux/.vscode/launch.json
vendored
@ -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",
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
36
src/PikaVM.c
36
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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user