WIP array arg for function
This commit is contained in:
parent
54eaea2424
commit
10ecd1ff85
48
compiler.c
48
compiler.c
|
|
@ -108,23 +108,24 @@ scope_add_symbol(const char *name, u32 name_length, SymbolType type, u32 size)
|
||||||
sizeof(Symbol));
|
sizeof(Symbol));
|
||||||
}
|
}
|
||||||
|
|
||||||
void CallStack_push(CallStack *stack, Symbol *symbol) {
|
void
|
||||||
if (stack->count >= stack->capacity) {
|
CallStack_push(CallStack *stack, Symbol *symbol)
|
||||||
|
{
|
||||||
|
if(stack->count >= stack->capacity)
|
||||||
emitter->error("call stack full", 16, parser->previous.line);
|
emitter->error("call stack full", 16, parser->previous.line);
|
||||||
}
|
|
||||||
stack->symbols[stack->count] = symbol;
|
stack->symbols[stack->count] = symbol;
|
||||||
stack->count++;
|
stack->count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
Symbol *CallStack_pop(CallStack *stack) {
|
Symbol *
|
||||||
if (stack->count == 0) {
|
CallStack_pop(CallStack *stack)
|
||||||
|
{
|
||||||
|
if(stack->count == 0)
|
||||||
emitter->error("call stack empty", 17, parser->previous.line);
|
emitter->error("call stack empty", 17, parser->previous.line);
|
||||||
}
|
|
||||||
stack->count--;
|
stack->count--;
|
||||||
return stack->symbols[stack->count];
|
return stack->symbols[stack->count];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
is_global(void)
|
is_global(void)
|
||||||
{
|
{
|
||||||
|
|
@ -145,7 +146,6 @@ is_current_type(void)
|
||||||
parser->current.type <= TOKEN_TYPE_PTR;
|
parser->current.type <= TOKEN_TYPE_PTR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
SymbolType
|
SymbolType
|
||||||
token_type_to_sym_type(TokenType t)
|
token_type_to_sym_type(TokenType t)
|
||||||
{
|
{
|
||||||
|
|
@ -403,8 +403,8 @@ variable_declaration(Symbol *def)
|
||||||
List *array_literal;
|
List *array_literal;
|
||||||
|
|
||||||
if(!def && tt == TOKEN_TYPE_STR) {
|
if(!def && tt == TOKEN_TYPE_STR) {
|
||||||
variable = scope_add_symbol(parser->current.start, parser->current.length, SYMBOL_STR,
|
variable = scope_add_symbol(parser->current.start, parser->current.length,
|
||||||
0);
|
SYMBOL_STR, 0);
|
||||||
|
|
||||||
if(!variable) {
|
if(!variable) {
|
||||||
emitter->error("cannot find str symbol", 23, parser->current.line);
|
emitter->error("cannot find str symbol", 23, parser->current.line);
|
||||||
|
|
@ -424,7 +424,13 @@ variable_declaration(Symbol *def)
|
||||||
return emitter->get_size(st);
|
return emitter->get_size(st);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!def && parser->current.type == TOKEN_LBRACKET) {
|
if(parser->current.type == TOKEN_LBRACKET) {
|
||||||
|
|
||||||
|
if(def) {
|
||||||
|
emitter->error("define array argument", 21, parser->previous.line);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
variable = define_array();
|
variable = define_array();
|
||||||
if(!variable) {
|
if(!variable) {
|
||||||
emitter->error("cannot find array symbol", 25, parser->current.line);
|
emitter->error("cannot find array symbol", 25, parser->current.line);
|
||||||
|
|
@ -451,14 +457,15 @@ variable_declaration(Symbol *def)
|
||||||
expect(TOKEN_SEMICOLON);
|
expect(TOKEN_SEMICOLON);
|
||||||
|
|
||||||
emitter->emit_array(arena, memory, variable, nil);
|
emitter->emit_array(arena, memory, variable, nil);
|
||||||
emitter->emit_zero_block(arena, memory,
|
emitter->emit_zero_block(
|
||||||
variable->size *
|
arena, memory,
|
||||||
emitter->get_size(variable->secondary_type));
|
variable->size * emitter->get_size(variable->secondary_type));
|
||||||
}
|
}
|
||||||
|
|
||||||
parser->current_type = st;
|
parser->current_type = st;
|
||||||
return emitter->get_size(st);
|
return emitter->get_size(st);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(st != SYMBOL_UNDEFINED) {
|
if(st != SYMBOL_UNDEFINED) {
|
||||||
size = emitter->get_size(st);
|
size = emitter->get_size(st);
|
||||||
|
|
@ -616,8 +623,7 @@ 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)
|
if(sym->scope) emitter->emit_deref(arena, code, 2);
|
||||||
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);
|
||||||
|
|
@ -639,8 +645,7 @@ 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)
|
if(sym->scope) emitter->emit_deref(arena, code, 2);
|
||||||
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 "
|
||||||
|
|
@ -650,8 +655,7 @@ variable(void)
|
||||||
parser->current_type = SYMBOL_NAT;
|
parser->current_type = SYMBOL_NAT;
|
||||||
advance();
|
advance();
|
||||||
} else {
|
} else {
|
||||||
if (sym->scope)
|
if(sym->scope) emitter->emit_deref(arena, code, 2);
|
||||||
emitter->emit_deref(arena, code, 2);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
@ -855,9 +859,7 @@ while_statement(void)
|
||||||
void
|
void
|
||||||
block(void)
|
block(void)
|
||||||
{
|
{
|
||||||
while(!check(TOKEN_RBRACE) && !check(TOKEN_EOF)) {
|
while(!check(TOKEN_RBRACE) && !check(TOKEN_EOF)) declaration();
|
||||||
declaration();
|
|
||||||
}
|
|
||||||
|
|
||||||
consume(TOKEN_RBRACE);
|
consume(TOKEN_RBRACE);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,7 @@
|
||||||
|
|
||||||
nat[6] fixed_size = [1, 2, 3, 4, 5, 0];
|
nat[6] fixed_size = [1, 2, 3, 4, 5, 0];
|
||||||
|
|
||||||
if (!fixed_size[5]) {
|
repair(fixed_size);
|
||||||
fixed_size[5] = 6;
|
|
||||||
}
|
|
||||||
|
|
||||||
nat i = 0;
|
nat i = 0;
|
||||||
while (i < fixed_size.length) {
|
while (i < fixed_size.length) {
|
||||||
|
|
@ -22,6 +20,12 @@ print("\n");
|
||||||
|
|
||||||
halt;
|
halt;
|
||||||
|
|
||||||
|
function repair(nat[6] arr) {
|
||||||
|
if (!arr[5]) {
|
||||||
|
arr[5] = 6;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function print(str string) {
|
function print(str string) {
|
||||||
nat i = 0;
|
nat i = 0;
|
||||||
while (i < string.length) {
|
while (i < string.length) {
|
||||||
|
|
|
||||||
|
|
@ -1,112 +0,0 @@
|
||||||
|100
|
|
||||||
LIT2r 0000
|
|
||||||
|
|
||||||
;fixed_size #0005 #0002 MUL2 ADD2 #0002 ADD2 LDA2 #0000 EQU2 #03 JCN !{
|
|
||||||
;fixed_size #0005 #0002 MUL2 ADD2 #0002 ADD2 #0006 SWP2 STA2
|
|
||||||
!&if_end.0 } &if_end.0
|
|
||||||
STH2kr #000c ADD2 LDA2
|
|
||||||
#0000 STH2kr #000c ADD2 STA2
|
|
||||||
|
|
||||||
&while.0 STH2kr #000c ADD2 LDA2 ;fixed_size LDA2 LTH2 #03 JCN !{
|
|
||||||
;fixed_size STH2kr #000c ADD2 LDA2 #0002 MUL2 ADD2 #0002 ADD2 LDA2 nat_to_str_ print_
|
|
||||||
STH2kr #000c ADD2 LDA2 ;fixed_size LDA2 #0001 SUB2 LTH2 #03 JCN !{
|
|
||||||
;{ #0001 ADD2 } !{ 0001 20 00 } print_
|
|
||||||
!&if_end.1 } &if_end.1
|
|
||||||
STH2kr #000c ADD2 LDA2 #0001 ADD2 STH2kr #000c ADD2 STA2
|
|
||||||
!&while.0 }
|
|
||||||
;{ #0001 ADD2 } !{ 0002 0a 00 } print_
|
|
||||||
POP2r BRK
|
|
||||||
@print_ ( string -- )
|
|
||||||
OVR2r LIT2r 0004 SUB2r
|
|
||||||
STH2kr STA2
|
|
||||||
|
|
||||||
STH2kr #0002 ADD2 LDA2
|
|
||||||
#0000 STH2kr #0002 ADD2 STA2
|
|
||||||
|
|
||||||
&while.1 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.1 }
|
|
||||||
&return
|
|
||||||
POP2r JMP2r
|
|
||||||
|
|
||||||
@pln_ ( string -- )
|
|
||||||
OVR2r LIT2r 0002 SUB2r
|
|
||||||
STH2kr STA2
|
|
||||||
|
|
||||||
STH2kr LDA2 print_
|
|
||||||
#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 000a SUB2r STH2kr #0008 ADD2 STA2
|
|
||||||
STH2kr #0006 ADD2 STA2
|
|
||||||
STH2kr #0006 ADD2 LDA2 INC2 INC2 STH2kr #0004 ADD2 STA2
|
|
||||||
STH2kr #0004 ADD2 LDA2 aalloc_
|
|
||||||
STH2kr INC2 INC2 STA2
|
|
||||||
STH2kr #0006 ADD2 LDA2 #00ff AND2 NIP sext
|
|
||||||
STH2kr INC2 INC2 LDA2 STA
|
|
||||||
POP STH2kr #0006 ADD2 LDA2 #08 SFT2 #00ff AND2 NIP sext
|
|
||||||
STH2kr INC2 INC2 LDA2 INC2 STA
|
|
||||||
POP #0000 STH2kr STA2
|
|
||||||
|
|
||||||
&begin.1
|
|
||||||
STH2kr LDA2 STH2kr #0006 ADD2 LDA2 LTH2 #00 EQU ?&break.1
|
|
||||||
STH2kr #0008 ADD2 LDA2 STH2kr LDA2 ADD2 LDA sext
|
|
||||||
STH2kr INC2 INC2 LDA2 STH2kr LDA2 INC2 INC2 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
|
|
||||||
@mem_length_ #0009
|
|
||||||
@mem_ @fixed_size 0006 0001 0002 0003 0004 0005 0000
|
|
||||||
|
|
||||||
Loading…
Reference in New Issue