#ifndef UNDAR_EMIT_H #define UNDAR_EMIT_H #include "common.h" #include "libc.h" typedef enum notation_type_e { PREFIX, INFIX, POSTFIX } NotationType; typedef enum output_type_e { BINARY, TEXT } OutputType; 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 i32 (*TypeVariableEmit)(const char *str, i32 length); typedef struct emitter_s Emitter; struct emitter_s { NotationType notation; OutputType output; ErrorMsg error; 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; TypeVariableEmit emit_bool_type; TypeVariableEmit emit_byte_type; TypeVariableEmit emit_int_type; TypeVariableEmit emit_nat_type; TypeVariableEmit emit_real_type; TypeVariableEmit emit_str_type; TypeVariableEmit emit_u8_type; TypeVariableEmit emit_i8_type; TypeVariableEmit emit_i16_type; TypeVariableEmit emit_u16_type; TypeVariableEmit emit_i32_type; TypeVariableEmit emit_u32_type; TypeVariableEmit emit_f32_type; VoidArgEmit emit_array; VoidArgEmit 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; StrArgEmit emit_constant; SymbolEmit emit_variable; VoidArgEmit emit_write; VoidArgEmit emit_read; VoidArgEmit emit_open; VoidArgEmit emit_close; VoidArgEmit emit_stat; }; Emitter c_emitter(); Emitter uxn_emitter(); #endif