$ENTRY Go { , : e.File , : e.Source , : { F e.Error = ; T e.Prog = ; }; }; ReadFile { s.Chan e.File = ; (s.Chan), : { 0 = ; e.Line = }; } SanitizeBF { = ; s.C e.X, '+-<>.,[]': e.L s.C e.R = s.C ; s.C e.X = ; }; ParseBF { e.X, : { T = T ; e.Err = e.Err; }; }; CheckLoops { (0) = T; (s.N) = F 'Mismatched ['; (0) ']' e.X = F 'Mismatched ]'; (s.N) '[' e.X = ) e.X>; (s.N) ']' e.X = ) e.X>; (s.N) s.I e.X = ; e.X = ; }; ParseLoops { (e.X) (e.C) = e.X e.C; (e.R) (e.Cur) '[' e.Prog = ; (e.R (e.Last)) (e.Cur) ']' e.Prog = ; (e.R) (e.Cur) s.Instr e.Prog = ; } RunProgram { e.Prog, (() 0 ()): t.Tape, (() ()): t.IObuf, (t.Tape t.IObuf): t.State, : (t.TapeOut t.IObufOut), t.IObufOut: ((e.In) (e.Out)), e.Out: { = ; e.X = ; }; }; RunBF { t.State = t.State; t.State t.Step e.Prog = e.Prog>; }; StepBF { (t.Tape t.IObuf) '+' = ( t.IObuf); (t.Tape t.IObuf) '-' = ( t.IObuf); (t.Tape t.IObuf) '<' = ( t.IObuf); (t.Tape t.IObuf) '>' = ( t.IObuf); t.State ',' = ; t.State '.' = ; t.State (e.Loop), t.State: ((t.L 0 t.R) t.IObuf) = t.State; t.State (e.Loop), : t.Newstate = ; }; TapeLeft { ((e.L s.N) s.C (e.R)) = ((e.L) s.N (s.C e.R)); (() s.C (e.R)) = (() 0 (s.C e.R)); }; TapeRight { ((e.L) s.C (s.N e.R)) = ((e.L s.C) s.N (e.R)); ((e.L) s.C ()) = ((e.L s.C) 0 ()); }; TapeF { s.F ((e.L) s.C (e.R)) = ((e.L) (e.R)); }; BFIn { (t.Tape t.IObuf), t.Tape: (t.L s.C t.R), t.IObuf: (t.In t.Out), t.In: { (s.Char e.Rest), (t.L s.Char t.R): t.Newtape, ((e.Rest) t.Out): t.NewIO = (t.Newtape t.NewIO); (), : { 0 = ((t.L 0 t.R) t.IObuf); e.Line = 10) t.Out))>; }; }; }; BFOut { (t.Tape t.IObuf), t.Tape: (t.L s.C t.R), t.IObuf: (t.In t.Out), s.C: { 10, t.Out: (e.Line) = > (t.Tape (t.In ())); s.C, t.Out: (e.Line) = (t.Tape (t.In (e.Line s.C))); }; }; Inc { s.X = 256>; }; Dec { s.X = 256>; };