fix return statement
This commit is contained in:
parent
a4a695f84a
commit
28598e354a
14
compiler.c
14
compiler.c
|
|
@ -631,6 +631,18 @@ void call() {
|
|||
return;
|
||||
}
|
||||
|
||||
void
|
||||
return_statement()
|
||||
{
|
||||
if (match(TOKEN_SEMICOLON)) {
|
||||
emitter.emit_early_return();
|
||||
} else {
|
||||
expression();
|
||||
consume(TOKEN_SEMICOLON);
|
||||
emitter.emit_early_return();
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
statement()
|
||||
{
|
||||
|
|
@ -641,6 +653,8 @@ statement()
|
|||
} else if(match(TOKEN_KEYWORD_FN)) {
|
||||
advance();
|
||||
function();
|
||||
} else if(match(TOKEN_KEYWORD_RETURN)) {
|
||||
return_statement();
|
||||
} else if(match(TOKEN_KEYWORD_IF)) {
|
||||
if_statement();
|
||||
} else if(match(TOKEN_KEYWORD_WHILE)) {
|
||||
|
|
|
|||
1
emit.h
1
emit.h
|
|
@ -99,6 +99,7 @@ struct emitter_s {
|
|||
I32ArgEmit emit_while;
|
||||
VoidArgEmit emit_while_postfix;
|
||||
I32ArgEmit emit_patch_while;
|
||||
VoidArgEmit emit_early_return;
|
||||
};
|
||||
|
||||
Emitter rer_emitter();
|
||||
|
|
|
|||
|
|
@ -670,5 +670,6 @@ rer_emitter()
|
|||
rer_emit_while,
|
||||
rer_emit_while_postfix,
|
||||
rer_emit_patch_while,
|
||||
rer_emit_arena_fn_return,
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -777,6 +777,12 @@ uxn_emit_patch_while(i32 local_whiles)
|
|||
printf("!&while.%d } \n", local_whiles);
|
||||
}
|
||||
|
||||
void
|
||||
uxn_emit_early_return()
|
||||
{
|
||||
printf("!&return ");
|
||||
}
|
||||
|
||||
Emitter
|
||||
uxn_emitter()
|
||||
{
|
||||
|
|
@ -865,5 +871,6 @@ uxn_emitter()
|
|||
uxn_emit_while,
|
||||
uxn_emit_while_postfix,
|
||||
uxn_emit_patch_while,
|
||||
uxn_emit_early_return,
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,23 +1,20 @@
|
|||
|100
|
||||
LIT2r 0000 main POP2r BRK
|
||||
LIT2r 0000 main_ POP2r BRK
|
||||
|
||||
@main ( -- )
|
||||
#0017 fib nat_to_str_ str/<println>
|
||||
@main_ ( -- )
|
||||
|
||||
#0017 fib_ nat_to_str_ str/<print>
|
||||
&return
|
||||
POP2r JMP2r
|
||||
|
||||
@fib ( n -- n )
|
||||
OVR2r LIT2r 0002 SUB2r STH2kr STA2
|
||||
@fib_ ( n -- res )
|
||||
OVR2r LIT2r 0002 SUB2r
|
||||
STH2kr STA2
|
||||
|
||||
STH2kr LDA2 #0002 LTH2 #03 JCN !{ STH2kr LDA2 !&return !&if_end.0 }
|
||||
&if_end.0
|
||||
STH2kr LDA2 #0002 LTH2 #03 JCN !{
|
||||
STH2kr LDA2 !&return !&if_end.0 } &if_end.0
|
||||
|
||||
STH2kr LDA2 #0002 SUB2 fib
|
||||
STH2kr LDA2 #0001 SUB2 fib
|
||||
ADD2
|
||||
|
||||
&return
|
||||
STH2kr LDA2 #0002 SUB2 fib_ STH2kr LDA2 #0001 SUB2 fib_ ADD2 &return
|
||||
POP2r JMP2r
|
||||
|
||||
@sext
|
||||
|
|
|
|||
Loading…
Reference in New Issue