support get __list by stmt

This commit is contained in:
lyon 2021-12-23 10:09:00 +08:00
parent f7eb334de5
commit 9e345fd0c1
3 changed files with 67 additions and 31 deletions

View File

@ -1377,19 +1377,24 @@ TEST(parser, for_list) {
Args* bf = New_strBuff();
Stack* bs = New_Stack();
char* s = strsCopy(bf, (char*)"");
s = parse("for arg in list:", bf, s, bs);
s = parse("for arg in range(0,10):", bf, s, bs);
s = parse(" print(arg)", bf, s, bs);
s = parse("", bf, s, bs);
printf("%s", s);
EXPECT_STREQ(s,
"B0\n"
"0 RUN list.__iterInit__\n"
"1 NUM 0\n"
"1 NUM 10\n"
"0 RUN range\n"
"0 OUT __list0\n"
"1 REF __list0\n"
"0 RUN iter\n"
"B0\n"
"0 RUN list.__iterContinue__\n"
"0 JEZ 2\n"
"B1\n"
"0 RUN list.__next__\n"
"1 REF __list0\n"
"0 RUN next\n"
"0 OUT arg\n"
"0 EST arg\n"
"0 JEZ 2\n"
"B1\n"
"1 REF arg\n"
"0 RUN print\n"
@ -1400,4 +1405,4 @@ TEST(parser, for_list) {
stack_deinit(bs);
args_deinit(bf);
EXPECT_EQ(pikaMemNow(), 0);
}
}

View File

@ -752,15 +752,20 @@ AST* AST_parseLine(char* line, Stack* blockStack) {
Lexer_popToken(buffs, tokens);
char* arg_in = Lexer_popToken(buffs, tokens) + 1;
Lexer_popToken(buffs, tokens);
char* list_in = Lexer_popToken(buffs, tokens) + 1;
char* token = "";
char* list_in = strsCopy(buffs, "");
do {
list_in = strsAppend(buffs, list_in, token);
token = Lexer_popToken(buffs, tokens) + 1;
} while (!strEqu(token, ":"));
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 = strsCopy(buffs, list_in);
stmt = strsAppend(buffs, stmt, ".__iterContinue__()");
stmt = list_in;
goto block_matched;
}
if (0 == strncmp(lineStart, (char*)"if ", 3)) {
@ -1007,30 +1012,47 @@ char* AST_toPikaAsm(AST* ast, Args* buffs) {
/* match block */
uint8_t is_block_matched = 0;
if (strEqu(obj_getStr(ast, "block"), "while") ||
strEqu(obj_getStr(ast, "block"), "for")) {
if (strEqu(obj_getStr(ast, "block"), "for")) {
/* for "for" iter */
if (strEqu(obj_getStr(ast, "block"), "for")) {
char* list_in = obj_getStr(ast, "list_in");
pikaAsm = strsAppend(runBuffs, pikaAsm, "0 RUN ");
pikaAsm = strsAppend(runBuffs, pikaAsm, list_in);
pikaAsm = strsAppend(runBuffs, pikaAsm, ".__iterInit__\n");
pikaAsm = ASM_addBlockDeepth(ast, buffs, pikaAsm, 0);
}
char* list_in = obj_getStr(ast, "list_in");
char* arg_in = obj_getStr(ast, "arg_in");
char* __list_x = strsCopy(runBuffs, "__list");
char block_deepth_str[] ="0";
block_deepth_str[0] += obj_getInt(ast, "blockDeepth");
__list_x = strsAppend(runBuffs, __list_x, block_deepth_str);
/* init iter */
/* get the __list<x> */
pikaAsm = AST_appandPikaAsm(ast, ast, runBuffs, pikaAsm);
pikaAsm = strsAppend(runBuffs, pikaAsm, "0 OUT ");
pikaAsm = strsAppend(runBuffs, pikaAsm, __list_x);
pikaAsm = strsAppend(runBuffs, pikaAsm, "\n");
/* run iter(__list<x>) */
pikaAsm = strsAppend(runBuffs, pikaAsm, "1 REF ");
pikaAsm = strsAppend(runBuffs, pikaAsm, __list_x);
pikaAsm = strsAppend(runBuffs, pikaAsm, "\n");
pikaAsm = strsAppend(runBuffs, pikaAsm, "0 RUN iter\n");
/* get next */
pikaAsm = ASM_addBlockDeepth(ast, buffs, pikaAsm, 0);
/* run next(__list<x>) */
pikaAsm = strsAppend(runBuffs, pikaAsm, "1 REF ");
pikaAsm = strsAppend(runBuffs, pikaAsm, __list_x);
pikaAsm = strsAppend(runBuffs, pikaAsm, "\n");
pikaAsm = strsAppend(runBuffs, pikaAsm, "0 RUN next\n");
pikaAsm = strsAppend(runBuffs, pikaAsm, "0 OUT ");
pikaAsm = strsAppend(runBuffs, pikaAsm, arg_in);
pikaAsm = strsAppend(runBuffs, pikaAsm, "\n");
/* check item is exist */
pikaAsm = strsAppend(runBuffs, pikaAsm, "0 EST ");
pikaAsm = strsAppend(runBuffs, pikaAsm, arg_in);
pikaAsm = strsAppend(runBuffs, pikaAsm, "\n");
pikaAsm = strsAppend(runBuffs, pikaAsm, "0 JEZ 2\n");
is_block_matched = 1;
goto exit;
}
if (strEqu(obj_getStr(ast, "block"), "while")) {
/* parse stmt ast */
pikaAsm = AST_appandPikaAsm(ast, ast, runBuffs, pikaAsm);
pikaAsm = strsAppend(runBuffs, pikaAsm, "0 JEZ 2\n");
if (strEqu(obj_getStr(ast, "block"), "for")) {
char* list_in = obj_getStr(ast, "list_in");
char* arg_in = obj_getStr(ast, "arg_in");
pikaAsm = ASM_addBlockDeepth(ast, buffs, pikaAsm, 1);
pikaAsm = strsAppend(runBuffs, pikaAsm, "0 RUN ");
pikaAsm = strsAppend(runBuffs, pikaAsm, list_in);
pikaAsm = strsAppend(runBuffs, pikaAsm, ".__next__\n");
pikaAsm = strsAppend(runBuffs, pikaAsm, "0 OUT ");
pikaAsm = strsAppend(runBuffs, pikaAsm, arg_in);
pikaAsm = strsAppend(runBuffs, pikaAsm, "\n");
}
is_block_matched = 1;
goto exit;
}

View File

@ -56,7 +56,8 @@ enum Instruct {
DEF,
RET,
NEL,
DEL
DEL,
EST
};
static char* strs_getLine(Args* buffs, char* code) {
@ -112,6 +113,14 @@ static enum Instruct getInstruct(char* line) {
/* not else */
return NEL;
}
if (0 == strncmp(line + 2, "DEL", 3)) {
/* not else */
return EST;
}
if (0 == strncmp(line + 2, "EST", 3)) {
/* not else */
return EST;
}
return NON;
}