parse multiline is ok

This commit is contained in:
lyon1998 2021-10-17 19:07:33 +08:00
parent faed5a9ff6
commit 46515f6811
5 changed files with 67 additions and 2 deletions

View File

@ -366,4 +366,40 @@ TEST(parser, while_true_if_false_both_exit) {
stack_deinit(bs);
args_deinit(bf);
EXPECT_EQ(pikaMemNow(), 0);
}
TEST(parser, multiLine) {
Args* buffs = New_strBuff();
char* lines =(char *)
"while true:\n"
" rgb.flow()\n"
" if false:\n"
" a=3\n"
" test.on(add(2,3))\n"
"\n";
printf("%s", lines);
char* pikaAsm = pikaParseMultiLineToAsm(buffs, (char*)lines);
printf("%s", pikaAsm);
EXPECT_STREQ(pikaAsm,
"B0\n"
"0 REF true\n"
"0 JEZ 2\n"
"B1\n"
"0 RUN rgb.flow\n"
"B1\n"
"0 REF false\n"
"0 JEZ 1\n"
"B2\n"
"0 NUM 3\n"
"0 OUT a\n"
"B2\n"
"2 NUM 2\n"
"2 NUM 3\n"
"1 RUN add\n"
"0 RUN test.on\n"
"B0\n"
"0 JMP -1\n"
"B0\n");
args_deinit(buffs);
EXPECT_EQ(pikaMemNow(), 0);
}

View File

@ -191,6 +191,27 @@ char* pikaParseLineToAsm(Args* buffs, char* line, Stack* blockStack) {
return pikaAsm;
}
char* pikaParseMultiLineToAsm(Args* outBuffs, char* multiLine) {
Args* multiRunBuffs = New_strBuff();
Stack* blockStack = New_Stack();
char* pikaAsm = strsCopy(multiRunBuffs, "");
multiLine = strsCopy(multiRunBuffs, multiLine);
while (1) {
char* line = strsPopToken(multiRunBuffs, multiLine, '\n');
Args* singleRunBuffs = New_strBuff();
char* singleAsm = pikaParseLineToAsm(singleRunBuffs, line, blockStack);
pikaAsm = strsAppend(multiRunBuffs, pikaAsm, singleAsm);
args_deinit(singleRunBuffs);
if (strGetSize(multiLine) == 0) {
break;
}
}
char* multiAsm = strsCopy(outBuffs, pikaAsm);
args_deinit(multiRunBuffs);
stack_deinit(blockStack);
return multiAsm;
}
char* AST_appandPikaAsm(AST* ast, AST* subAst, Args* buffs, char* pikaAsm) {
uint32_t deepth = obj_getInt(ast, "deepth");
while (1) {

View File

@ -8,5 +8,6 @@ AST* pikaParseLine(char* line, Stack* blockStack);
char* pikaParseLineToAsm(Args* buffs, char* line, Stack* blockStack);
int32_t AST_deinit(AST* ast);
char* AST_toPikaAsm(AST* ast, Args* buffs);
char* pikaParseMultiLineToAsm(Args* outBuffs, char* multiLine);
#endif

View File

@ -16,7 +16,7 @@ static int32_t getLineSize(char* str) {
i++;
}
}
enum Instruct { NON, REF, RUN, STR, OUT, NUM };
enum Instruct { NON, REF, RUN, STR, OUT, NUM, JMP, JEZ};
static char* strs_getLine(Args* buffs, char* code) {
int32_t lineSize = getLineSize(code);
@ -42,6 +42,12 @@ static enum Instruct getInstruct(char* line) {
if (0 == strncmp(line + 2, "OUT", 3)) {
return OUT;
}
if (0 == strncmp(line + 2, "JMP", 3)) {
return JMP;
}
if (0 == strncmp(line + 2, "JEZ", 3)) {
return JEZ;
}
return NON;
}

View File

@ -160,7 +160,8 @@ char* strPopToken(char* strOut, char* strIn, char sign) {
int32_t i = 0;
for (i = 0; i < size; i++) {
if (getSign) {
strIn[iPoped++] = strIn[i];
strIn[iPoped] = strIn[i];
iPoped++;
continue;
}
if (strIn[i] != sign) {