mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 12:01:16 +00:00
86 lines
1.7 KiB
C
86 lines
1.7 KiB
C
// #target: macos-x64
|
|
module brainfk;
|
|
import std::io;
|
|
|
|
const BF_MEM = 30000;
|
|
char[BF_MEM] memory;
|
|
|
|
fault InterpretError
|
|
{
|
|
INTEPRET_FAILED
|
|
}
|
|
|
|
fn void! print_error(usz pos, char[] err)
|
|
{
|
|
io::printfln("Error at %s: %s", pos, err);
|
|
return InterpretError.INTEPRET_FAILED!;
|
|
}
|
|
|
|
fn void! brainf(char[] program)
|
|
{
|
|
usz sp = 0;
|
|
usz mem = 0;
|
|
while (sp < program.len)
|
|
{
|
|
char c = program[sp++];
|
|
switch (c)
|
|
{
|
|
case '<':
|
|
if (!mem) return print_error(sp, "Memory underflow");
|
|
mem--;
|
|
case '>':
|
|
if (mem == BF_MEM - 1) return print_error(sp, "Memory overflow");
|
|
mem++;
|
|
case '+':
|
|
memory[mem]++;
|
|
case '-':
|
|
memory[mem]--;
|
|
case '.':
|
|
io::putchar(memory[mem]);
|
|
io::stdout().flush();
|
|
case ',':
|
|
memory[mem] = io::stdin().getc()!!;
|
|
case '[':
|
|
usz indent = 1;
|
|
if (memory[mem]) continue;
|
|
usz start = sp - 1;
|
|
while (indent)
|
|
{
|
|
if (sp == program.len) return print_error(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(start, "No matching '['");
|
|
switch (program[--sp])
|
|
{
|
|
case ']': indent++;
|
|
case '[': indent--;
|
|
default: break;
|
|
}
|
|
}
|
|
sp++;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
fn void! main()
|
|
{
|
|
char[] program = `
|
|
++++[>+++++<-]>[<+++++>-]+<+[
|
|
>[>+>+<<-]++>>[<<+>>-]>>>[-]++>[-]+
|
|
>>>+[[-]++++++>>>]<<<[[<++++++++<++>>-]+<.<[>----<-]<]
|
|
<<[>>>>>[>>>[-]+++++++++<[>-<-]+++++++++>[-[<->-]+[<<<]]<[>+<-]>]<<-]<<-
|
|
]`;
|
|
brainf(program)?;
|
|
} |