check range when parse 'for loop'

This commit is contained in:
lyon 2021-12-25 14:19:20 +08:00
parent 5052453ba3
commit 94ff412dc9
2 changed files with 44 additions and 19 deletions

View File

@ -1373,11 +1373,27 @@ TEST(parser, if_elif_else) {
EXPECT_EQ(pikaMemNow(), 0);
}
TEST(parser, for_range) {
Args* bf = New_strBuff();
Stack* bs = New_Stack();
char* s = strsCopy(bf, (char*)"");
s = parse("for i in range(0,10):", bf, s, bs);
s = parse(" print(i)", bf, s, bs);
s = parse("", bf, s, bs);
printf("%s", s);
EXPECT_STREQ(s,
""
);
stack_deinit(bs);
args_deinit(bf);
EXPECT_EQ(pikaMemNow(), 0);
}
TEST(parser, for_list) {
Args* bf = New_strBuff();
Stack* bs = New_Stack();
char* s = strsCopy(bf, (char*)"");
s = parse("for arg in range(0,10):", bf, s, bs);
s = parse("for arg in xrange(0,10):", bf, s, bs);
s = parse(" print(arg)", bf, s, bs);
s = parse("", bf, s, bs);
printf("%s", s);
@ -1385,7 +1401,7 @@ TEST(parser, for_list) {
"B0\n"
"2 NUM 0\n"
"2 NUM 10\n"
"1 RUN range\n"
"1 RUN xrange\n"
"0 RUN iter\n"
"0 OUT __list0\n"
"B0\n"

View File

@ -754,25 +754,33 @@ AST* AST_parseLine(char* line, Stack* blockStack) {
Lexer_popToken(buffs, tokens);
char* token = "";
Args *list_buffs = New_strBuff();
Args* list_buffs = New_strBuff();
char* list_in = strsCopy(list_buffs, "");
do {
uint8_t isRange = 0;
list_in = strsAppend(list_buffs, list_in, token);
token = Lexer_popToken(list_buffs, tokens) + 1;
if (strEqu("range", token)) {
// isRange = 1;
}
while (!strEqu(token, ":")) {
list_in = strsAppend(list_buffs, list_in, token);
token = Lexer_popToken(list_buffs, tokens) + 1;
} while (!strEqu(token, ":"));
list_in = strsAppend(list_buffs, "iter(", list_in);
list_in = strsAppend(list_buffs, list_in, ")");
list_in = strsCopy(buffs, list_in);
args_deinit(list_buffs);
obj_setStr(ast, "block", "for");
obj_setStr(ast, "arg_in", arg_in);
obj_setStr(ast, "list_in", list_in);
if (NULL != blockStack) {
stack_pushStr(blockStack, "for");
}
stmt = list_in;
goto block_matched;
if (!isRange) {
list_in = strsAppend(list_buffs, "iter(", list_in);
list_in = strsAppend(list_buffs, list_in, ")");
list_in = strsCopy(buffs, list_in);
args_deinit(list_buffs);
obj_setStr(ast, "block", "for");
obj_setStr(ast, "arg_in", arg_in);
obj_setStr(ast, "list_in", list_in);
if (NULL != blockStack) {
stack_pushStr(blockStack, "for");
}
stmt = list_in;
goto block_matched;
}
}
if (0 == strncmp(lineStart, (char*)"if ", 3)) {
stmt = strsCut(buffs, lineStart, ' ', ':');
@ -1008,8 +1016,8 @@ char* AST_toPikaAsm(AST* ast, Args* buffs) {
pikaAsm = ASM_addBlockDeepth(ast, buffs, pikaAsm, blockTypeNum);
pikaAsm = strsAppend(buffs, pikaAsm, (char*)"0 JMP -1\n");
/* garbage collect for the list */
// pikaAsm = ASM_addBlockDeepth(ast, buffs, pikaAsm, blockTypeNum);
// char* __list_x = strsCopy(buffs, "__list");
// pikaAsm = ASM_addBlockDeepth(ast, buffs, pikaAsm,
// blockTypeNum); char* __list_x = strsCopy(buffs, "__list");
// char block_deepth_str[] = "0";
// block_deepth_str[0] += obj_getInt(ast, "blockDeepth");
// __list_x = strsAppend(runBuffs, __list_x, block_deepth_str);
@ -1117,6 +1125,7 @@ exit:
args_deinit(runBuffs);
return pikaAsm;
}
int32_t AST_deinit(AST* ast) {
return obj_deinit(ast);
}