fix deref error
This commit is contained in:
parent
b22db9cfd5
commit
8abe0ab545
13
compiler.c
13
compiler.c
|
|
@ -598,6 +598,8 @@ variable(void)
|
||||||
emitter->emit_deref_prolog(arena, code, sym);
|
emitter->emit_deref_prolog(arena, code, sym);
|
||||||
|
|
||||||
if(match(TOKEN_LBRACKET)) {
|
if(match(TOKEN_LBRACKET)) {
|
||||||
|
if (sym->scope)
|
||||||
|
emitter->emit_deref(arena, code, 2);
|
||||||
/* add offset of "length"*/
|
/* add offset of "length"*/
|
||||||
emitter->emit_nat(arena, code, "2", 1);
|
emitter->emit_nat(arena, code, "2", 1);
|
||||||
emitter->emit_add(arena, code, 2);
|
emitter->emit_add(arena, code, 2);
|
||||||
|
|
@ -619,6 +621,8 @@ variable(void)
|
||||||
parser->current_type = SYMBOL_BYTE;
|
parser->current_type = SYMBOL_BYTE;
|
||||||
} else if(match(TOKEN_DOT)) {
|
} else if(match(TOKEN_DOT)) {
|
||||||
if(sleq("length", parser->current.start, parser->current.length)) {
|
if(sleq("length", parser->current.start, parser->current.length)) {
|
||||||
|
if (sym->scope)
|
||||||
|
emitter->emit_deref(arena, code, 2);
|
||||||
emitter->emit_deref(arena, code, 2);
|
emitter->emit_deref(arena, code, 2);
|
||||||
} else {
|
} else {
|
||||||
emitter->error("arrays currently can only get their length, don't do "
|
emitter->error("arrays currently can only get their length, don't do "
|
||||||
|
|
@ -628,9 +632,8 @@ variable(void)
|
||||||
parser->current_type = SYMBOL_NAT;
|
parser->current_type = SYMBOL_NAT;
|
||||||
advance();
|
advance();
|
||||||
} else {
|
} else {
|
||||||
emitter->emit_nat(arena, code, "2", 1);
|
if (sym->scope)
|
||||||
emitter->emit_add(arena, code, 2);
|
emitter->emit_deref(arena, code, 2);
|
||||||
/* emitter->emit_deref(arena, code); */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
@ -803,6 +806,10 @@ void
|
||||||
print_statement(void)
|
print_statement(void)
|
||||||
{
|
{
|
||||||
expression();
|
expression();
|
||||||
|
if (parser->current_type == SYMBOL_STR) {
|
||||||
|
emitter->emit_nat(arena, code, "2", 1);
|
||||||
|
emitter->emit_add(arena, code, 2);
|
||||||
|
}
|
||||||
consume(TOKEN_SEMICOLON);
|
consume(TOKEN_SEMICOLON);
|
||||||
emitter->emit_print(arena, code);
|
emitter->emit_print(arena, code);
|
||||||
emitter->emit_end_statement(arena, code);
|
emitter->emit_end_statement(arena, code);
|
||||||
|
|
|
||||||
|
|
@ -2,12 +2,11 @@ str hello = "hello World!";
|
||||||
str msg = " damage inflicted!";
|
str msg = " damage inflicted!";
|
||||||
|
|
||||||
if (msg[1] == 'd') {
|
if (msg[1] == 'd') {
|
||||||
pln("yes");
|
print("yes");
|
||||||
}
|
}
|
||||||
|
|
||||||
pln(msg.length as str);
|
pln(msg.length as str);
|
||||||
pln(msg);
|
pln(msg);
|
||||||
|
|
||||||
hello[0] = hello[0] - ' ';
|
hello[0] = hello[0] - ' ';
|
||||||
pln(hello);
|
pln(hello);
|
||||||
halt;
|
halt;
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,8 @@
|
||||||
|100
|
|100
|
||||||
LIT2r 0000 main_ POP2r BRK
|
LIT2r 0000
|
||||||
|
|
||||||
@main_ ( -- )
|
|
||||||
|
|
||||||
#0017 fib_ nat_to_str_ str/<print>
|
#0017 fib_ nat_to_str_ str/<print>
|
||||||
&return
|
POP2r BRK
|
||||||
POP2r JMP2r
|
|
||||||
|
|
||||||
@fib_ ( n -- res )
|
@fib_ ( n -- res )
|
||||||
OVR2r LIT2r 0002 SUB2r
|
OVR2r LIT2r 0002 SUB2r
|
||||||
STH2kr STA2
|
STH2kr STA2
|
||||||
|
|
@ -29,6 +25,13 @@
|
||||||
&return
|
&return
|
||||||
POP2r JMP2r
|
POP2r JMP2r
|
||||||
|
|
||||||
|
@afree_ ( -- result* )
|
||||||
|
OVR2r #0000 ;mem_length_ STA2
|
||||||
|
#0000
|
||||||
|
|
||||||
|
&return
|
||||||
|
POP2r JMP2r
|
||||||
|
|
||||||
@amcpy_ ( length* from* -- result* )
|
@amcpy_ ( length* from* -- result* )
|
||||||
OVR2r LIT2r 0008 SUB2r STH2kr #0006 ADD2 STA2
|
OVR2r LIT2r 0008 SUB2r STH2kr #0006 ADD2 STA2
|
||||||
STH2kr #0004 ADD2 STA2
|
STH2kr #0004 ADD2 STA2
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,97 @@
|
||||||
|
|100
|
||||||
|
LIT2r 0000
|
||||||
|
|
||||||
|
;msg #0002 ADD2 #0001 ADD2 LDA #64 EQU #03 JCN !{
|
||||||
|
;{ #0002 ADD2 } !{ 79 65 73 00 } str/<print>
|
||||||
|
!&if_end.0 } &if_end.0
|
||||||
|
;msg LDA2 nat_to_str_ pln_
|
||||||
|
;msg pln_
|
||||||
|
;hello #0002 ADD2 #0000 ADD2 ;hello #0002 ADD2 #0000 ADD2 LDA #20 SUB ROT ROT STA
|
||||||
|
;hello pln_
|
||||||
|
POP2r BRK
|
||||||
|
@pln_ ( string -- )
|
||||||
|
OVR2r LIT2r 0004 SUB2r
|
||||||
|
STH2kr STA2
|
||||||
|
|
||||||
|
STH2kr #0002 ADD2 LDA2
|
||||||
|
#0000 STH2kr #0002 ADD2 STA2
|
||||||
|
|
||||||
|
&while.0 STH2kr #0002 ADD2 LDA2 STH2kr LDA2 LDA2 LTH2 #03 JCN !{
|
||||||
|
STH2kr LDA2 #0002 ADD2 STH2kr #0002 ADD2 LDA2 ADD2 LDA #18 DEO
|
||||||
|
STH2kr #0002 ADD2 LDA2 #0001 ADD2 STH2kr #0002 ADD2 STA2
|
||||||
|
!&while.0 }
|
||||||
|
#0a #18 DEO
|
||||||
|
&return
|
||||||
|
POP2r JMP2r
|
||||||
|
|
||||||
|
@sext
|
||||||
|
#80 ANDk EQU #ff MUL SWP JMP2r
|
||||||
|
|
||||||
|
@aalloc_ ( size* -- result* )
|
||||||
|
OVR2r LIT2r 0004 SUB2r STH2kr INC2 INC2 STA2
|
||||||
|
;mem_length_ LDA2 STH2kr STA2
|
||||||
|
;mem_length_ LDA2k STH2kr INC2 INC2 LDA2 ADD2 SWP2 STA2
|
||||||
|
;mem_ STH2kr LDA2 ADD2 !&return
|
||||||
|
#0000
|
||||||
|
|
||||||
|
&return
|
||||||
|
POP2r JMP2r
|
||||||
|
|
||||||
|
@afree_ ( -- result* )
|
||||||
|
OVR2r #0000 ;mem_length_ STA2
|
||||||
|
#0000
|
||||||
|
|
||||||
|
&return
|
||||||
|
POP2r JMP2r
|
||||||
|
|
||||||
|
@amcpy_ ( length* from* -- result* )
|
||||||
|
OVR2r LIT2r 0008 SUB2r STH2kr #0006 ADD2 STA2
|
||||||
|
STH2kr #0004 ADD2 STA2
|
||||||
|
STH2kr #0004 ADD2 LDA2 aalloc_
|
||||||
|
STH2kr INC2 INC2 STA2
|
||||||
|
#0000 STH2kr STA2
|
||||||
|
|
||||||
|
&begin.1
|
||||||
|
STH2kr LDA2 STH2kr #0004 ADD2 LDA2 LTH2 #00 EQU ?&break.1
|
||||||
|
STH2kr #0006 ADD2 LDA2 STH2kr LDA2 ADD2 LDA sext
|
||||||
|
STH2kr INC2 INC2 LDA2 STH2kr LDA2 ADD2 STA
|
||||||
|
POP
|
||||||
|
|
||||||
|
&continue.1
|
||||||
|
STH2kr LDA2k INC2k ROT2 STA2
|
||||||
|
POP2 !&begin.1
|
||||||
|
|
||||||
|
&break.1
|
||||||
|
STH2kr INC2 INC2 LDA2 !&return
|
||||||
|
#0000
|
||||||
|
|
||||||
|
&return
|
||||||
|
POP2r JMP2r
|
||||||
|
|
||||||
|
@nat_to_str_ ( n* -- result* )
|
||||||
|
OVR2r LIT2r 000a SUB2r STH2kr #0008 ADD2 STA2
|
||||||
|
#0005 STH2kr STA2
|
||||||
|
|
||||||
|
&begin.1
|
||||||
|
STH2kr #0008 ADD2 LDA2 #000a OVR2 OVR2 DIV2 MUL2 SUB2 #0030 ADD2 STH2kr INC2 INC2 STH2kr LDA2k #0001 SUB2 SWP2 STA2k
|
||||||
|
POP2 ADD2 STA
|
||||||
|
POP STH2kr #0008 ADD2 LDA2k #000a DIV2 SWP2 STA2
|
||||||
|
|
||||||
|
&continue.1
|
||||||
|
#0000 STH2kr #0008 ADD2 LDA2 LTH2 ?&begin.1
|
||||||
|
|
||||||
|
&break.1
|
||||||
|
#0005 STH2kr LDA2 SUB2 STH2kr INC2 INC2 STH2kr LDA2 ADD2 amcpy_
|
||||||
|
!&return
|
||||||
|
#0000
|
||||||
|
|
||||||
|
&return
|
||||||
|
POP2r JMP2r
|
||||||
|
|
||||||
|
@str/<print> ( str* -- )
|
||||||
|
LDAk DUP ?{ POP POP2 JMP2r }
|
||||||
|
#18 DEO
|
||||||
|
INC2 !/<print>
|
||||||
|
|
||||||
|
@mem_length_ #0022
|
||||||
|
@mem_ @hello 000c 68 65 6c 6c 6f 20 57 6f 72 6c 64 21 00 @msg 0012 20 64 61 6d 61 67 65 20 69 6e 66 6c 69 63 74 65 64 21 00
|
||||||
Loading…
Reference in New Issue