diff --git a/flagpole/fvmstd.fp b/flagpole/fvmstd.fp index 375a695..950aba4 100644 --- a/flagpole/fvmstd.fp +++ b/flagpole/fvmstd.fp @@ -8,16 +8,19 @@ endproc proc putuint @val + if &val 0 == then + 48 :putchar return + endif 1 @divisor - + while &val &divisor u/ 9 u> do 10 &divisor u* @divisor endwhile - + while &divisor 0 u> do &val &divisor u/ 10 u% 48 u+ :putchar - + &divisor 10 u/ @divisor endwhile endproc diff --git a/flagpole/src/main.c b/flagpole/src/main.c index 4afd67d..845df36 100644 --- a/flagpole/src/main.c +++ b/flagpole/src/main.c @@ -68,10 +68,21 @@ bool SBeq(Lz_SB *sb, const char *cstr) { return !memcmp(sb->data, cstr, l); } +void commentStack(void *stack) { + typedef Lz_DA(int) intstack; + intstack *s = stack; + printf(" ; Stack:"); + lz_da_foreach(int, x, *s) { + printf(" %d", *x); + } + printf("\n"); +} + static inline bool isKW(Lz_SB *sb) { return SBeq(sb, "proc") || SBeq(sb, "endproc") + || SBeq(sb, "return") || SBeq(sb, "ld8") || SBeq(sb, "st8") || SBeq(sb, "dup") @@ -199,6 +210,7 @@ codegen: //printf("I must gen code i am now Amista Azozin\n"); //fprintf(stderr,"Token type: %d\n", currTokenKind); //fprintf(stderr,"Tok: "LZ_STR_FMT"\n", LZ_STR_PRINTF(tokenAccumulator)); + printf(" ; "LZ_STR_FMT"\n", LZ_STR_PRINTF(tokenAccumulator)); switch (currTokenKind) { case TOKEN_KEYWORD: { if (SBeq(&tokenAccumulator, "proc")) { @@ -208,9 +220,18 @@ codegen: if (SBeq(&tokenAccumulator, "endproc")) { printf(" Ret\n"); printf("\n\n"); + if (labelStack.cnt != 0) { + fprintf(stderr, + "Unmatched statement in function %s\n", funcName); + exit(1); + } funcName[0] = 0; break; } + if (SBeq(&tokenAccumulator, "return")) { + printf(" Ret\n"); + break; + } if (SBeq(&tokenAccumulator, "ld8")) { printf(" popstack 101\n"); printf(" Ld8 102, 101\n"); @@ -238,6 +259,7 @@ codegen: } if (SBeq(&tokenAccumulator, "while")) { lz_da_append(labelStack, counter); + commentStack(&labelStack); printf("__whilehead_%d:\n", counter); break; } @@ -251,24 +273,27 @@ codegen: } if (SBeq(&tokenAccumulator, "endwhile")) { int lbl = lz_da_pop(labelStack); + commentStack(&labelStack); printf(" Jmp __whilehead_%d\n", lbl); printf("__whiletail_%d:\n", lbl); break; } if (SBeq(&tokenAccumulator, "if")) { lz_da_append(labelStack, counter); + commentStack(&labelStack); break; } if (SBeq(&tokenAccumulator, "then")) { - int lbl = labelStack.data[labelStack.cnt-1]; - //int lbl = lz_da_pop(labelStack); - //lz_da_append(labelStack, lbl); + commentStack(&labelStack); + int lbl = lz_da_pop(labelStack); + lz_da_append(labelStack, lbl); printf(" popstack 123\n"); printf(" RSetF 123\n"); printf(" JmpIE __iftail_%d\n", lbl); break; } if (SBeq(&tokenAccumulator, "endif")) { + commentStack(&labelStack); int lbl = lz_da_pop(labelStack); printf("__iftail_%d:\n", lbl); break; diff --git a/flagpole/tests/ifs.fp b/flagpole/tests/ifs.fp index 7b9f971..cfd40e1 100644 --- a/flagpole/tests/ifs.fp +++ b/flagpole/tests/ifs.fp @@ -11,4 +11,3 @@ proc main "Alright, have a nice day" :puts :newline endif endproc - diff --git a/flagpole/tests/numbers.fp b/flagpole/tests/numbers.fp index f95ee84..4c43518 100644 --- a/flagpole/tests/numbers.fp +++ b/flagpole/tests/numbers.fp @@ -2,5 +2,8 @@ $inc fvmstd.fp proc main "Hello World!" :puts :newline - 23 :putuint + 23 :putuint :newline + 0 :putuint :newline + 69 :putuint :newline + 420 :putuint :newline endproc