109 lines
2.8 KiB
C
109 lines
2.8 KiB
C
#ifndef UNDAR_EMIT_H
|
|
#define UNDAR_EMIT_H
|
|
|
|
#include "common.h"
|
|
#include "libc.h"
|
|
|
|
typedef u32 (*SymbolSize)(SymbolType t);
|
|
typedef void (*SymbolEmit)(Symbol *sym);
|
|
typedef void (*ErrorMsg)(const char *str, i32 length, i32 line);
|
|
typedef void (*VoidArgEmit)();
|
|
typedef void (*StrArgEmit)(const char *str, i32 length);
|
|
typedef void (*ConstEmit)(const char *str, i32 length, bool local);
|
|
typedef void (*VarEmit)(Symbol *sym, bool local);
|
|
typedef void (*I32ArgEmit)(i32 val);
|
|
|
|
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;
|
|
VoidArgEmit emit_add;
|
|
VoidArgEmit emit_sub;
|
|
VoidArgEmit emit_mul;
|
|
VoidArgEmit emit_div;
|
|
VoidArgEmit emit_lt;
|
|
VoidArgEmit emit_le;
|
|
VoidArgEmit emit_gt;
|
|
VoidArgEmit emit_ge;
|
|
VoidArgEmit emit_ne;
|
|
VoidArgEmit 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;
|
|
StrArgEmit emit_str;
|
|
VarEmit emit_type;
|
|
VoidArgEmit emit_array;
|
|
SymbolEmit emit_function;
|
|
VoidArgEmit emit_plex;
|
|
VoidArgEmit emit_method;
|
|
VoidArgEmit emit_trait;
|
|
VoidArgEmit emit_const;
|
|
VoidArgEmit emit_print;
|
|
VoidArgEmit emit_putchar;
|
|
VoidArgEmit emit_getchar;
|
|
VoidArgEmit emit_neg;
|
|
VoidArgEmit emit_not;
|
|
VoidArgEmit emit_open_paren;
|
|
VoidArgEmit emit_close_paren;
|
|
ConstEmit 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;
|
|
};
|
|
|
|
Emitter rer_emitter();
|
|
Emitter uxn_emitter();
|
|
|
|
#endif
|