Practical snippets that show the syntax and behavior of the language.
How the parts fit together to produce an ELF, with zero external dependencies.
Recursive‑descent parser in Go, runs basic semantic checks and types, then walks the tree to drive codegen.
Semantic checks
if origin == ORIGIN_RBP {
switch varType {
case DB:
backend.Sub64_r_i(byte(backend.REG_RSP), 1)
backend.Mov8_m_r(byte(backend.REG_RSP), byte(backend.REG_RAX))
vl.lastPos -= 1
case DW:
backend.Sub64_r_i(byte(backend.REG_RSP), 2)
backend.Mov16_m_r(byte(backend.REG_RSP), byte(backend.REG_RAX))
vl.lastPos -= 2
case DD:
backend.Sub64_r_i(byte(backend.REG_RSP), 4)
backend.Mov32_m_r(byte(backend.REG_RSP), byte(backend.REG_RAX))
vl.lastPos -= 4
case DQ:
backend.Sub64_r_i(byte(backend.REG_RSP), 8)
backend.Mov64_m_r(byte(backend.REG_RSP), byte(backend.REG_RAX))
vl.lastPos -= 8
}
}
SWIG generates slim Go wrappers for the C backend so the parser calls codegen directly — no hand‑written cgo.
See "swig" folder on project repo.
The C backend encodes instructions directly. No assembler, no LLVM. Operations map to byte sequences appended to a buffer.
void mov64_r_i(uint8_t reg_code, uint64_t value)
{
// REX + opcode + immediate (1 + 1 + 8)
char *opcode_bytes = malloc(10);
if (!opcode_bytes)
{
perror("Failed to allocate memory for opcode_bytes");
exit(EXIT_FAILURE);
}
set_rex_prefix(opcode_bytes, 1, 0, 0, (reg_code >= REG_R8) ? 1 : 0);
opcode_bytes[1] = 0xB8 + (reg_code & 0x7); // Opcode for 'mov r64, imm64'
memcpy(&opcode_bytes[2], &value, sizeof(value));
//create new OpCode and append to op_codes_array
OpCode new_opcode;
new_opcode.size = 10;
new_opcode.code = opcode_bytes;
op_codes_array = realloc(op_codes_array, (op_codes_array_size + 1) * sizeof(OpCode));
if (!op_codes_array)
{
perror("Failed to reallocate memory for op_codes_array");
free(opcode_bytes);
exit(EXIT_FAILURE);
}
op_codes_array[op_codes_array_size++] = new_opcode;
}
Wrap the bytes into a minimal ELF: file header, program headers. All written in C.
Result: a runnable ELF produced without an external toolchain.