parse to asm direct

This commit is contained in:
lyon1998 2021-10-14 10:44:59 +08:00
parent db928b1ec1
commit d46112705f
3 changed files with 25 additions and 15 deletions

View File

@ -12,6 +12,7 @@ TEST(parser, NEW) {
char* pikaAsm = AST_toPikaAsm(ast, buffs); char* pikaAsm = AST_toPikaAsm(ast, buffs);
printf("%s", pikaAsm); printf("%s", pikaAsm);
args_deinit(buffs); args_deinit(buffs);
AST_deinit(ast);
EXPECT_EQ(pikaMemNow(), 0); EXPECT_EQ(pikaMemNow(), 0);
} }
@ -22,6 +23,7 @@ TEST(parser, add_a_b) {
printf("%s", pikaAsm); printf("%s", pikaAsm);
EXPECT_STREQ(pikaAsm, "1 REF a\n1 REF b\n0 RUN add\n"); EXPECT_STREQ(pikaAsm, "1 REF a\n1 REF b\n0 RUN add\n");
args_deinit(buffs); args_deinit(buffs);
AST_deinit(ast);
EXPECT_EQ(pikaMemNow(), 0); EXPECT_EQ(pikaMemNow(), 0);
} }
@ -30,8 +32,10 @@ TEST(parser, add_a_b_c) {
Args* buffs = New_strBuff(); Args* buffs = New_strBuff();
char* pikaAsm = AST_toPikaAsm(ast, buffs); char* pikaAsm = AST_toPikaAsm(ast, buffs);
printf("%s", pikaAsm); printf("%s", pikaAsm);
EXPECT_STREQ(pikaAsm, "2 REF a\n2 REF b\n1 RUN add\n1 REF c\n0 RUN add\n0 OUT d\n"); EXPECT_STREQ(pikaAsm,
"2 REF a\n2 REF b\n1 RUN add\n1 REF c\n0 RUN add\n0 OUT d\n");
args_deinit(buffs); args_deinit(buffs);
AST_deinit(ast);
EXPECT_EQ(pikaMemNow(), 0); EXPECT_EQ(pikaMemNow(), 0);
} }
@ -41,40 +45,39 @@ TEST(parser, method1) {
char* pikaAsm = AST_toPikaAsm(ast, buffs); char* pikaAsm = AST_toPikaAsm(ast, buffs);
printf("%s", pikaAsm); printf("%s", pikaAsm);
EXPECT_STREQ(pikaAsm, EXPECT_STREQ(pikaAsm,
"2 REF a\n2 REF se.b\n1 RUN b.add\n1 REF pmw.c\n0 RUN a.add\n0 OUT d.p\n"); "2 REF a\n2 REF se.b\n1 RUN b.add\n1 REF pmw.c\n0 RUN "
"a.add\n0 OUT d.p\n");
args_deinit(buffs); args_deinit(buffs);
AST_deinit(ast);
EXPECT_EQ(pikaMemNow(), 0); EXPECT_EQ(pikaMemNow(), 0);
} }
TEST(parser, method2) { TEST(parser, method2) {
AST* ast = char* line = (char*)"d.p = a.add(b.add(a,se.b,diek(pp)) , pmw.c())";
pikaParse((char*)"d.p = a.add(b.add(a,se.b,diek(pp)) , pmw.c())");
Args* buffs = New_strBuff(); Args* buffs = New_strBuff();
char* pikaAsm = AST_toPikaAsm(ast, buffs); char* pikaAsm = pikaParseToAsm(buffs, line);
printf("%s", pikaAsm); printf("%s", pikaAsm);
EXPECT_STREQ(pikaAsm, EXPECT_STREQ(pikaAsm,
"2 REF a\n2 REF se.b\n3 REF pp\n2 RUN diek\n1 RUN b.add\n1 RUN pmw.c\n0 RUN a.add\n0 OUT d.p\n"); "2 REF a\n2 REF se.b\n3 REF pp\n2 RUN diek\n1 RUN b.add\n1 "
"RUN pmw.c\n0 RUN a.add\n0 OUT d.p\n");
args_deinit(buffs); args_deinit(buffs);
EXPECT_EQ(pikaMemNow(), 0); EXPECT_EQ(pikaMemNow(), 0);
} }
TEST(parser, str1) { TEST(parser, str1) {
AST* ast = char* line = (char*)"literal('2.322')";
pikaParse((char*)"literal('2.322')");
Args* buffs = New_strBuff(); Args* buffs = New_strBuff();
char* pikaAsm = AST_toPikaAsm(ast, buffs); char* pikaAsm = pikaParseToAsm(buffs, line);
printf("%s", pikaAsm); printf("%s", pikaAsm);
EXPECT_STREQ(pikaAsm, EXPECT_STREQ(pikaAsm, "1 STR 2.322\n0 RUN literal\n");
"1 STR 2.322\n0 RUN literal\n");
args_deinit(buffs); args_deinit(buffs);
EXPECT_EQ(pikaMemNow(), 0); EXPECT_EQ(pikaMemNow(), 0);
} }
TEST(parser, str2) { TEST(parser, str2) {
AST* ast = char* line = (char*)"b=add(a,literal('1'))";
pikaParse((char*)"b=add(a,literal('1'))");
Args* buffs = New_strBuff(); Args* buffs = New_strBuff();
char* pikaAsm = AST_toPikaAsm(ast, buffs); char* pikaAsm = pikaParseToAsm(buffs, line);
printf("%s", pikaAsm); printf("%s", pikaAsm);
EXPECT_STREQ(pikaAsm, EXPECT_STREQ(pikaAsm,
"1 REF a\n2 STR 1\n1 RUN literal\n0 RUN add\n0 OUT b\n"); "1 REF a\n2 STR 1\n1 RUN literal\n0 RUN add\n0 OUT b\n");

View File

@ -125,6 +125,13 @@ exit:
return ast; return ast;
} }
char* pikaParseToAsm(Args* buffs, char* line) {
AST* ast = pikaParse(line);
char* pikaAsm = AST_toPikaAsm(ast, buffs);
AST_deinit(ast);
return pikaAsm;
}
char* AST_appandPikaAsm(AST* ast, AST* subAst, Args* buffs, char* pikaAsm) { char* AST_appandPikaAsm(AST* ast, AST* subAst, Args* buffs, char* pikaAsm) {
uint32_t deepth = obj_getInt(ast, "deepth"); uint32_t deepth = obj_getInt(ast, "deepth");
while (1) { while (1) {
@ -169,7 +176,6 @@ char* AST_toPikaAsm(AST* ast, Args* buffs) {
obj_setInt(ast, "deepth", 0); obj_setInt(ast, "deepth", 0);
pikaAsm = AST_appandPikaAsm(ast, ast, runBuffs, pikaAsm); pikaAsm = AST_appandPikaAsm(ast, ast, runBuffs, pikaAsm);
pikaAsm = strsCopy(buffs, pikaAsm); pikaAsm = strsCopy(buffs, pikaAsm);
AST_deinit(ast);
args_deinit(runBuffs); args_deinit(runBuffs);
return pikaAsm; return pikaAsm;
} }

View File

@ -4,6 +4,7 @@
typedef QueueObj AST; typedef QueueObj AST;
AST* pikaParse(char* line); AST* pikaParse(char* line);
char* pikaParseToAsm(Args* buffs, char* line);
int32_t AST_deinit(AST* ast); int32_t AST_deinit(AST* ast);
char* AST_toPikaAsm(AST* ast, Args* buffs); char* AST_toPikaAsm(AST* ast, Args* buffs);