mirror of
https://gitee.com/Lyon1998/pikapython.git
synced 2025-01-29 17:22:56 +08:00
check range when parse 'for loop'
This commit is contained in:
parent
5052453ba3
commit
94ff412dc9
@ -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"
|
||||
|
@ -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);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user