Files
zern/examples/brainfuck.zr

49 lines
1.5 KiB
Plaintext

func main[] : i64
// https://brainfuck.org/sierpinski.b
let src: str = "++++++++[>+>++++<<-]>++>>+<[-[>>+<<-]+>>]>+[-<<<[->[+[-]+>++>>>-<<]<[<]>>++++++[<<+++++>>-]+<<++.[-]<<]>.>+[>>]>+]"
let src_len: i64 = str.len(src)
let i = 0
let memory: ptr = mem.alloc(30000)
mem.zero(memory, 30000)
let p = 0
while i < src_len
let op: u8 = src[i]
if op == '>'
p = p + 1
else if op == '<'
p = p - 1
else if op == '+'
str.set(memory, p, memory[p] + 1)
else if op == '-'
str.set(memory, p, memory[p] - 1)
else if op == '.'
io.print_char(memory[p])
else if op == ','
str.set(memory, p, io.read_char())
else if op == '['
if !memory[p]
i = i + 1
let opened = 0
while i < src_len && !(src[i] == ']' && !opened)
if src[i] == '['
opened = opened + 1
else if src[i] == ']'
opened = opened - 1
i = i + 1
else if op == ']'
if memory[p]
i = i - 1
let closed = 0
while i >= 0 && !(src[i] == '[' && !closed)
if src[i] == ']'
closed = closed + 1
else if src[i] == '['
closed = closed - 1
i = i - 1
i = i + 1
mem.free(memory)