Files
zern/examples/brainfuck.zr
2025-06-30 13:59:17 +02:00

45 lines
1.6 KiB
Plaintext

func main[] : I64
let src: String = "++++++++[>+>++++<<-]>++>>+<[-[>>+<<-]+>>]>+[-<<<[->[+[-]+>++>>>-<<]<[<]>>++++++[<<+++++>>-]+<<++.[-]<<]>.>+[>>]>+]"
let src_len: I64 = strlen(src)
let i: I64 = 0
let memory: Ptr = calloc(1, 30000)
let p: I64 = 0
while i < src_len
let op: U8 = String.nth(src, i)
if op == '>'
p = p + 1
else if op == '<'
p = p - 1
else if op == '+'
String.set(memory, p, String.nth(memory, p)+1)
else if op == '-'
String.set(memory, p, String.nth(memory, p)-1)
else if op == '.'
printf("%c", String.nth(memory, p))
else if op == ','
String.set(memory, p, getchar())
else if op == '['
if !String.nth(memory, p)
i = i + 1
let opened: I64 = 0
while i < src_len && !(String.nth(src, i) == ']' && !opened)
if String.nth(src, i) == '['
opened = opened + 1
else if String.nth(src, i) == ']'
opened = opened - 1
i = i + 1
else if op == ']'
if String.nth(memory, p)
i = i - 1
let closed: I64 = 0
while i >= 0 && !(String.nth(src, i) == '[' && !closed)
if String.nth(src, i) == ']'
closed = closed + 1
else if String.nth(src, i) == '['
closed = closed - 1
i = i - 1
i = i + 1