brainfuck-go/main.go
2022-06-08 19:41:23 +02:00

74 lines
1.3 KiB
Go

package main
import (
"bufio"
"fmt"
"os"
)
const (
TOKEN_SHIFT_RIGHT = '>'
TOKEN_SHIFT_LEFT = '<'
TOKEN_INCREMENT = '+'
TOKEN_DECREMENT = '-'
TOKEN_PRINT_CHAR = '.'
TOKEN_GET_CHAR = ','
TOKEN_START_LOOP = '['
TOKEN_END_LOOP = ']'
)
type BrainFuck struct {
memory [30000]byte
pointer uint
jmpStack []int
}
func NewBrainFuck() *BrainFuck {
return &BrainFuck{
memory: [30000]byte{},
pointer: 0,
jmpStack: []int{},
}
}
func (b *BrainFuck) Run(input string) {
for i := 0; i < len(input); i++ {
switch input[i] {
case TOKEN_INCREMENT:
b.memory[b.pointer]++
case TOKEN_DECREMENT:
b.memory[b.pointer]--
case TOKEN_SHIFT_RIGHT:
b.pointer++
case TOKEN_SHIFT_LEFT:
b.pointer--
case TOKEN_PRINT_CHAR:
fmt.Print(string(b.memory[b.pointer]))
case TOKEN_GET_CHAR:
fmt.Scanf("%c", &b.memory[b.pointer])
case TOKEN_START_LOOP:
if b.memory[b.pointer] == 0 {
for {
i++
if input[i] == TOKEN_END_LOOP {
break
}
}
} else {
b.jmpStack = append(b.jmpStack, i)
}
case TOKEN_END_LOOP:
if b.memory[b.pointer] != 0 {
i = b.jmpStack[len(b.jmpStack)-1] - 1
b.jmpStack = b.jmpStack[:len(b.jmpStack)-1]
}
}
}
}
func main() {
reader := bufio.NewReader(os.Stdin)
text, _ := reader.ReadString('\n')
NewBrainFuck().Run(text)
}