undar-lang/emit.h

119 lines
3.2 KiB
C

#ifndef UNDAR_EMIT_H
#define UNDAR_EMIT_H
#include "common.h"
#include "strbuf.h"
#include "libc.h"
typedef u32 (*SymbolSize)(SymbolType t);
typedef void (*ErrorMsg)(const char *str, i32 length, i32 line);
typedef void (*SymbolEmit)(Arena *a, List *out, Symbol *sym);
typedef void (*VoidArgEmit)(Arena *a, List *out);
typedef void (*StrArgEmit)(Arena *a, List *out, const char *str, i32 length);
typedef void (*VarEmit)(Arena *a, List *out, Symbol *sym, bool local);
typedef void (*MultipleEmit)(Arena *a, List *out, Symbol *sym, List* in);
typedef void (*I32ArgEmit)(Arena *a, List *out, i32 val);
typedef void (*U32ArgEmit)(Arena *a, List *out, u32 ptr);
typedef void (*RawEmit)(Arena *a, List *out, Symbol *sym, const char *str, u32 length);
typedef struct emitter_s Emitter;
struct emitter_s {
i32 ifs;
i32 else_if_depth;
i32 loops;
i32 loop_depth;
ErrorMsg error;
SymbolSize get_size;
VoidArgEmit prolog;
VoidArgEmit epilogue;
U32ArgEmit emit_add;
U32ArgEmit emit_sub;
U32ArgEmit emit_mul;
U32ArgEmit emit_div;
U32ArgEmit emit_lt;
U32ArgEmit emit_le;
U32ArgEmit emit_gt;
U32ArgEmit emit_ge;
U32ArgEmit emit_ne;
U32ArgEmit emit_eq;
VoidArgEmit emit_false;
VoidArgEmit emit_true;
VoidArgEmit emit_nil;
VoidArgEmit emit_void;
StrArgEmit emit_int;
StrArgEmit emit_nat;
StrArgEmit emit_real;
StrArgEmit emit_byte;
RawEmit emit_str;
VarEmit emit_type;
MultipleEmit emit_array;
SymbolEmit emit_function;
VoidArgEmit emit_plex;
VoidArgEmit emit_method;
VoidArgEmit emit_trait;
VoidArgEmit emit_const;
VoidArgEmit emit_print;
VoidArgEmit emit_neg;
VoidArgEmit emit_not;
VoidArgEmit emit_open_paren;
VoidArgEmit emit_close_paren;
VarEmit emit_constant;
VarEmit emit_variable;
VarEmit emit_set_variable;
VoidArgEmit emit_write;
VoidArgEmit emit_read;
VoidArgEmit emit_open;
VoidArgEmit emit_close;
VoidArgEmit emit_stat;
VoidArgEmit emit_end_statement;
VoidArgEmit emit_set_value;
VoidArgEmit emit_plex_def;
VoidArgEmit emit_cast_int_to_nat;
VoidArgEmit emit_cast_int_to_real;
VoidArgEmit emit_cast_int_to_str;
VoidArgEmit emit_cast_nat_to_int;
VoidArgEmit emit_cast_nat_to_real;
VoidArgEmit emit_cast_nat_to_str;
VoidArgEmit emit_cast_real_to_int;
VoidArgEmit emit_cast_real_to_nat;
VoidArgEmit emit_cast_real_to_str;
VoidArgEmit emit_strbuf_init;
VoidArgEmit emit_strbuf_append;
VoidArgEmit emit_strbuf_to_str;
SymbolEmit emit_arena_fn_call;
VoidArgEmit emit_arena_fn_return;
VoidArgEmit emit_arena_fn_return_plex;
VoidArgEmit emit_arena_fn_return_array;
VoidArgEmit emit_arena_fn_return_strbuf;
VoidArgEmit emit_cast_str_to_int;
VoidArgEmit emit_cast_str_to_nat;
VoidArgEmit emit_cast_str_to_real;
VoidArgEmit emit_sll;
VoidArgEmit emit_srl;
VoidArgEmit emit_xor;
VoidArgEmit emit_mod;
VoidArgEmit emit_and;
VoidArgEmit emit_or;
VoidArgEmit emit_if;
I32ArgEmit emit_patch_if;
I32ArgEmit emit_patch_if_done;
I32ArgEmit emit_while;
VoidArgEmit emit_while_postfix;
I32ArgEmit emit_patch_while;
VoidArgEmit emit_early_return;
VoidArgEmit emit_halt;
SymbolEmit emit_deref_prolog;
U32ArgEmit emit_deref;
U32ArgEmit emit_address;
U32ArgEmit emit_zero_block;
StrArgEmit emit_char;
StrArgEmit emit_inline_str;
U32ArgEmit emit_ref_store;
U32ArgEmit emit_stack_swap;
};
Emitter rer_emitter(void);
Emitter uxn_emitter(void);
#endif