for_for_range parse error in DEL __list[x]

This commit is contained in:
lyon 2021-12-28 09:20:04 +08:00
parent d9b4666032
commit a1cdd62a31
4 changed files with 91 additions and 7 deletions

View File

@ -6,6 +6,3 @@ from PikaObj import *
for i in range(0, 100): for i in range(0, 100):
print(i) print(i)
for i in range(0, 10):
print(i)

View File

@ -1444,3 +1444,68 @@ TEST(parser, for_list) {
args_deinit(bf); args_deinit(bf);
EXPECT_EQ(pikaMemNow(), 0); EXPECT_EQ(pikaMemNow(), 0);
} }
// TEST(parser, for_for_range) {
// pikaMemInfo.heapUsedMax = 0;
// Args* buffs = New_strBuff();
// char* lines = (char*)
// "a = 0\n"
// "for i in range(0, 10):\n"
// " for k in range(0, 3):\n"
// " print(k)\n"
// " a = a + k\n"
// "\n"
// ;
// printf("%s", lines);
// char* pikaAsm = Parser_multiLineToAsm(buffs, (char*)lines);
// printf("%s", pikaAsm);
// EXPECT_STREQ(pikaAsm,(char *)
// "B0\n"
// "1 REF a\n"
// "1 NUM 1\n"
// "0 OPT >\n"
// "0 JEZ 1\n"
// "B1\n"
// "0 NUM 1\n"
// "0 OUT b\n"
// "B0\n"
// "0 NEL 1\n"
// "1 REF a\n"
// "1 NUM 2\n"
// "0 OPT >\n"
// "0 JEZ 1\n"
// "B1\n"
// "0 NUM 2\n"
// "0 OUT b\n"
// "B1\n"
// "1 REF a\n"
// "1 NUM 1\n"
// "0 OPT >\n"
// "0 JEZ 1\n"
// "B2\n"
// "0 NUM 1\n"
// "0 OUT b\n"
// "B1\n"
// "0 NEL 1\n"
// "1 REF a\n"
// "1 NUM 2\n"
// "0 OPT >\n"
// "0 JEZ 1\n"
// "B2\n"
// "0 NUM 2\n"
// "0 OUT b\n"
// "B1\n"
// "0 NEL 1\n"
// "B2\n"
// "0 NUM 3\n"
// "0 OUT b\n"
// "B0\n"
// "0 NEL 1\n"
// "B1\n"
// "0 NUM 3\n"
// "0 OUT b\n"
// "B0\n"
// );
// args_deinit(buffs);
// EXPECT_EQ(pikaMemNow(), 0);
// }

View File

@ -378,4 +378,27 @@ TEST(pikaMain, for_in_range) {
obj_deinit(pikaMain); obj_deinit(pikaMain);
/* mem check */ /* mem check */
EXPECT_EQ(pikaMemNow(), 0); EXPECT_EQ(pikaMemNow(), 0);
} }
// TEST(pikaMain, for_for_in_range) {
// /* init */
// pikaMemInfo.heapUsedMax = 0;
// PikaObj* pikaMain = newRootObj((char*)"pikaMain", New_PikaMain);
// /* run */
// obj_runDirect(pikaMain, (char*)
// "a = 0\n"
// "for i in range(0, 10):\n"
// " for k in range(0, 3):\n"
// " print(k)\n"
// " a = a + k\n"
// "\n"
// );
// /* collect */
// int a = obj_getInt(pikaMain, (char*)"a");
// /* assert */
// EXPECT_EQ(a, 45);
// /* deinit */
// obj_deinit(pikaMain);
// /* mem check */
// EXPECT_EQ(pikaMemNow(), 0);
// }

View File

@ -747,8 +747,8 @@ AST* AST_parseLine(char* line, Stack* blockStack) {
} }
goto block_matched; goto block_matched;
} }
if (0 == strncmp(line, (char*)"for ", 4)) { if (0 == strncmp(lineStart, (char*)"for ", 4)) {
char* tokens = Lexer_getTokens(buffs, line + 4); char* tokens = Lexer_getTokens(buffs, lineStart + 4);
Lexer_popToken(buffs, tokens); Lexer_popToken(buffs, tokens);
char* arg_in = Lexer_popToken(buffs, tokens) + 1; char* arg_in = Lexer_popToken(buffs, tokens) + 1;
obj_setStr(ast, "arg_in", arg_in); obj_setStr(ast, "arg_in", arg_in);
@ -756,7 +756,6 @@ AST* AST_parseLine(char* line, Stack* blockStack) {
char* token = ""; char* token = "";
Args* list_buffs = New_strBuff(); Args* list_buffs = New_strBuff();
char* list_in = strsCopy(list_buffs, ""); char* list_in = strsCopy(list_buffs, "");
uint8_t isRange = 0;
token = Lexer_popToken(list_buffs, tokens) + 1; token = Lexer_popToken(list_buffs, tokens) + 1;
if (strEqu("range", token)) { if (strEqu("range", token)) {
obj_setInt(ast, "isRange", 1); obj_setInt(ast, "isRange", 1);