diff --git a/build.zig b/build.zig index af7ed4a..253b34e 100644 --- a/build.zig +++ b/build.zig @@ -20,6 +20,7 @@ pub fn build(b: *std.Build) void { "src/helper.c", "src/lexer.c", "src/parser.c", + "src/compiler.c", "src/main.c", } }); diff --git a/src/compiler.c b/src/compiler.c new file mode 100644 index 0000000..e69de29 diff --git a/src/compiler.h b/src/compiler.h new file mode 100644 index 0000000..dda1b5b --- /dev/null +++ b/src/compiler.h @@ -0,0 +1,56 @@ +#include "types.h" + +typedef enum noomC_InstrType : unsigned char { + NOOMC_INSTR_NOP = 0, + NOOMC_INSTR_LOADC, + NOOMC_INSTR_COPY, + + NOOMC_INSTR_JMP, + NOOMC_INSTR_JC, + + + NOOMC_INSTR_ADD, + NOOMC_INSTR_SUB, + NOOMC_INSTR_NEG, + NOOMC_INSTR_MUL, + NOOMC_INSTR_DIV, + NOOMC_INSTR_MOD, + NOOMC_INSTR_FLOOR_DIV, + NOOMC_INSTR_POW, + + NOOMC_INSTR_EQ, + NOOMC_INSTR_NEQ, + NOOMC_INSTR_LT, + NOOMC_INSTR_LTE, + NOOMC_INSTR_GT, + NOOMC_INSTR_GTE, + + NOOMC_INSTR_NOT, + + NOOMC_INSTR_BAND, + NOOMC_INSTR_BOR, + NOOMC_INSTR_BXOR, + NOOMC_INSTR_BNOT, + NOOMC_INSTR_LSHIFT, + NOOMC_INSTR_RSHIFT, + + NOOMC_INSTR_CONCAT, + NOOMC_INSTR_LEN, + NOOMC_INSTR_GET, + NOOMC_INSTR_SET, + + NOOMC_INSTR_NOP2 = 0xff, +} noomC_InstrType; + +typedef struct noomC_Instr { + noomC_InstrType type; + unsigned char a; + union { + struct { + unsigned char b; + unsigned char c; + }; + unsigned short u; + short s; + }; +} noomC_Instr;