go-brainfuck-yourself

A Brainfuck interpreter that I wrote myself in Go
git clone git@abtrout.com:go-brainfuck-yourself.git
Log | Files | Refs | README

commit f5c1fb462a5163db0e9240fa5cad6a67bd4b2a61
parent 61f8144755065e465703f2381b0c07e632dda094
Author: david cochran <about.trout@gmail.com>
Date:   Sat, 30 Dec 2023 05:30:59 -0800

fixes #8 - let REPL handle interpreter Reset

Diffstat:
Mbf.go | 12------------
Mcmd/gbfy/main.go | 25++++++++++++-------------
2 files changed, 12 insertions(+), 25 deletions(-)

diff --git a/bf.go b/bf.go @@ -104,18 +104,6 @@ func (bf *Brainfuck) Dump() (int, []byte, int, []byte) { return bf.d, bf.cells[:], bf.i, bf.cmds } -// Reset interpreter state. -func (bf *Brainfuck) Reset() { - bf.d = 0 - bf.cells = [len(bf.cells)]byte{} - - bf.i = 0 - bf.cmds = nil - - bf.loops = map[int]int{} - bf.parLoops = nil -} - // Run runs a Brainfuck program and returns output bytes or error. func Run(cmds []byte, in io.Reader) ([]byte, error) { var out bytes.Buffer diff --git a/cmd/gbfy/main.go b/cmd/gbfy/main.go @@ -13,9 +13,9 @@ import ( ) var ( - codeFile = flag.String("f", "", "Path to Brainfuck program to execute") - dataFile = flag.String("d", "", "Path to file containing input data for program") - endInteractive = flag.Bool("i", false, "Launch interactive interpreter before exit") + codeFile = flag.String("f", "", "Path to Brainfuck program to execute") + dataFile = flag.String("d", "", "Path to file containing input data for program") + launchRepl = flag.Bool("i", false, "Launch interactive interpreter before exit") ) func main() { @@ -35,17 +35,15 @@ func main() { if err := runCodeFile(bf); err != nil { log.Fatalf("Execution failed: %v", err) } - log.Printf("Output from execution: %v\n", out.Bytes()) - } else { - if err := runPiped(bf); err != nil { - log.Fatalf("Execution failed: %v", err) - } - log.Printf("Output from execution: %v\n", out.Bytes()) + } else if err := runPiped(bf); err != nil { + log.Fatalf("Execution failed: %v", err) } - if *endInteractive { + if *launchRepl { log.Println("Starting interactive REPL ...") - repl(bf, &out) + repl(bf, &in, &out) + } else { + log.Printf("Output from execution: %v\n", out.Bytes()) } } @@ -54,7 +52,7 @@ const welcomeMsg = `Go Brainfuck Yourself! :f[uck] to reset interpreter state :q[uit] to exit REPL loop` -func repl(bf *gbfy.Brainfuck, out *bytes.Buffer) { +func repl(bf *gbfy.Brainfuck, in, out *bytes.Buffer) { fmt.Println(welcomeMsg) f, err := os.Open("/dev/tty") @@ -81,7 +79,8 @@ func repl(bf *gbfy.Brainfuck, out *bytes.Buffer) { case 'd': formatDump(bf, out.Bytes()) case 'f': - bf.Reset() + out.Reset() // reset output buffer! + bf = gbfy.New(in, out) fmt.Println("Reset interpreter!") case 'q': break