mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 12:01:16 +00:00
Upgrade of mingw in CI. Fix problems using reflection on interface types #1203. Improved debug information on defer. $foreach doesn't create an implicit syntactic scope. Error if `@if` depends on `@if`. Updated Linux stacktrace. Fix of default argument stacktrace. Allow linking libraries directly by file path. Improve inlining warning messages. Added `index_of_char_from`. Compiler crash using enum nameof from different module #1205. Removed unused fields in find_msvc. Use vswhere to find msvc. Update tests for LLVM 19
85 lines
1.7 KiB
Plaintext
85 lines
1.7 KiB
Plaintext
module brainfk;
|
|
import std::io;
|
|
|
|
const BF_MEM = 30000;
|
|
char[BF_MEM] memory;
|
|
|
|
fault InterpretError
|
|
{
|
|
INTEPRET_FAILED
|
|
}
|
|
|
|
fn void! print_error_type_at(usz pos, String err)
|
|
{
|
|
io::printfn("Error at %s: %s", pos, err);
|
|
return InterpretError.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)!;
|
|
} |