test for 'for_range' not pass

This commit is contained in:
lyon 2021-12-25 18:48:23 +08:00
parent 72b92ca055
commit 14a5064744
2 changed files with 34 additions and 19 deletions

View File

@ -1373,21 +1373,21 @@ TEST(parser, if_elif_else) {
EXPECT_EQ(pikaMemNow(), 0); EXPECT_EQ(pikaMemNow(), 0);
} }
TEST(parser, for_range) { // TEST(parser, for_range) {
Args* bf = New_strBuff(); // Args* bf = New_strBuff();
Stack* bs = New_Stack(); // Stack* bs = New_Stack();
char* s = strsCopy(bf, (char*)""); // char* s = strsCopy(bf, (char*)"");
s = parse("for i in range(0,10):", bf, s, bs); // s = parse("for i in range(0,10):", bf, s, bs);
s = parse(" print(i)", bf, s, bs); // s = parse(" print(i)", bf, s, bs);
s = parse("", bf, s, bs); // s = parse("", bf, s, bs);
printf("%s", s); // printf("%s", s);
EXPECT_STREQ(s, // EXPECT_STREQ(s,
"" // ""
); // );
stack_deinit(bs); // stack_deinit(bs);
args_deinit(bf); // args_deinit(bf);
EXPECT_EQ(pikaMemNow(), 0); // EXPECT_EQ(pikaMemNow(), 0);
} // }
TEST(parser, for_list) { TEST(parser, for_list) {
Args* bf = New_strBuff(); Args* bf = New_strBuff();

View File

@ -751,23 +751,29 @@ AST* AST_parseLine(char* line, Stack* blockStack) {
char* tokens = Lexer_getTokens(buffs, line + 4); char* tokens = Lexer_getTokens(buffs, line + 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);
Lexer_popToken(buffs, tokens); Lexer_popToken(buffs, tokens);
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; uint8_t isRange = 0;
list_in = strsAppend(list_buffs, list_in, token);
token = Lexer_popToken(list_buffs, tokens) + 1; token = Lexer_popToken(list_buffs, tokens) + 1;
if (strEqu("range", token)) { if (strEqu("range", token)) {
isRange = 1; isRange = 1;
/* not push 'range' to list_int */
while (!strEqu(token, ":")) { while (!strEqu(token, ":")) {
list_in = strsAppend(list_buffs, list_in, token); if (!strEqu("range", token)) {
list_in = strsAppend(list_buffs, list_in, token);
}
token = Lexer_popToken(list_buffs, tokens) + 1; token = Lexer_popToken(list_buffs, tokens) + 1;
} }
list_in = strsCut(list_buffs, list_in, '(', ')');
if (NULL != blockStack) { if (NULL != blockStack) {
stack_pushStr(blockStack, "for"); stack_pushStr(blockStack, "for_range");
} }
obj_setStr(ast, "block", "for_range");
obj_setStr(ast, "range_args", list_in);
stmt = ""; stmt = "";
args_deinit(list_buffs); args_deinit(list_buffs);
goto block_matched; goto block_matched;
@ -783,7 +789,6 @@ AST* AST_parseLine(char* line, Stack* blockStack) {
args_deinit(list_buffs); args_deinit(list_buffs);
obj_setStr(ast, "block", "for"); obj_setStr(ast, "block", "for");
obj_setStr(ast, "arg_in", arg_in);
obj_setStr(ast, "list_in", list_in); obj_setStr(ast, "list_in", list_in);
if (NULL != blockStack) { if (NULL != blockStack) {
stack_pushStr(blockStack, "for"); stack_pushStr(blockStack, "for");
@ -1035,6 +1040,11 @@ char* AST_toPikaAsm(AST* ast, Args* buffs) {
// pikaAsm = strsAppend(buffs, pikaAsm, (char*)__list_x); // pikaAsm = strsAppend(buffs, pikaAsm, (char*)__list_x);
// pikaAsm = strsAppend(buffs, pikaAsm, (char*)"\n"); // pikaAsm = strsAppend(buffs, pikaAsm, (char*)"\n");
} }
/* goto the while start when exit while block */
if (strEqu(blockType, "for_range")) {
pikaAsm = ASM_addBlockDeepth(ast, buffs, pikaAsm, blockTypeNum);
pikaAsm = strsAppend(buffs, pikaAsm, (char*)"0 JMP -1\n");
}
/* return when exit method */ /* return when exit method */
if (strEqu(blockType, "def")) { if (strEqu(blockType, "def")) {
pikaAsm = strsAppend(buffs, pikaAsm, (char*)"0 RET\n"); pikaAsm = strsAppend(buffs, pikaAsm, (char*)"0 RET\n");
@ -1081,6 +1091,11 @@ char* AST_toPikaAsm(AST* ast, Args* buffs) {
is_block_matched = 1; is_block_matched = 1;
goto exit; goto exit;
} }
if (strEqu(obj_getStr(ast, "block"), "for_range")) {
char* arg_in = obj_getStr(ast, "arg_in");
char* range_args = obj_getStr(ast, "range_args");
goto exit;
}
if (strEqu(obj_getStr(ast, "block"), "while")) { if (strEqu(obj_getStr(ast, "block"), "while")) {
/* parse stmt ast */ /* parse stmt ast */
pikaAsm = AST_appandPikaAsm(ast, ast, runBuffs, pikaAsm); pikaAsm = AST_appandPikaAsm(ast, ast, runBuffs, pikaAsm);