parse def to DEF and JMP is ok

This commit is contained in:
pikasTech 2021-10-31 16:48:53 +08:00
parent 4e6d66380b
commit aaed9eb538
3 changed files with 39 additions and 6 deletions

View File

@ -337,7 +337,6 @@ TEST(VM, mem_x) {
obj_deinit(self);
obj_deinit(globals);
args_deinit(buffs);
ASSERT_FLOAT_EQ(res, 2);
EXPECT_EQ(pikaMemNow(), 0);
}
@ -345,7 +344,6 @@ TEST(VM, DEF_instruct) {
char* pikaAsm = (char*)
"B0\n"
"0 DEF test()\n"
"B0\n"
"0 JMP 1\n"
"B1\n"
"0 NUM 1\n"
@ -391,7 +389,6 @@ TEST(VM, RUN_DEF) {
char* pikaAsm = (char*)
"B0\n"
"0 DEF test()\n"
"B0\n"
"0 JMP 1\n"
"B1\n"
"0 NUM 1\n"
@ -415,7 +412,6 @@ TEST(VM, RUN_global) {
"0 OUT a\n"
"B0\n"
"0 DEF test()\n"
"B0\n"
"0 JMP 1\n"
"B1\n"
"0 REF a\n"
@ -441,7 +437,6 @@ TEST(VM, RUN_local_b) {
"0 OUT a\n"
"B0\n"
"0 DEF test()\n"
"B0\n"
"0 JMP 1\n"
"B1\n"
"0 REF a\n"
@ -471,7 +466,6 @@ TEST(VM, RUN_DEF_add) {
char* pikaAsm = (char*)
"B0\n"
"0 DEF add(a,b)\n"
"B0\n"
"0 JMP 1\n"
"B1\n"
"1 REF b\n"

View File

@ -703,3 +703,26 @@ TEST(parser, equ_method) {
args_deinit(buffs);
EXPECT_EQ(pikaMemNow(), 0);
}
TEST(parser, def_add) {
pikaMemInfo.heapUsedMax = 0;
Args* buffs = New_strBuff();
char* lines = (char*)
"def add(a, b):\n"
" a + b\n"
;
printf("%s", lines);
char* pikaAsm = pikaParseMultiLineToAsm(buffs, (char*)lines);
printf("%s", pikaAsm);
EXPECT_STREQ(pikaAsm,(char *)
"B0\n"
"0 DEF add(a,b)\n"
"0 JMP 1\n"
"B1\n"
"1 REF a\n"
"1 REF b\n"
"0 OPT +\n"
);
args_deinit(buffs);
EXPECT_EQ(pikaMemNow(), 0);
}

View File

@ -291,6 +291,16 @@ AST* pikaParseLine(char* line, Stack* blockStack) {
stack_pushStr(blockStack, "if");
}
}
if (0 == strncmp(lineStart, (char*)"def ", 4)) {
stmt = "";
char* declear = strsCut(buffs, lineStart, ' ', ':');
declear = strsGetCleanCmd(buffs, declear);
obj_setStr(ast, "block", "def");
obj_setStr(ast, "declear", declear);
if (NULL != blockStack) {
stack_pushStr(blockStack, "def");
}
}
stmt = strsGetCleanCmd(buffs, stmt);
ast = AST_parseStmt(ast, stmt);
goto exit;
@ -460,6 +470,12 @@ char* AST_toPikaAsm(AST* ast, Args* buffs) {
if (strEqu(obj_getStr(ast, "block"), "if")) {
pikaAsm = strsAppend(runBuffs, pikaAsm, "0 JEZ 1\n");
}
if (strEqu(obj_getStr(ast, "block"), "def")) {
pikaAsm = strsAppend(runBuffs, pikaAsm, "0 DEF ");
pikaAsm = strsAppend(runBuffs, pikaAsm, obj_getStr(ast, "declear"));
pikaAsm = strsAppend(runBuffs, pikaAsm, "\n");
pikaAsm = strsAppend(runBuffs, pikaAsm, "0 JMP 1\n");
}
pikaAsm = strsCopy(buffs, pikaAsm);
args_deinit(runBuffs);
return pikaAsm;