Files
c3c/resources/examples/brainfk.c3
Christoffer Lerno cdabe8fd9e - Create optional with ~ instead of ?. return io::EOF?; becomes return io::EOF~.
- Deprecated use of `?` to create optional.
2026-01-20 16:10:28 +01:00

82 lines
1.7 KiB
Plaintext

module brainfk;
import std::io;
const BF_MEM = 30000;
char[BF_MEM] memory;
faultdef INTEPRET_FAILED;
fn void? print_error_type_at(usz pos, String err)
{
io::printfn("Error at %s: %s", pos, err);
return INTEPRET_FAILED~;
}
fn void? brainf(String program)
{
usz sp = 0;
usz mem = 0;
while (sp < program.len)
{
char c = program[sp++];
switch (c)
{
case '<':
if (!mem) return print_error_type_at(sp, "Memory underflow");
mem--;
case '>':
if (mem == BF_MEM - 1) return print_error_type_at(sp, "Memory overflow");
mem++;
case '+':
memory[mem]++;
case '-':
memory[mem]--;
case '.':
io::putchar(memory[mem]);
io::stdout().flush()!;
case ',':
memory[mem] = io::stdin().read_byte()!!;
case '[':
usz indent = 1;
if (memory[mem]) continue;
usz start = sp - 1;
while (indent)
{
if (sp == program.len) return print_error_type_at(start, "No matching ']'");
switch (program[sp++])
{
case ']': indent--;
case '[': indent++;
default: break;
}
}
case ']':
if (!memory[mem]) continue;
usz start = sp--;
usz indent = 1;
while (indent)
{
if (!sp) return print_error_type_at(start, "No matching '['");
switch (program[--sp])
{
case ']': indent++;
case '[': indent--;
default: break;
}
}
sp++;
default:
break;
}
}
}
fn void main()
{
String program = `
++++[>+++++<-]>[<+++++>-]+<+[
>[>+>+<<-]++>>[<<+>>-]>>>[-]++>[-]+
>>>+[[-]++++++>>>]<<<[[<++++++++<++>>-]+<.<[>----<-]<]
<<[>>>>>[>>>[-]+++++++++<[>-<-]+++++++++>[-[<->-]+[<<<]]<[>+<-]>]<<-]<<-
]`;
brainf(program)!!;
}