Skip to content

Instantly share code, notes, and snippets.

@bgnori
Last active August 29, 2015 13:56
Show Gist options
  • Save bgnori/9286699 to your computer and use it in GitHub Desktop.
Save bgnori/9286699 to your computer and use it in GitHub Desktop.
BF 習作, string <-> byteがださい. fizzbazzも動いた.
package main
import "fmt"
type BF struct {
pc int
ptr int
mem [3000]byte
code [1000]byte
stack [1000]int
last int
}
func (self* BF) dump(n int) {
fmt.Printf("pc/ptr = %d/%d ", self.pc, self.ptr)
for i := 0; i< n; i++ {
fmt.Printf("%3d:", self.mem[i])
}
fmt.Printf("\n")
}
func (self* BF) push(pos int) {
//fmt.Printf("pushing %c at %d\n", self.code[pos], pos)
if self.last > 10 {
panic("stack limit exceeded")
}
self.stack[self.last]=pos
self.last++
}
func (self* BF) peek() int {
if self.last < 0 {
panic("peeking empty stack")
}
return self.stack[self.last - 1]
}
func (self* BF) pop() int {
//fmt.Printf("popping %d at %d\n", self.stack[self.last], self.last)
if self.last < 1 {
panic("popping empty stack")
}
self.last--
v := self.stack[self.last]
self.stack[self.last] = 0
return v
}
func (self* BF) seek(from int) int {
for i := from ; i < len(self.code); i++ {
switch self.code[i] {
case ']':
return i
case '[':
i = self.seek(i+1) + 1//skip to
}
}
panic("none match pair of []")
}
func (self* BF) exec(op byte) {
switch op {
case ' ':
self.pc++
case '\n':
self.pc++
case '>':
self.ptr++
self.pc++
case '<':
self.ptr--
self.pc++
case '+':
self.mem[self.ptr]++
self.pc++
case '-':
self.mem[self.ptr]--
self.pc++
case '.':
fmt.Printf("%c", self.mem[self.ptr]) //ascii code!
self.pc++
case '[':
if self.mem[self.ptr] != 0 {
self.push(self.pc)
self.pc++
}else{
self.pc = self.seek(self.pc + 1)
self.pc++
}
case ']':
self.pc = self.pop()
}
}
func (self* BF) run(source string) {
var op byte
for i := 0; i < len(source); i++ {
self.code[i] = source[i]
}
for self.pc < len(source) {
//self.dump(10)
op = self.code[self.pc]
self.exec(op)
}
}
const helloworld = "+++++++++[>++++++++>+++++++++++>+++++<<<-]>.>++.+++++++..+++.>-.------------.<++++++++.--------.+++.------.--------.>+."
const fizzbuzz = "++++++[->++++> >+>+>-<<<<<]>[<++++>" +
">+++>++++> >+++>+++++>+++++> > > > > >++> >++<<<<<<<<<<<<<<-]<++++>+++" +
">-->+++>-> >--->++> > >+++++[->++>++<<]<<<<<<<<<<[->-" +
"[> > > > > > >]>[<+++>.>.> > > >..> > >+<]<<<<<-[> > > >]>[<+" +
"++++>.>.>..> > >+<]> > > >+<-[<<<]<[[-<<+> >]> > >+>+<<<<<" +
"<[-> >+>+>-<<<<]<]>>[[-]<]>[> > >[>.<<.<<<]<[.<<<<]>]>.<<<<" +
"<<<<<<<]"
func main() {
bf := new(BF)
bf.run(fizzbuzz)
//bf.dump()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment