Compare commits

..

3 Commits

28 changed files with 476 additions and 396 deletions

View File

@ -57,8 +57,8 @@ undar_compile(int emitter_type, char *source)
}
List *code = List_init(&a);
List *msize = List_init(&a);
List *memory = List_init(&a);
List *msize = List_init(&a);
compile(&a, code, memory, &e, source);

View File

@ -10,6 +10,7 @@ Emitter *emitter;
Arena *arena;
List *code;
List *memory;
CallStack *call_stack;
/****************************************************
* Scope
@ -107,6 +108,23 @@ 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++;
}
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)
{
@ -590,7 +608,7 @@ variable(void)
}
if(sym->type == SYMBOL_FUNCTION) {
parser->call_fn = sym;
CallStack_push(call_stack, sym);
return;
}
@ -802,19 +820,6 @@ declaration(void)
statement();
}
void
print_statement(void)
{
expression();
if (parser->current_type == SYMBOL_STR) {
emitter->emit_nat(arena, code, "2", 1);
emitter->emit_add(arena, code, 2);
}
consume(TOKEN_SEMICOLON);
emitter->emit_print(arena, code);
emitter->emit_end_statement(arena, code);
}
void
if_statement(void)
{
@ -875,6 +880,8 @@ function(void)
void
call(void)
{
Symbol *call_fn;
if(!check(TOKEN_RPAREN)) {
do {
expression();
@ -882,8 +889,9 @@ call(void)
}
consume(TOKEN_RPAREN);
emitter->emit_arena_fn_call(arena, code, parser->call_fn);
parser->current_type = parser->call_fn->secondary_type;
call_fn = CallStack_pop(call_stack);
emitter->emit_arena_fn_call(arena, code, call_fn);
parser->current_type = call_fn->secondary_type;
return;
}
@ -915,8 +923,6 @@ statement(void)
if_statement();
} else if(match(TOKEN_KEYWORD_WHILE)) {
while_statement();
} else if(match(TOKEN_KEYWORD_PRINT)) {
print_statement();
} else if(match(TOKEN_KEYWORD_HALT)) {
emitter->emit_halt(arena, code);
} else {
@ -1086,7 +1092,6 @@ ParseRule rules[] = {
/* TOKEN_ARROW_RIGHT */ {nil, nil, PREC_NONE},
/* TOKEN_SLL */ {nil, binary, PREC_NONE},
/* TOKEN_SRL */ {nil, binary, PREC_NONE},
/* TOKEN_KEYWORD_PRINT*/ {nil, binary, PREC_NONE},
/* TOKEN_KEYWORD_TRAIT*/ {nil, nil, PREC_NONE},
/* TOKEN_KEYWORD_HALT*/ {nil, nil, PREC_NONE},
/* TOKEN_KEYWORD_DEVMAP*/ {nil, nil, PREC_NONE},
@ -1136,6 +1141,13 @@ bool
compile(Arena *a, List *c, List *m, Emitter *e, char *source)
{
Parser p = {0};
Symbol *syms[50] = {0};
CallStack cs;
cs.symbols = syms;
cs.count = 0;
cs.capacity = 50;
call_stack = &cs;
arena = a;
emitter = e;
code = c;

View File

@ -15,6 +15,13 @@ struct scope_s {
u32 locals_offset;
};
typedef struct call_stack_s CallStack;
struct call_stack_s {
Symbol **symbols;
u32 count;
u32 capacity;
};
typedef enum {
PREC_NONE,
PREC_ASSIGNMENT, /* = */
@ -39,7 +46,6 @@ struct parse_rule_s {
};
struct parser_s {
Symbol *call_fn;
Scope *current_scope;
List *scopes;
Token current;

1
emit.h
View File

@ -51,7 +51,6 @@ struct emitter_s {
VoidArgEmit emit_method;
VoidArgEmit emit_trait;
VoidArgEmit emit_const;
VoidArgEmit emit_print;
VoidArgEmit emit_neg;
VoidArgEmit emit_not;
VoidArgEmit emit_open_paren;

View File

@ -84,98 +84,111 @@ char emit_uxn_lib_undar_tal[] = {
0x74, 0x68, 0x2a, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x2a, 0x20, 0x2d, 0x2d,
0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2a, 0x20, 0x29, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x4f, 0x56, 0x52, 0x32, 0x72, 0x20, 0x4c, 0x49, 0x54,
0x32, 0x72, 0x20, 0x30, 0x30, 0x30, 0x38, 0x20, 0x53, 0x55, 0x42, 0x32,
0x32, 0x72, 0x20, 0x30, 0x30, 0x30, 0x61, 0x20, 0x53, 0x55, 0x42, 0x32,
0x72, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x23, 0x30, 0x30,
0x30, 0x36, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x53, 0x54, 0x41, 0x32,
0x30, 0x38, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x53, 0x54, 0x41, 0x32,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20,
0x23, 0x30, 0x30, 0x30, 0x36, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x53,
0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32,
0x6b, 0x72, 0x20, 0x23, 0x30, 0x30, 0x30, 0x36, 0x20, 0x41, 0x44, 0x44,
0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20,
0x49, 0x4e, 0x43, 0x32, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20,
0x23, 0x30, 0x30, 0x30, 0x34, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x53,
0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32,
0x6b, 0x72, 0x20, 0x23, 0x30, 0x30, 0x30, 0x34, 0x20, 0x41, 0x44, 0x44,
0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x61, 0x61, 0x6c, 0x6c, 0x6f,
0x63, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b,
0x72, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20,
0x53, 0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x30, 0x30,
0x30, 0x30, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x53, 0x54,
0x41, 0x32, 0x0a, 0x0a, 0x20, 0x20, 0x26, 0x62, 0x65, 0x67, 0x69, 0x6e,
0x2e, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b,
0x72, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b,
0x72, 0x20, 0x23, 0x30, 0x30, 0x30, 0x34, 0x20, 0x41, 0x44, 0x44, 0x32,
0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x4c, 0x54, 0x48, 0x32, 0x20, 0x23,
0x30, 0x30, 0x20, 0x45, 0x51, 0x55, 0x20, 0x3f, 0x26, 0x62, 0x72, 0x65,
0x61, 0x6b, 0x2e, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48,
0x53, 0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48,
0x32, 0x6b, 0x72, 0x20, 0x23, 0x30, 0x30, 0x30, 0x36, 0x20, 0x41, 0x44,
0x44, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x53, 0x54, 0x48, 0x32,
0x6b, 0x72, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x41, 0x44, 0x44, 0x32,
0x20, 0x4c, 0x44, 0x41, 0x20, 0x73, 0x65, 0x78, 0x74, 0x0a, 0x20, 0x20,
0x44, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x23, 0x30, 0x30, 0x66,
0x66, 0x20, 0x41, 0x4e, 0x44, 0x32, 0x20, 0x4e, 0x49, 0x50, 0x20, 0x73,
0x65, 0x78, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32,
0x6b, 0x72, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x49, 0x4e, 0x43, 0x32,
0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x53, 0x54, 0x41, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x50, 0x4f, 0x50, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72,
0x20, 0x23, 0x30, 0x30, 0x30, 0x36, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20,
0x4c, 0x44, 0x41, 0x32, 0x20, 0x23, 0x30, 0x38, 0x20, 0x53, 0x46, 0x54,
0x32, 0x20, 0x23, 0x30, 0x30, 0x66, 0x66, 0x20, 0x41, 0x4e, 0x44, 0x32,
0x20, 0x4e, 0x49, 0x50, 0x20, 0x73, 0x65, 0x78, 0x74, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x49, 0x4e, 0x43,
0x32, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20,
0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20,
0x49, 0x4e, 0x43, 0x32, 0x20, 0x53, 0x54, 0x41, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x50, 0x4f, 0x50, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x20, 0x53,
0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x0a,
0x20, 0x20, 0x26, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x2e, 0x31, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x4c, 0x44,
0x41, 0x32, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x23, 0x30,
0x30, 0x30, 0x36, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x4c, 0x44, 0x41,
0x32, 0x20, 0x4c, 0x54, 0x48, 0x32, 0x20, 0x23, 0x30, 0x30, 0x20, 0x45,
0x51, 0x55, 0x20, 0x3f, 0x26, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x2e, 0x31,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20,
0x23, 0x30, 0x30, 0x30, 0x38, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x4c,
0x44, 0x41, 0x32, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x4c,
0x44, 0x41, 0x32, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x4c, 0x44, 0x41,
0x20, 0x73, 0x65, 0x78, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54,
0x48, 0x32, 0x6b, 0x72, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x49, 0x4e,
0x43, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x53, 0x54, 0x48, 0x32,
0x6b, 0x72, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x49, 0x4e, 0x43, 0x32,
0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x53,
0x54, 0x41, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x50, 0x4f, 0x50, 0x0a, 0x0a,
0x20, 0x20, 0x26, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x2e,
0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72,
0x20, 0x4c, 0x44, 0x41, 0x32, 0x6b, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x6b,
0x20, 0x52, 0x4f, 0x54, 0x32, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x50, 0x4f, 0x50, 0x32, 0x20, 0x21, 0x26, 0x62, 0x65,
0x67, 0x69, 0x6e, 0x2e, 0x31, 0x0a, 0x0a, 0x20, 0x20, 0x26, 0x62, 0x72,
0x65, 0x61, 0x6b, 0x2e, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54,
0x48, 0x32, 0x6b, 0x72, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x49, 0x4e,
0x43, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x21, 0x26, 0x72, 0x65,
0x74, 0x75, 0x72, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x30, 0x30,
0x30, 0x30, 0x0a, 0x0a, 0x20, 0x20, 0x26, 0x72, 0x65, 0x74, 0x75, 0x72,
0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x50, 0x4f, 0x50, 0x32, 0x72, 0x20,
0x4a, 0x4d, 0x50, 0x32, 0x72, 0x0a, 0x0a, 0x40, 0x6e, 0x61, 0x74, 0x5f,
0x74, 0x6f, 0x5f, 0x73, 0x74, 0x72, 0x5f, 0x20, 0x28, 0x20, 0x6e, 0x2a,
0x20, 0x2d, 0x2d, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2a, 0x20,
0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x4f, 0x56, 0x52, 0x32, 0x72, 0x20,
0x4c, 0x49, 0x54, 0x32, 0x72, 0x20, 0x30, 0x30, 0x30, 0x61, 0x20, 0x53,
0x55, 0x42, 0x32, 0x72, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20,
0x23, 0x30, 0x30, 0x30, 0x38, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x53,
0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x30, 0x30, 0x30,
0x35, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x53, 0x54, 0x41,
0x32, 0x0a, 0x0a, 0x20, 0x20, 0x26, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x2e,
0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72,
0x20, 0x23, 0x30, 0x30, 0x30, 0x38, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20,
0x4c, 0x44, 0x41, 0x32, 0x20, 0x23, 0x30, 0x30, 0x30, 0x61, 0x20, 0x4f,
0x56, 0x52, 0x32, 0x20, 0x4f, 0x56, 0x52, 0x32, 0x20, 0x44, 0x49, 0x56,
0x32, 0x20, 0x4d, 0x55, 0x4c, 0x32, 0x20, 0x53, 0x55, 0x42, 0x32, 0x20,
0x23, 0x30, 0x30, 0x33, 0x30, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x53,
0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x49,
0x4e, 0x43, 0x32, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x4c,
0x44, 0x41, 0x32, 0x6b, 0x20, 0x23, 0x30, 0x30, 0x30, 0x31, 0x20, 0x53,
0x55, 0x42, 0x32, 0x20, 0x53, 0x57, 0x50, 0x32, 0x20, 0x53, 0x54, 0x41,
0x32, 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x50, 0x4f, 0x50, 0x32, 0x20,
0x41, 0x44, 0x44, 0x32, 0x20, 0x53, 0x54, 0x41, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x50, 0x4f, 0x50, 0x0a, 0x0a, 0x20, 0x20, 0x26, 0x63, 0x6f, 0x6e,
0x74, 0x69, 0x6e, 0x75, 0x65, 0x2e, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x6b,
0x20, 0x49, 0x4e, 0x43, 0x32, 0x6b, 0x20, 0x52, 0x4f, 0x54, 0x32, 0x20,
0x53, 0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x50, 0x4f, 0x50,
0x32, 0x20, 0x21, 0x26, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x2e, 0x31, 0x0a,
0x0a, 0x20, 0x20, 0x26, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x2e, 0x31, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x49,
0x4e, 0x43, 0x32, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x4c, 0x44, 0x41,
0x32, 0x20, 0x21, 0x26, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x0a, 0x20, 0x20,
0x26, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x50, 0x4f, 0x50, 0x32, 0x72, 0x20, 0x4a, 0x4d, 0x50, 0x32, 0x72, 0x0a,
0x0a, 0x40, 0x6e, 0x61, 0x74, 0x5f, 0x74, 0x6f, 0x5f, 0x73, 0x74, 0x72,
0x5f, 0x20, 0x28, 0x20, 0x6e, 0x2a, 0x20, 0x2d, 0x2d, 0x20, 0x72, 0x65,
0x73, 0x75, 0x6c, 0x74, 0x2a, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x4f, 0x56, 0x52, 0x32, 0x72, 0x20, 0x4c, 0x49, 0x54, 0x32, 0x72, 0x20,
0x30, 0x30, 0x30, 0x61, 0x20, 0x53, 0x55, 0x42, 0x32, 0x72, 0x20, 0x53,
0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x23, 0x30, 0x30, 0x30, 0x38, 0x20,
0x41, 0x44, 0x44, 0x32, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x23, 0x30, 0x30, 0x30, 0x35, 0x20, 0x53, 0x54, 0x48, 0x32,
0x6b, 0x72, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x0a, 0x20, 0x20, 0x26,
0x62, 0x65, 0x67, 0x69, 0x6e, 0x2e, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x23, 0x30, 0x30, 0x30, 0x38,
0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x23,
0x30, 0x30, 0x30, 0x61, 0x20, 0x4f, 0x56, 0x52, 0x32, 0x20, 0x4f, 0x56,
0x52, 0x32, 0x20, 0x44, 0x49, 0x56, 0x32, 0x20, 0x4d, 0x55, 0x4c, 0x32,
0x20, 0x53, 0x55, 0x42, 0x32, 0x20, 0x23, 0x30, 0x30, 0x33, 0x30, 0x20,
0x41, 0x44, 0x44, 0x32, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20,
0x49, 0x4e, 0x43, 0x32, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x53, 0x54,
0x48, 0x32, 0x6b, 0x72, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x6b, 0x20, 0x23,
0x30, 0x30, 0x30, 0x31, 0x20, 0x53, 0x55, 0x42, 0x32, 0x20, 0x53, 0x57,
0x50, 0x32, 0x20, 0x53, 0x54, 0x41, 0x32, 0x6b, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x50, 0x4f, 0x50, 0x32, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x53,
0x54, 0x41, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x50, 0x4f, 0x50, 0x20, 0x53,
0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x23, 0x30, 0x30, 0x30, 0x38, 0x20,
0x41, 0x44, 0x44, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x6b, 0x20, 0x23,
0x30, 0x30, 0x30, 0x61, 0x20, 0x44, 0x49, 0x56, 0x32, 0x20, 0x53, 0x57,
0x50, 0x32, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x0a, 0x20, 0x20, 0x26,
0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x2e, 0x31, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x20, 0x53, 0x54, 0x48,
0x32, 0x6b, 0x72, 0x20, 0x23, 0x30, 0x30, 0x30, 0x38, 0x20, 0x41, 0x44,
0x44, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x4c, 0x54, 0x48, 0x32,
0x20, 0x3f, 0x26, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x2e, 0x31, 0x0a, 0x0a,
0x20, 0x20, 0x26, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x2e, 0x31, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x23, 0x30, 0x30, 0x30, 0x35, 0x20, 0x53, 0x54, 0x48,
0x32, 0x6b, 0x72, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x53, 0x55, 0x42,
0x32, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x49, 0x4e, 0x43,
0x32, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b,
0x72, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20,
0x61, 0x6d, 0x63, 0x70, 0x79, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x21,
0x26, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x23, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x0a, 0x20, 0x20, 0x26, 0x72, 0x65,
0x74, 0x75, 0x72, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x50, 0x4f, 0x50,
0x32, 0x72, 0x20, 0x4a, 0x4d, 0x50, 0x32, 0x72, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x0a, 0x40, 0x73, 0x74, 0x72, 0x2f, 0x3c, 0x70, 0x72, 0x69, 0x6e,
0x74, 0x3e, 0x20, 0x28, 0x20, 0x73, 0x74, 0x72, 0x2a, 0x20, 0x2d, 0x2d,
0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x4c, 0x44, 0x41, 0x6b, 0x20,
0x44, 0x55, 0x50, 0x20, 0x3f, 0x7b, 0x20, 0x50, 0x4f, 0x50, 0x20, 0x50,
0x4f, 0x50, 0x32, 0x20, 0x4a, 0x4d, 0x50, 0x32, 0x72, 0x20, 0x7d, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x23, 0x31, 0x38, 0x20, 0x44, 0x45, 0x4f, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x21, 0x2f, 0x3c,
0x70, 0x72, 0x69, 0x6e, 0x74, 0x3e, 0x0a
0x20, 0x50, 0x4f, 0x50, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20,
0x23, 0x30, 0x30, 0x30, 0x38, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x4c,
0x44, 0x41, 0x32, 0x6b, 0x20, 0x23, 0x30, 0x30, 0x30, 0x61, 0x20, 0x44,
0x49, 0x56, 0x32, 0x20, 0x53, 0x57, 0x50, 0x32, 0x20, 0x53, 0x54, 0x41,
0x32, 0x0a, 0x0a, 0x20, 0x20, 0x26, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e,
0x75, 0x65, 0x2e, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x30, 0x30,
0x30, 0x30, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x23, 0x30,
0x30, 0x30, 0x38, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x4c, 0x44, 0x41,
0x32, 0x20, 0x4c, 0x54, 0x48, 0x32, 0x20, 0x3f, 0x26, 0x62, 0x65, 0x67,
0x69, 0x6e, 0x2e, 0x31, 0x0a, 0x0a, 0x20, 0x20, 0x26, 0x62, 0x72, 0x65,
0x61, 0x6b, 0x2e, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x30, 0x30,
0x30, 0x35, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x4c, 0x44,
0x41, 0x32, 0x20, 0x53, 0x55, 0x42, 0x32, 0x20, 0x53, 0x54, 0x48, 0x32,
0x6b, 0x72, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x49, 0x4e, 0x43, 0x32,
0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x4c, 0x44, 0x41, 0x32,
0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x61, 0x6d, 0x63, 0x70, 0x79, 0x5f,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x21, 0x26, 0x72, 0x65, 0x74, 0x75, 0x72,
0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x0a,
0x0a, 0x20, 0x20, 0x26, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x50, 0x4f, 0x50, 0x32, 0x72, 0x20, 0x4a, 0x4d, 0x50,
0x32, 0x72
};
unsigned int emit_uxn_lib_undar_tal_len = 1507;
unsigned int emit_uxn_lib_undar_tal_len = 1658;
void
uxn_emit_error(const char *str, i32 length, i32 line)
@ -588,7 +601,8 @@ void
uxn_emit_inline_str(Arena *a, List *out, const char *str, i32 length)
{
/* set a pointer to the string literal and then jump over it */
StrBuf_append(a, out, ";{ #0002 ADD2 } !{ ");
sprintf(uxn_temp_strbuf, ";{ #0001 ADD2 } !{ %04x ", length - 2);
StrBuf_append(a, out, uxn_temp_strbuf);
i32 i = 1;
while(i < length - 1) {
@ -994,12 +1008,6 @@ uxn_emit_and(Arena *a, List *out)
StrBuf_append(a, out, "AND2 ");
}
void
uxn_emit_print(Arena *a, List *out)
{
StrBuf_append(a, out, "str/<print> ");
}
void
uxn_emit_if(Arena *a, List *out)
{
@ -1162,7 +1170,6 @@ uxn_emitter()
uxn_emit_method,
uxn_emit_trait,
uxn_emit_const,
uxn_emit_print,
uxn_emit_neg,
uxn_emit_not,
uxn_emit_open_paren,

View File

@ -20,11 +20,17 @@ afree()
char *
amcpy(char *from, unsigned length)
{
char *ptr = aalloc(length);
unsigned total = length + sizeof(unsigned);
char *ptr = aalloc(total);
ptr[0] = (char)(length & 0xff);
ptr[1] = (char)((length >> 8) & 0xff);
for (unsigned i = 0; i < length; i++) {
ptr[i] = from[i];
ptr[i + sizeof(unsigned)] = from[i];
}
return ptr;
return ptr;
}
char* nat_to_str(unsigned n) {

View File

@ -19,16 +19,21 @@
POP2r JMP2r
@amcpy_ ( length* from* -- result* )
OVR2r LIT2r 0008 SUB2r STH2kr #0006 ADD2 STA2
STH2kr #0004 ADD2 STA2
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
#0000 STH2kr 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 #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
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
@ -60,9 +65,4 @@
#0000
&return
POP2r JMP2r
@str/<print> ( str* -- )
LDAk DUP ?{ POP POP2 JMP2r }
#18 DEO
INC2 !/<print>
POP2r JMP2r

View File

@ -231,8 +231,6 @@ identifierType(void)
return check_keyword(2, 1, "r", TOKEN_TYPE_PTR);
case 'l':
return check_keyword(2, 2, "ex", TOKEN_KEYWORD_PLEX);
case 'r':
return check_keyword(2, 3, "int", TOKEN_KEYWORD_PRINT);
}
}
break;

View File

@ -84,7 +84,6 @@ typedef enum {
TOKEN_ARROW_RIGHT,
TOKEN_SLL,
TOKEN_SRL,
TOKEN_KEYWORD_PRINT,
TOKEN_KEYWORD_TRAIT,
TOKEN_KEYWORD_HALT,
TOKEN_KEYWORD_DEVMAP, /* device memory map */

View File

@ -7,3 +7,11 @@ halt;
function add(nat a, nat b) nat {
return a + b;
}
function print(str string) {
nat i = 0;
while (i < string.length) {
write = string[i];
i = i + 1;
}
}

View File

@ -21,3 +21,16 @@ print("\n");
// }
halt;
function print(str string) {
nat i = 0;
while (i < string.length) {
write = string[i];
i = i + 1;
}
}
function pln(str string) {
print(string);
write = '\n';
}

View File

@ -11,3 +11,12 @@ halt;
function calc_damage(nat at, nat accuracy) nat {
return at * accuracy / 20 - 3;
}
function print(str string) {
nat i = 0;
while (i < string.length) {
write = string[i];
i = i + 1;
}
write = '\n';
}

View File

@ -1 +1,11 @@
print((!(5 - 4 > 3 * 2 == false)) as str);
print((!(5 - 4 > 3 * 2 == false)) as str);
halt;
function print(str string) {
nat i = 0;
while (i < string.length) {
write = string[i];
i = i + 1;
}
write = '\n';
}

View File

@ -11,3 +11,12 @@ function fib(nat n) nat {
if (n < 2) { return n; }
return fib(n - 2) + fib(n - 1);
}
function print(str string) {
nat i = 0;
while (i < string.length) {
write = string[i];
i = i + 1;
}
write = '\n';
}

View File

@ -8,4 +8,13 @@ for (nat j = 0; j < 10; j = j + 1) {
print(j as str);
}
halt;
halt;
function print(str string) {
nat i = 0;
while (i < string.length) {
write = string[i];
i = i + 1;
}
write = '\n';
}

View File

@ -2,3 +2,12 @@ nat i = 122;
nat j = 32;
print((i - j) as str);
halt;
function print(str string) {
nat i = 0;
while (i < string.length) {
write = string[i];
i = i + 1;
}
write = '\n';
}

View File

@ -1,2 +1,12 @@
str msg = "nuqneH 'u'?\n";
print(msg);
halt;
function print(str string) {
nat i = 0;
while (i < string.length) {
write = string[i];
i = i + 1;
}
write = '\n';
}

View File

@ -12,3 +12,12 @@ function main() {
print("x is something else");
}
}
function print(str string) {
nat i = 0;
while (i < string.length) {
write = string[i];
i = i + 1;
}
write = '\n';
}

View File

@ -8,3 +8,12 @@ function main() {
print(((i - j) as str));
print("\n");
}
function print(str string) {
nat i = 0;
while (i < string.length) {
write = string[i];
i = i + 1;
}
write = '\n';
}

View File

@ -34,3 +34,11 @@ for (nat x = 0; x < xSize; x++) {
if (found) break;
}
function print(str string) {
nat i = 0;
while (i < string.length) {
write = string[i];
i = i + 1;
}
write = '\n';
}

View File

@ -4,4 +4,13 @@ if (!flag) {
print("flag is false");
}
halt;
halt;
function print(str string) {
nat i = 0;
while (i < string.length) {
write = string[i];
i = i + 1;
}
write = '\n';
}

View File

@ -1,17 +1,11 @@
str hello = "hello World!";
str msg = " damage inflicted!";
if (msg[1] == 'd') {
print("yes");
}
pln(msg.length as str);
pln(msg);
print(hello.length as str);
hello[0] = hello[0] - ' ';
pln(hello);
print(hello);
halt;
function pln(str string) {
function print(str string) {
nat i = 0;
while (i < string.length) {
write = string[i];

97
test/tal/add.tal Normal file
View File

@ -0,0 +1,97 @@
|100
LIT2r 0000
#0001 #0001 add_ nat_to_str_ print_
POP2r BRK
@add_ ( a b -- res )
OVR2r LIT2r 0004 SUB2r
STH2kr STA2
STH2kr #0002 ADD2 STA2
STH2kr LDA2 STH2kr #0002 ADD2 LDA2 ADD2 !&return &return
POP2r JMP2r
@print_ ( 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 }
&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_ #0000
@mem_

View File

@ -1,18 +1,46 @@
|100
LIT2r 0000
!{ @i $2 } #0000 ;i STA2
&while.0 ;i LDA2 ;fixed_size LDA2 LTH2 #03 JCN !{
;fixed_size ;i LDA2 #0002 MUL2 ADD2 #0002 ADD2 LDA2 nat_to_str_ str/<print>
;{ #0002 ADD2 } !{ 20 00 } str/<print>
;i LDA2 #0001 ADD2 ;i STA2 !&while.0 }
;{ #0002 ADD2 } !{ 0a 00 } str/<print>
POP2r BRK @sext
;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
@sdiv
OVR #80 AND ?&b_neg &b_pos OVR2 POP #80 AND ?&a_neg_b_pos DIV2 JMP2r &a_neg_b_pos SWP2 #0000 SWP2 SUB2 SWP2 DIV2 #0000 SWP2 SUB2 JMP2r
&b_neg #0000 SWP2 SUB2 OVR2 POP #80 AND ?&a_neg_b_neg DIV2 #0000 SWP2 SUB2 JMP2r
&a_neg_b_neg #0000 ROT2 SUB2 SWP2 DIV2 JMP2r
@aalloc_ ( size* -- result* )
OVR2r LIT2r 0004 SUB2r STH2kr INC2 INC2 STA2
@ -24,36 +52,6 @@ POP2r BRK @sext
&return
POP2r JMP2r
@areturn_ ( size* src* checkpoint* -- result* )
OVR2r LIT2r 000a SUB2r STH2kr #0008 ADD2 STA2
STH2kr #0006 ADD2 STA2
STH2kr #0004 ADD2 STA2
;mem_ STH2kr #0008 ADD2 LDA2 ADD2 STH2kr INC2 INC2 STA2
STH2kr #0006 ADD2 LDA2 STH2kr INC2 INC2 LDA2 NEQ2 ?&end.1
STH2kr #0006 ADD2 LDA2 !&return
&end.1
#0000 STH2kr STA2
&begin.2
STH2kr LDA2 STH2kr #0004 ADD2 LDA2 LTH2 #00 EQU ?&break.2
STH2kr #0006 ADD2 LDA2 STH2kr LDA2 ADD2 LDA sext
STH2kr INC2 INC2 LDA2 STH2kr LDA2 ADD2 STA
POP
&continue.2
STH2kr LDA2k INC2k ROT2 STA2
POP2 !&begin.2
&break.2
STH2kr #0008 ADD2 LDA2 STH2kr #0004 ADD2 LDA2 ADD2 ;mem_length_ STA2
#0000 ;mem_ ;mem_length_ LDA2 ADD2 STA
POP STH2kr INC2 INC2 LDA2 !&return
#0000
&return
POP2r JMP2r
@afree_ ( -- result* )
OVR2r #0000 ;mem_length_ STA2
#0000
@ -62,16 +60,21 @@ POP2r BRK @sext
POP2r JMP2r
@amcpy_ ( length* from* -- result* )
OVR2r LIT2r 0008 SUB2r STH2kr #0006 ADD2 STA2
STH2kr #0004 ADD2 STA2
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
#0000 STH2kr 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 #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
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
@ -104,177 +107,6 @@ POP2r BRK @sext
&return
POP2r JMP2r
@int_to_str_ ( n* -- result* )
OVR2r LIT2r 000c SUB2r STH2kr #000a ADD2 STA2
#0006 STH2kr INC2 INC2 STA2
STH2kr #000a ADD2 LDA2 #8000 EOR2 #8000 LTH2 #00 SWP #0000 NEQ2 #00 SWP STH2kr STA
POP LDAkr STHr sext
#0000 EQU2 ?&end.1
#0000 STH2kr #000a ADD2 LDA2 SUB2 STH2kr #000a ADD2 STA2
&end.1
&begin.2
STH2kr #000a ADD2 LDA2 #000a OVR2 OVR2 sdiv/b_pos
MUL2 SUB2 #0030 ADD2 STH2kr #0004 ADD2 STH2kr INC2 INC2 LDA2k #0001 SUB2 SWP2 STA2k
POP2 ADD2 STA
POP STH2kr #000a ADD2 LDA2k #000a sdiv/b_pos
SWP2 STA2
&continue.2
#8000 STH2kr #000a ADD2 LDA2 #8000 EOR2 LTH2 ?&begin.2
&break.2
LDAkr STHr sext
#0000 EQU2 ?&end.3
#002d STH2kr #0004 ADD2 STH2kr INC2 INC2 LDA2k #0001 SUB2 SWP2 STA2k
POP2 ADD2 STA
POP
&end.3
#0006 STH2kr INC2 INC2 LDA2 SUB2 STH2kr #0004 ADD2 STH2kr INC2 INC2 LDA2 ADD2 amcpy_
!&return
#0000
&return
POP2r JMP2r
@int_to_nat_ ( n* -- result* )
OVR2r LIT2r 0002 SUB2r STH2kr STA2
STH2kr LDA2 !&return
#0000
&return
POP2r JMP2r
@nat_to_int_ ( n* -- result* )
OVR2r LIT2r 0002 SUB2r STH2kr STA2
STH2kr LDA2 !&return
#0000
&return
POP2r JMP2r
@int_add_ ( b* a* -- result* )
OVR2r LIT2r 0004 SUB2r STH2kr INC2 INC2 STA2
STH2kr STA2
STH2kr INC2 INC2 LDA2 STH2kr LDA2 ADD2 !&return
#0000
&return
POP2r JMP2r
@int_sub_ ( b* a* -- result* )
OVR2r LIT2r 0004 SUB2r STH2kr INC2 INC2 STA2
STH2kr STA2
STH2kr INC2 INC2 LDA2 STH2kr LDA2 SUB2 !&return
#0000
&return
POP2r JMP2r
@int_mul_ ( b* a* -- result* )
OVR2r LIT2r 0004 SUB2r STH2kr INC2 INC2 STA2
STH2kr STA2
STH2kr INC2 INC2 LDA2 STH2kr LDA2 MUL2 !&return
#0000
&return
POP2r JMP2r
@int_div_ ( b* a* -- result* )
OVR2r LIT2r 0004 SUB2r STH2kr INC2 INC2 STA2
STH2kr STA2
STH2kr INC2 INC2 LDA2 STH2kr LDA2 sdiv
!&return
#0000
&return
POP2r JMP2r
@int_eq_ ( b* a* -- result* )
OVR2r LIT2r 0004 SUB2r STH2kr INC2 INC2 STA2
STH2kr STA2
STH2kr INC2 INC2 LDA2 STH2kr LDA2 EQU2 #00 SWP !&return
#0000
&return
POP2r JMP2r
@int_ne_ ( b* a* -- result* )
OVR2r LIT2r 0004 SUB2r STH2kr INC2 INC2 STA2
STH2kr STA2
STH2kr INC2 INC2 LDA2 STH2kr LDA2 NEQ2 #00 SWP !&return
#0000
&return
POP2r JMP2r
@int_lt_ ( b* a* -- result* )
OVR2r LIT2r 0004 SUB2r STH2kr INC2 INC2 STA2
STH2kr STA2
STH2kr INC2 INC2 LDA2 #8000 EOR2 STH2kr LDA2 #8000 EOR2 LTH2 #00 SWP !&return
#0000
&return
POP2r JMP2r
@int_le_ ( b* a* -- result* )
OVR2r LIT2r 0004 SUB2r STH2kr INC2 INC2 STA2
STH2kr STA2
STH2kr INC2 INC2 LDA2 #8000 EOR2 STH2kr LDA2 #8000 EOR2 GTH2 #00 SWP #01 EOR !&return
#0000
&return
POP2r JMP2r
@int_gt_ ( b* a* -- result* )
OVR2r LIT2r 0004 SUB2r STH2kr INC2 INC2 STA2
STH2kr STA2
STH2kr LDA2 #8000 EOR2 STH2kr INC2 INC2 LDA2 #8000 EOR2 LTH2 #00 SWP !&return
#0000
&return
POP2r JMP2r
@int_ge_ ( b* a* -- result* )
OVR2r LIT2r 0004 SUB2r STH2kr INC2 INC2 STA2
STH2kr STA2
STH2kr LDA2 #8000 EOR2 STH2kr INC2 INC2 LDA2 #8000 EOR2 GTH2 #00 SWP #01 EOR !&return
#0000
&return
POP2r JMP2r
@int_neg_ ( f* -- result* )
OVR2r LIT2r 0002 SUB2r STH2kr STA2
#0000 STH2kr LDA2 SUB2 !&return
#0000
&return
POP2r JMP2r
@int_abs_ ( f* -- result* )
OVR2r LIT2r 0002 SUB2r STH2kr STA2
STH2kr LDA2 #8000 EOR2 #8000 LTH2 ?&then.1
STH2kr LDA2 !&end.1
&then.1
#0000 STH2kr LDA2 SUB2
&end.1
!&return
#0000
&return
POP2r JMP2r
@str/<print> ( str* -- )
LDAk DUP ?{ POP POP2 JMP2r }
#18 DEO
INC2 !/<print>
@mem_length_ #0000
@mem_ @fixed_size 0006 0001 0002 0003 0004 0005 0006
@mem_length_ #0009
@mem_ @fixed_size 0006 0001 0002 0003 0004 0005 0000

View File

@ -1,7 +1,7 @@
|100
LIT2r 0000
#0017 fib_ nat_to_str_ str/<print>
#0017 fib_ nat_to_str_ print_
POP2r BRK
@fib_ ( n -- res )
OVR2r LIT2r 0002 SUB2r
@ -12,6 +12,21 @@ POP2r BRK
STH2kr LDA2 #0002 SUB2 fib_ STH2kr LDA2 #0001 SUB2 fib_ ADD2 !&return &return
POP2r JMP2r
@print_ ( 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
@ -33,16 +48,21 @@ POP2r BRK
POP2r JMP2r
@amcpy_ ( length* from* -- result* )
OVR2r LIT2r 0008 SUB2r STH2kr #0006 ADD2 STA2
STH2kr #0004 ADD2 STA2
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
#0000 STH2kr 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 #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
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
@ -75,11 +95,5 @@ POP2r BRK
&return
POP2r JMP2r
@str/<print> ( str* -- )
LDAk DUP ?{ POP POP2 JMP2r }
#18 DEO
INC2 !/<print>
@mem_length_ #0000
@mem_

View File

@ -1,15 +1,11 @@
|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 LDA2 nat_to_str_ print_
;hello #0002 ADD2 #0000 ADD2 ;hello #0002 ADD2 #0000 ADD2 LDA #20 SUB ROT ROT STA
;hello pln_
;hello print_
POP2r BRK
@pln_ ( string -- )
@print_ ( string -- )
OVR2r LIT2r 0004 SUB2r
STH2kr STA2
@ -45,16 +41,21 @@ POP2r BRK
POP2r JMP2r
@amcpy_ ( length* from* -- result* )
OVR2r LIT2r 0008 SUB2r STH2kr #0006 ADD2 STA2
STH2kr #0004 ADD2 STA2
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
#0000 STH2kr 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 #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
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
@ -87,11 +88,5 @@ POP2r BRK
&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
@mem_length_ #000e
@mem_ @hello 000c 68 65 6c 6c 6f 20 57 6f 72 6c 64 21 00

View File

@ -4,3 +4,12 @@ while (i < 10) {
print(i as str);
i = i + 1;
}
halt;
function print(str string) {
nat i = 0;
while (i < string.length) {
write = string[i];
i = i + 1;
}
}

6
tests
View File

@ -31,9 +31,9 @@ tests "add.ul" "2" ./cli ./test/add.ul
tests "local.ul" "90" ./cli ./test/local.ul
tests "global.ul" "90" ./cli ./test/global.ul
tests "hello.ul" "nuqneH 'u'?" ./cli ./test/hello.ul
tests "bang.ul" "flag is false" ./cli ./test/bang.ul
tests "not.ul" "flag is false" ./cli ./test/not.ul
tests "if.ul" "x is 20" ./cli ./test/if.ul
tests "while.ul" "0123456789" ./cli ./test/while.ul
tests "fib.ul" "28657" ./cli ./test/fib.ul
tests "attack.ul" "102 damage inflicted!" ./cli ./test/attack.ul
tests "array.ul" "1 2 3 4 5 6 " ./cli ./test/array.ul
tests "array.ul" "1 2 3 4 5 6 " ./cli ./test/array.ul
tests "fib.ul" "28657" ./cli ./test/fib.ul