Dies ist ein kleiner Interpreter für BF, den ich vor einem Monat geschrieben habe.
Nichts neuartiges, aber ich dachte mir, ich teile es trotzdem.
Ein kleines Nutzungsbeispiel:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| package de.niklaskorz.brainfuck
class Interpreter {
var offset = 0
var data = new Array[Char](30000)
var loopStart = new scala.collection.mutable.Stack[Int]
def eval(source: String) {
var i = 0
while (i < source.length) { source(i) match {
case '>' => offset += 1
case '<' => offset -= 1
case '+' => data(offset) = (data(offset) + 1).toChar
case '-' => data(offset) = (data(offset) - 1).toChar
case '.' => print(data(offset))
case ',' => data(offset) = Console.in.read.toChar
case '[' => loopStart.push(i)
case ']' => if (data(offset) != 0) i = loopStart.head else loopStart.pop
case _ =>
}; i += 1 }
}
}
|
Listing 1. brainfuck.scala 1
2
3
4
5
6
7
8
9
10
11
| package de.niklaskorz.brainfuck
import scala.io.Source
object App {
def main(args: Array[String]) {
var interpreter = new Interpreter
var source = Source.fromFile(args(0)).mkString
interpreter.eval(source)
}
}
|
Listing 2. main.scalaIch habe ihn mit dem Hello-World-Programm von Wikipedia sowie dem »99 Bottles of Beer«-Programm, das ich auf dieser Seite gefunden habe, getestet.
Hello world:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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'
|
Listing 3. helloworld.bfNachtrag (19. Januar 2013): Wie in den Kommentaren bereits erwähnt wurde, behandelt dieser Interpreter Schleifen eher wie Do-While- statt While-Loops.