Initial version of a brainfuck interpreter
This commit is contained in:
commit
a2a232f8b6
|
@ -0,0 +1,113 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
)
|
||||
|
||||
const (
|
||||
MEM_MAX = 3000000
|
||||
MEM_STD = 30000
|
||||
)
|
||||
|
||||
type Machine struct {
|
||||
array []byte
|
||||
ptr int
|
||||
reader *bufio.Reader
|
||||
}
|
||||
|
||||
// Returns a new machine with standard memory size
|
||||
func New() *Machine {
|
||||
bytes := make([]byte, MEM_STD)
|
||||
return &Machine{
|
||||
array: bytes,
|
||||
ptr: 0,
|
||||
reader: bufio.NewReader(os.Stdin),
|
||||
}
|
||||
}
|
||||
|
||||
// Implements '>'
|
||||
func (m *Machine) PtrIncr() {
|
||||
if m.ptr >= len(m.array)-1 {
|
||||
m.array = append(m.array, 0)
|
||||
}
|
||||
m.ptr += 1
|
||||
if m.ptr > MEM_MAX {
|
||||
panic("Memory overflow")
|
||||
}
|
||||
}
|
||||
|
||||
// Implements '<'
|
||||
func (m *Machine) PtrDecr() {
|
||||
if m.ptr == 0 {
|
||||
panic("Memory underflow")
|
||||
}
|
||||
m.ptr -= 1
|
||||
}
|
||||
|
||||
// Implements '+'
|
||||
func (m *Machine) ByteIncr() {
|
||||
if m.ptr > len(m.array)-1 {
|
||||
fmt.Printf("Memory overflow, ptr=%d\n", m.ptr)
|
||||
}
|
||||
m.array[m.ptr] += 1
|
||||
}
|
||||
|
||||
// Implements '-'
|
||||
func (m *Machine) ByteDecr() {
|
||||
m.array[m.ptr] -= 1
|
||||
}
|
||||
|
||||
// Implements the '.' command
|
||||
func (m *Machine) Output() {
|
||||
fmt.Printf("%c", m.array[m.ptr])
|
||||
}
|
||||
|
||||
// Implements the ',' command
|
||||
func (m *Machine) Input() {
|
||||
input, err := m.reader.ReadByte()
|
||||
if err != nil {
|
||||
m.array[m.ptr] = 0
|
||||
} else {
|
||||
m.array[m.ptr] = input
|
||||
}
|
||||
}
|
||||
|
||||
// Run the whole program specified by input
|
||||
func (m *Machine) Run(input []byte) {
|
||||
// execute the program
|
||||
loop := -1
|
||||
discard := false
|
||||
for i := 0; i < len(input); i++ {
|
||||
instr := input[i]
|
||||
if discard && instr != ']' {
|
||||
continue
|
||||
} else if instr == '[' {
|
||||
loop = i
|
||||
if m.array[m.ptr] == 0 {
|
||||
discard = true
|
||||
}
|
||||
} else if instr == ']' {
|
||||
if m.array[m.ptr] != 0 {
|
||||
i = loop
|
||||
} else {
|
||||
discard = false
|
||||
}
|
||||
} else if instr == '>' {
|
||||
m.PtrIncr()
|
||||
} else if instr == '<' {
|
||||
m.PtrDecr()
|
||||
} else if instr == '+' {
|
||||
m.ByteIncr()
|
||||
} else if instr == '-' {
|
||||
m.ByteDecr()
|
||||
} else if instr == '.' {
|
||||
m.Output()
|
||||
} else if instr == ',' {
|
||||
m.Input()
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,60 @@
|
|||
99 Bottles of Beer in Urban Mueller's BrainF*** (The actual
|
||||
name is impolite)
|
||||
|
||||
by Ben Olmstead
|
||||
|
||||
ANSI C interpreter available on the internet; due to
|
||||
constraints in comments the address below needs to have the
|
||||
stuff in parenthesis replaced with the appropriate symbol:
|
||||
|
||||
http://www(dot)cats(dash)eye(dot)com/cet/soft/lang/bf/
|
||||
|
||||
Believe it or not this language is indeed Turing complete!
|
||||
Combines the speed of BASIC with the ease of INTERCAL and
|
||||
the readability of an IOCCC entry!
|
||||
|
||||
>+++++++++[<+++++++++++>-]<[>[-]>[-]<<[>+>+<<-]>>[<<+>>-]>>>
|
||||
[-]<<<+++++++++<[>>>+<<[>+>[-]<<-]>[<+>-]>[<<++++++++++>>>+<
|
||||
-]<<-<-]+++++++++>[<->-]>>+>[<[-]<<+>>>-]>[-]+<<[>+>-<<-]<<<
|
||||
[>>+>+<<<-]>>>[<<<+>>>-]>[<+>-]<<-[>[-]<[-]]>>+<[>[-]<-]<+++
|
||||
+++++[<++++++<++++++>>-]>>>[>+>+<<-]>>[<<+>>-]<[<<<<<.>>>>>-
|
||||
]<<<<<<.>>[-]>[-]++++[<++++++++>-]<.>++++[<++++++++>-]<++.>+
|
||||
++++[<+++++++++>-]<.><+++++..--------.-------.>>[>>+>+<<<-]>
|
||||
>>[<<<+>>>-]<[<<<<++++++++++++++.>>>>-]<<<<[-]>++++[<+++++++
|
||||
+>-]<.>+++++++++[<+++++++++>-]<--.---------.>+++++++[<------
|
||||
---->-]<.>++++++[<+++++++++++>-]<.+++..+++++++++++++.>++++++
|
||||
++[<---------->-]<--.>+++++++++[<+++++++++>-]<--.-.>++++++++
|
||||
[<---------->-]<++.>++++++++[<++++++++++>-]<++++.-----------
|
||||
-.---.>+++++++[<---------->-]<+.>++++++++[<+++++++++++>-]<-.
|
||||
>++[<----------->-]<.+++++++++++..>+++++++++[<---------->-]<
|
||||
-----.---.>>>[>+>+<<-]>>[<<+>>-]<[<<<<<.>>>>>-]<<<<<<.>>>+++
|
||||
+[<++++++>-]<--.>++++[<++++++++>-]<++.>+++++[<+++++++++>-]<.
|
||||
><+++++..--------.-------.>>[>>+>+<<<-]>>>[<<<+>>>-]<[<<<<++
|
||||
++++++++++++.>>>>-]<<<<[-]>++++[<++++++++>-]<.>+++++++++[<++
|
||||
+++++++>-]<--.---------.>+++++++[<---------->-]<.>++++++[<++
|
||||
+++++++++>-]<.+++..+++++++++++++.>++++++++++[<---------->-]<
|
||||
-.---.>+++++++[<++++++++++>-]<++++.+++++++++++++.++++++++++.
|
||||
------.>+++++++[<---------->-]<+.>++++++++[<++++++++++>-]<-.
|
||||
-.---------.>+++++++[<---------->-]<+.>+++++++[<++++++++++>-
|
||||
]<--.+++++++++++.++++++++.---------.>++++++++[<---------->-]
|
||||
<++.>+++++[<+++++++++++++>-]<.+++++++++++++.----------.>++++
|
||||
+++[<---------->-]<++.>++++++++[<++++++++++>-]<.>+++[<----->
|
||||
-]<.>+++[<++++++>-]<..>+++++++++[<--------->-]<--.>+++++++[<
|
||||
++++++++++>-]<+++.+++++++++++.>++++++++[<----------->-]<++++
|
||||
.>+++++[<+++++++++++++>-]<.>+++[<++++++>-]<-.---.++++++.----
|
||||
---.----------.>++++++++[<----------->-]<+.---.[-]<<<->[-]>[
|
||||
-]<<[>+>+<<-]>>[<<+>>-]>>>[-]<<<+++++++++<[>>>+<<[>+>[-]<<-]
|
||||
>[<+>-]>[<<++++++++++>>>+<-]<<-<-]+++++++++>[<->-]>>+>[<[-]<
|
||||
<+>>>-]>[-]+<<[>+>-<<-]<<<[>>+>+<<<-]>>>[<<<+>>>-]<>>[<+>-]<
|
||||
<-[>[-]<[-]]>>+<[>[-]<-]<++++++++[<++++++<++++++>>-]>>>[>+>+
|
||||
<<-]>>[<<+>>-]<[<<<<<.>>>>>-]<<<<<<.>>[-]>[-]++++[<++++++++>
|
||||
-]<.>++++[<++++++++>-]<++.>+++++[<+++++++++>-]<.><+++++..---
|
||||
-----.-------.>>[>>+>+<<<-]>>>[<<<+>>>-]<[<<<<++++++++++++++
|
||||
.>>>>-]<<<<[-]>++++[<++++++++>-]<.>+++++++++[<+++++++++>-]<-
|
||||
-.---------.>+++++++[<---------->-]<.>++++++[<+++++++++++>-]
|
||||
<.+++..+++++++++++++.>++++++++[<---------->-]<--.>+++++++++[
|
||||
<+++++++++>-]<--.-.>++++++++[<---------->-]<++.>++++++++[<++
|
||||
++++++++>-]<++++.------------.---.>+++++++[<---------->-]<+.
|
||||
>++++++++[<+++++++++++>-]<-.>++[<----------->-]<.+++++++++++
|
||||
..>+++++++++[<---------->-]<-----.---.+++.---.[-]<<<]
|
||||
|
|
@ -0,0 +1 @@
|
|||
>+++++++++[<++++++++>-]<.>+++++++[<++++>-]<+.+++++++..+++.[-]>++++++++[<++++>-]<.#>+++++++++++[<+++++>-]<.>++++++++[<+++>-]<.+++.------.--------.[-]>++++++++[<++++>-]<+.[-]++++++++++.
|
|
@ -0,0 +1,6 @@
|
|||
Here is a Brainf*** program that bubblesorts its input and spits it out:
|
||||
>>>>>,+[>>>,+]<<<[<<<
|
||||
[>>>[-<<<-<+>[>]>>]<<<[<]>>
|
||||
[>>>+<<<-]<[>+>>>+<<<<-]
|
||||
<<]>>>[-.[-]]>>>[>>>]<<<]
|
||||
|
|
@ -0,0 +1 @@
|
|||
,[.,]
|
|
@ -0,0 +1,21 @@
|
|||
+++++ +++++ initialize counter (cell #0) to 10
|
||||
[ use loop to set the next four cells to 70/100/30/10
|
||||
> +++++ ++ add 7 to cell #1
|
||||
> +++++ +++++ add 10 to cell #2
|
||||
> +++ add 3 to cell #3
|
||||
> + add 1 to cell #4
|
||||
<<<< - decrement counter (cell #0)
|
||||
]
|
||||
> ++ . print 'H'
|
||||
> + . print 'e'
|
||||
+++++ ++ . print 'l'
|
||||
. print 'l'
|
||||
+++ . print 'o'
|
||||
> ++ . print ' '
|
||||
<< +++++ +++++ +++++ . print 'W'
|
||||
> . print 'o'
|
||||
+++ . print 'r'
|
||||
----- - . print 'l'
|
||||
----- --- . print 'd'
|
||||
> + . print '!'
|
||||
> . print '\n'
|
|
@ -0,0 +1,224 @@
|
|||
compute prime numbers
|
||||
to use type the max number then push Alt 1 0
|
||||
===================================================================
|
||||
======================== OUTPUT STRING ============================
|
||||
===================================================================
|
||||
>++++++++[<++++++++>-]<++++++++++++++++.[-]
|
||||
>++++++++++[<++++++++++>-]<++++++++++++++.[-]
|
||||
>++++++++++[<++++++++++>-]<+++++.[-]
|
||||
>++++++++++[<++++++++++>-]<+++++++++.[-]
|
||||
>++++++++++[<++++++++++>-]<+.[-]
|
||||
>++++++++++[<++++++++++>-]<+++++++++++++++.[-]
|
||||
>+++++[<+++++>-]<+++++++.[-]
|
||||
>++++++++++[<++++++++++>-]<+++++++++++++++++.[-]
|
||||
>++++++++++[<++++++++++>-]<++++++++++++.[-]
|
||||
>+++++[<+++++>-]<+++++++.[-]
|
||||
>++++++++++[<++++++++++>-]<++++++++++++++++.[-]
|
||||
>++++++++++[<++++++++++>-]<+++++++++++.[-]
|
||||
>+++++++[<+++++++>-]<+++++++++.[-]
|
||||
>+++++[<+++++>-]<+++++++.[-]
|
||||
|
||||
===================================================================
|
||||
======================== INPUT NUMBER ============================
|
||||
===================================================================
|
||||
+ cont=1
|
||||
[
|
||||
- cont=0
|
||||
>,
|
||||
======SUB10======
|
||||
----------
|
||||
|
||||
[ not 10
|
||||
<+> cont=1
|
||||
=====SUB38======
|
||||
----------
|
||||
----------
|
||||
----------
|
||||
--------
|
||||
|
||||
>
|
||||
=====MUL10=======
|
||||
[>+>+<<-]>>[<<+>>-]< dup
|
||||
|
||||
>>>+++++++++
|
||||
[
|
||||
<<<
|
||||
[>+>+<<-]>>[<<+>>-]< dup
|
||||
[<<+>>-]
|
||||
>>-
|
||||
]
|
||||
<<<[-]<
|
||||
======RMOVE1======
|
||||
<
|
||||
[>+<-]
|
||||
]
|
||||
<
|
||||
]
|
||||
>>[<<+>>-]<<
|
||||
|
||||
===================================================================
|
||||
======================= PROCESS NUMBER ===========================
|
||||
===================================================================
|
||||
|
||||
==== ==== ==== ====
|
||||
numd numu teid teiu
|
||||
==== ==== ==== ====
|
||||
|
||||
>+<-
|
||||
[
|
||||
>+
|
||||
======DUP======
|
||||
[>+>+<<-]>>[<<+>>-]<
|
||||
|
||||
>+<--
|
||||
|
||||
>>>>>>>>+<<<<<<<< isprime=1
|
||||
|
||||
[
|
||||
>+
|
||||
|
||||
<-
|
||||
|
||||
=====DUP3=====
|
||||
<[>>>+>+<<<<-]>>>>[<<<<+>>>>-]<<<
|
||||
|
||||
=====DUP2=====
|
||||
>[>>+>+<<<-]>>>[<<<+>>>-]<<< <
|
||||
|
||||
|
||||
>>>
|
||||
|
||||
|
||||
====DIVIDES=======
|
||||
[>+>+<<-]>>[<<+>>-]< DUP i=div
|
||||
|
||||
<<
|
||||
[
|
||||
>>>>>+ bool=1
|
||||
<<<
|
||||
[>+>+<<-]>>[<<+>>-]< DUP
|
||||
[>>[-]<<-] IF i THEN bool=0
|
||||
>>
|
||||
[ IF i=0
|
||||
<<<<
|
||||
[>+>+<<-]>>[<<+>>-]< i=div
|
||||
>>>
|
||||
- bool=0
|
||||
]
|
||||
<<<
|
||||
- DEC i
|
||||
<<
|
||||
-
|
||||
]
|
||||
|
||||
+>>[<<[-]>>-]<<
|
||||
>[-]< CLR div
|
||||
=====END DIVIDES====
|
||||
|
||||
|
||||
[>>>>>>[-]<<<<<<-] if divides then isprime=0
|
||||
|
||||
|
||||
<<
|
||||
|
||||
>>[-]>[-]<<<
|
||||
]
|
||||
|
||||
>>>>>>>>
|
||||
[
|
||||
-
|
||||
<<<<<<<[-]<<
|
||||
|
||||
[>>+>+<<<-]>>>[<<<+>>>-]<<<
|
||||
|
||||
>>
|
||||
|
||||
|
||||
|
||||
|
||||
===================================================================
|
||||
======================== OUTPUT NUMBER ===========================
|
||||
===================================================================
|
||||
[>+<-]>
|
||||
|
||||
[
|
||||
======DUP======
|
||||
[>+>+<<-]>>[<<+>>-]<
|
||||
|
||||
|
||||
======MOD10====
|
||||
>+++++++++<
|
||||
[
|
||||
>>>+<< bool= 1
|
||||
[>+>[-]<<-] bool= ten==0
|
||||
>[<+>-] ten = tmp
|
||||
>[<<++++++++++>>-] if ten=0 ten=10
|
||||
<<- dec ten
|
||||
<- dec num
|
||||
]
|
||||
+++++++++ num=9
|
||||
>[<->-]< dec num by ten
|
||||
|
||||
=======RROT======
|
||||
[>+<-]
|
||||
< [>+<-]
|
||||
< [>+<-]
|
||||
>>>[<<<+>>>-]
|
||||
<
|
||||
|
||||
=======DIV10========
|
||||
>+++++++++<
|
||||
[
|
||||
>>>+<< bool= 1
|
||||
[>+>[-]<<-] bool= ten==0
|
||||
>[<+>-] ten = tmp
|
||||
>[<<++++++++++>>>+<-] if ten=0 ten=10 inc div
|
||||
<<- dec ten
|
||||
<- dec num
|
||||
]
|
||||
>>>>[<<<<+>>>>-]<<<< copy div to num
|
||||
>[-]< clear ten
|
||||
|
||||
=======INC1=========
|
||||
<+>
|
||||
]
|
||||
|
||||
<
|
||||
[
|
||||
=======MOVER=========
|
||||
[>+<-]
|
||||
|
||||
=======ADD48========
|
||||
+++++++[<+++++++>-]<->
|
||||
|
||||
=======PUTC=======
|
||||
<.[-]>
|
||||
|
||||
======MOVEL2========
|
||||
>[<<+>>-]<
|
||||
|
||||
<-
|
||||
]
|
||||
|
||||
>++++[<++++++++>-]<.[-]
|
||||
|
||||
===================================================================
|
||||
=========================== END FOR ===============================
|
||||
===================================================================
|
||||
|
||||
|
||||
>>>>>>>
|
||||
]
|
||||
<<<<<<<<
|
||||
|
||||
|
||||
|
||||
>[-]<
|
||||
[-]
|
||||
<<-
|
||||
]
|
||||
|
||||
======LF========
|
||||
|
||||
++++++++++.[-]
|
||||
@
|
|
@ -0,0 +1,29 @@
|
|||
|
||||
-,+[ Read first character and start outer character reading loop
|
||||
-[ Skip forward if character is 0
|
||||
>>++++[>++++++++<-] Set up divisor (32) for division loop
|
||||
(MEMORY LAYOUT: dividend copy remainder divisor quotient zero zero)
|
||||
<+<-[ Set up dividend (x minus 1) and enter division loop
|
||||
>+>+>-[>>>] Increase copy and remainder / reduce divisor / Normal case: skip forward
|
||||
<[[>+<-]>>+>] Special case: move remainder back to divisor and increase quotient
|
||||
<<<<<- Decrement dividend
|
||||
] End division loop
|
||||
]>>>[-]+ End skip loop; zero former divisor and reuse space for a flag
|
||||
>--[-[<->+++[-]]]<[ Zero that flag unless quotient was 2 or 3; zero quotient; check flag
|
||||
++++++++++++<[ If flag then set up divisor (13) for second division loop
|
||||
(MEMORY LAYOUT: zero copy dividend divisor remainder quotient zero zero)
|
||||
>-[>+>>] Reduce divisor; Normal case: increase remainder
|
||||
>[+[<+>-]>+>>] Special case: increase remainder / move it back to divisor / increase quotient
|
||||
<<<<<- Decrease dividend
|
||||
] End division loop
|
||||
>>[<+>-] Add remainder back to divisor to get a useful 13
|
||||
>[ Skip forward if quotient was 0
|
||||
-[ Decrement quotient and skip forward if quotient was 1
|
||||
-<<[-]>> Zero quotient and divisor if quotient was 2
|
||||
]<<[<<->>-]>> Zero divisor and subtract 13 from copy if quotient was 1
|
||||
]<<[<<+>>-] Zero divisor and add 13 to copy if quotient was 0
|
||||
] End outer skip loop (jump to here if ((character minus 1)/32) was not 2 or 3)
|
||||
<[-] Clear remainder from first division if second division was skipped
|
||||
<.[-] Output ROT13ed character from copy and clear it
|
||||
<-,+ Read next character
|
||||
] End character reading loop
|
|
@ -0,0 +1,2 @@
|
|||
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--
|
||||
------.>+.>.
|
|
@ -0,0 +1,2 @@
|
|||
+++[>+++++<-]>[>+>+++>+>++>+++++>++<[++<]>---]>.-.[>++>+<<--]>--.--.+.>>>++.<<.<------.+.+++++.>>-
|
||||
.<++++.<--.>>>.<<---.<.-.-.>+.[+++++.---<]>>[.--.]<<.<+.++.++>+++[.<][.]<++.
|
|
@ -0,0 +1,22 @@
|
|||
package main
|
||||
|
||||
import "brainfuck"
|
||||
|
||||
func main() {
|
||||
m := New()
|
||||
instructions := make([]byte, 0)
|
||||
|
||||
// read in the instructions
|
||||
if len(os.Args) < 2 {
|
||||
panic("No input given")
|
||||
}
|
||||
|
||||
file, err := os.Open(os.Args[1])
|
||||
reader := bufio.NewReader(file)
|
||||
instructions, err = ioutil.ReadAll(reader)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
m.Run(instructions)
|
||||
}
|
Loading…
Reference in New Issue