mirror of
https://gitee.com/Lyon1998/pikapython.git
synced 2025-01-29 17:22:56 +08:00
parse multiline is ok
This commit is contained in:
parent
faed5a9ff6
commit
46515f6811
@ -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);
|
||||
}
|
@ -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) {
|
||||
|
@ -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
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user