|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"os"
|
|
|
|
|
|
|
|
"github.com/01-edu/z01"
|
|
|
|
)
|
|
|
|
|
|
|
|
const SIZE = 2048
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
if len(os.Args) != 2 {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
progpoint := []byte(os.Args[1])
|
|
|
|
var arby [SIZE]byte
|
|
|
|
pos := 0
|
|
|
|
openBr := 0 // opened brackets
|
|
|
|
i := 0 // iterates through the source code passed in the argument
|
|
|
|
N := len(progpoint) // length of the source code
|
|
|
|
for i >= 0 && i < N {
|
|
|
|
switch progpoint[i] {
|
|
|
|
case '>':
|
|
|
|
// Increment the pointer
|
|
|
|
pos++
|
|
|
|
case '<':
|
|
|
|
// decrement the pointes
|
|
|
|
pos--
|
|
|
|
case '+':
|
|
|
|
// increment the pointed byte
|
|
|
|
arby[pos]++
|
|
|
|
case '-':
|
|
|
|
// decrement the pointed byte
|
|
|
|
arby[pos]--
|
|
|
|
case '.':
|
|
|
|
// print the pointed byte on std output
|
|
|
|
z01.PrintRune(rune(arby[pos]))
|
|
|
|
case '[':
|
|
|
|
// go to the matching ']' if the pointed byte is 0 (while start)
|
|
|
|
openBr = 0
|
|
|
|
if arby[pos] == 0 {
|
|
|
|
for i < N && (progpoint[i] != byte(']') || openBr > 1) {
|
|
|
|
if progpoint[i] == byte('[') {
|
|
|
|
openBr++
|
|
|
|
} else if progpoint[i] == byte(']') {
|
|
|
|
openBr--
|
|
|
|
}
|
|
|
|
i++
|
|
|
|
}
|
|
|
|
}
|
|
|
|
case ']':
|
|
|
|
// go to the matching '[' if the pointed byte is not 0 (while end)
|
|
|
|
openBr = 0
|
|
|
|
if arby[pos] != 0 {
|
|
|
|
for i >= 0 && (progpoint[i] != byte('[') || openBr > 1) {
|
|
|
|
if progpoint[i] == byte(']') {
|
|
|
|
openBr++
|
|
|
|
} else if progpoint[i] == byte('[') {
|
|
|
|
openBr--
|
|
|
|
}
|
|
|
|
i--
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
i++
|
|
|
|
}
|
|
|
|
}
|