WIP array arg for function
This commit is contained in:
parent
54eaea2424
commit
10ecd1ff85
114
compiler.c
114
compiler.c
|
|
@ -108,23 +108,24 @@ scope_add_symbol(const char *name, u32 name_length, SymbolType type, u32 size)
|
|||
sizeof(Symbol));
|
||||
}
|
||||
|
||||
void CallStack_push(CallStack *stack, Symbol *symbol) {
|
||||
if (stack->count >= stack->capacity) {
|
||||
emitter->error("call stack full", 16, parser->previous.line);
|
||||
}
|
||||
stack->symbols[stack->count] = symbol;
|
||||
stack->count++;
|
||||
void
|
||||
CallStack_push(CallStack *stack, Symbol *symbol)
|
||||
{
|
||||
if(stack->count >= stack->capacity)
|
||||
emitter->error("call stack full", 16, parser->previous.line);
|
||||
stack->symbols[stack->count] = symbol;
|
||||
stack->count++;
|
||||
}
|
||||
|
||||
Symbol *CallStack_pop(CallStack *stack) {
|
||||
if (stack->count == 0) {
|
||||
emitter->error("call stack empty", 17, parser->previous.line);
|
||||
}
|
||||
stack->count--;
|
||||
return stack->symbols[stack->count];
|
||||
Symbol *
|
||||
CallStack_pop(CallStack *stack)
|
||||
{
|
||||
if(stack->count == 0)
|
||||
emitter->error("call stack empty", 17, parser->previous.line);
|
||||
stack->count--;
|
||||
return stack->symbols[stack->count];
|
||||
}
|
||||
|
||||
|
||||
bool
|
||||
is_global(void)
|
||||
{
|
||||
|
|
@ -145,7 +146,6 @@ is_current_type(void)
|
|||
parser->current.type <= TOKEN_TYPE_PTR;
|
||||
}
|
||||
|
||||
|
||||
SymbolType
|
||||
token_type_to_sym_type(TokenType t)
|
||||
{
|
||||
|
|
@ -324,7 +324,7 @@ calculate_strides(List *dims, List *strides)
|
|||
}
|
||||
}
|
||||
|
||||
Symbol*
|
||||
Symbol *
|
||||
define_array(void)
|
||||
{
|
||||
i32 size = 0, n = 0, flat_array_length = 1;
|
||||
|
|
@ -403,8 +403,8 @@ variable_declaration(Symbol *def)
|
|||
List *array_literal;
|
||||
|
||||
if(!def && tt == TOKEN_TYPE_STR) {
|
||||
variable = scope_add_symbol(parser->current.start, parser->current.length, SYMBOL_STR,
|
||||
0);
|
||||
variable = scope_add_symbol(parser->current.start, parser->current.length,
|
||||
SYMBOL_STR, 0);
|
||||
|
||||
if(!variable) {
|
||||
emitter->error("cannot find str symbol", 23, parser->current.line);
|
||||
|
|
@ -424,40 +424,47 @@ variable_declaration(Symbol *def)
|
|||
return emitter->get_size(st);
|
||||
}
|
||||
|
||||
if(!def && parser->current.type == TOKEN_LBRACKET) {
|
||||
variable = define_array();
|
||||
if(!variable) {
|
||||
emitter->error("cannot find array symbol", 25, parser->current.line);
|
||||
return 0;
|
||||
}
|
||||
advance();
|
||||
if(parser->current.type == TOKEN_LBRACKET) {
|
||||
|
||||
if(match(TOKEN_EQ)) {
|
||||
expect(TOKEN_LBRACKET);
|
||||
array_literal = List_init(arena);
|
||||
if(def) {
|
||||
emitter->error("define array argument", 21, parser->previous.line);
|
||||
|
||||
while(!match(TOKEN_RBRACKET)) {
|
||||
StrBuf_append_exactly(arena, array_literal,
|
||||
(char *)parser->current.start,
|
||||
parser->current.length);
|
||||
advance();
|
||||
if(match(TOKEN_RBRACKET)) break;
|
||||
expect(TOKEN_COMMA);
|
||||
} else {
|
||||
|
||||
variable = define_array();
|
||||
if(!variable) {
|
||||
emitter->error("cannot find array symbol", 25, parser->current.line);
|
||||
return 0;
|
||||
}
|
||||
advance();
|
||||
|
||||
if(match(TOKEN_EQ)) {
|
||||
expect(TOKEN_LBRACKET);
|
||||
array_literal = List_init(arena);
|
||||
|
||||
while(!match(TOKEN_RBRACKET)) {
|
||||
StrBuf_append_exactly(arena, array_literal,
|
||||
(char *)parser->current.start,
|
||||
parser->current.length);
|
||||
advance();
|
||||
if(match(TOKEN_RBRACKET)) break;
|
||||
expect(TOKEN_COMMA);
|
||||
}
|
||||
|
||||
expect(TOKEN_SEMICOLON);
|
||||
emitter->emit_array(arena, memory, variable, array_literal);
|
||||
} else {
|
||||
expect(TOKEN_SEMICOLON);
|
||||
|
||||
emitter->emit_array(arena, memory, variable, nil);
|
||||
emitter->emit_zero_block(
|
||||
arena, memory,
|
||||
variable->size * emitter->get_size(variable->secondary_type));
|
||||
}
|
||||
|
||||
expect(TOKEN_SEMICOLON);
|
||||
emitter->emit_array(arena, memory, variable, array_literal);
|
||||
} else {
|
||||
expect(TOKEN_SEMICOLON);
|
||||
|
||||
emitter->emit_array(arena, memory, variable, nil);
|
||||
emitter->emit_zero_block(arena, memory,
|
||||
variable->size *
|
||||
emitter->get_size(variable->secondary_type));
|
||||
parser->current_type = st;
|
||||
return emitter->get_size(st);
|
||||
}
|
||||
|
||||
parser->current_type = st;
|
||||
return emitter->get_size(st);
|
||||
}
|
||||
|
||||
if(st != SYMBOL_UNDEFINED) {
|
||||
|
|
@ -616,8 +623,7 @@ variable(void)
|
|||
emitter->emit_deref_prolog(arena, code, sym);
|
||||
|
||||
if(match(TOKEN_LBRACKET)) {
|
||||
if (sym->scope)
|
||||
emitter->emit_deref(arena, code, 2);
|
||||
if(sym->scope) emitter->emit_deref(arena, code, 2);
|
||||
/* add offset of "length"*/
|
||||
emitter->emit_nat(arena, code, "2", 1);
|
||||
emitter->emit_add(arena, code, 2);
|
||||
|
|
@ -639,8 +645,7 @@ variable(void)
|
|||
parser->current_type = SYMBOL_BYTE;
|
||||
} else if(match(TOKEN_DOT)) {
|
||||
if(sleq("length", parser->current.start, parser->current.length)) {
|
||||
if (sym->scope)
|
||||
emitter->emit_deref(arena, code, 2);
|
||||
if(sym->scope) emitter->emit_deref(arena, code, 2);
|
||||
emitter->emit_deref(arena, code, 2);
|
||||
} else {
|
||||
emitter->error("arrays currently can only get their length, don't do "
|
||||
|
|
@ -650,8 +655,7 @@ variable(void)
|
|||
parser->current_type = SYMBOL_NAT;
|
||||
advance();
|
||||
} else {
|
||||
if (sym->scope)
|
||||
emitter->emit_deref(arena, code, 2);
|
||||
if(sym->scope) emitter->emit_deref(arena, code, 2);
|
||||
}
|
||||
|
||||
return;
|
||||
|
|
@ -855,9 +859,7 @@ while_statement(void)
|
|||
void
|
||||
block(void)
|
||||
{
|
||||
while(!check(TOKEN_RBRACE) && !check(TOKEN_EOF)) {
|
||||
declaration();
|
||||
}
|
||||
while(!check(TOKEN_RBRACE) && !check(TOKEN_EOF)) declaration();
|
||||
|
||||
consume(TOKEN_RBRACE);
|
||||
}
|
||||
|
|
@ -871,7 +873,7 @@ function(void)
|
|||
scope_push();
|
||||
while(!check(TOKEN_RPAREN)) advance();
|
||||
consume(TOKEN_RPAREN);
|
||||
if (is_current_type()) advance();
|
||||
if(is_current_type()) advance();
|
||||
expect(TOKEN_LBRACE);
|
||||
block();
|
||||
emitter->emit_arena_fn_return(arena, code);
|
||||
|
|
|
|||
|
|
@ -1,9 +1,7 @@
|
|||
|
||||
nat[6] fixed_size = [1, 2, 3, 4, 5, 0];
|
||||
|
||||
if (!fixed_size[5]) {
|
||||
fixed_size[5] = 6;
|
||||
}
|
||||
repair(fixed_size);
|
||||
|
||||
nat i = 0;
|
||||
while (i < fixed_size.length) {
|
||||
|
|
@ -22,6 +20,12 @@ print("\n");
|
|||
|
||||
halt;
|
||||
|
||||
function repair(nat[6] arr) {
|
||||
if (!arr[5]) {
|
||||
arr[5] = 6;
|
||||
}
|
||||
}
|
||||
|
||||
function print(str string) {
|
||||
nat i = 0;
|
||||
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