! Copyright (C) 2009 John Benediktsson
! See http://factorcode.org/license.txt for BSD license
-USING: accessors assocs command-line fry io io.encodings.binary
+USING: accessors assocs command-line io io.encodings.binary
io.files io.streams.string kernel macros math namespaces
-peg.ebnf prettyprint sequences ;
+peg.ebnf prettyprint sequences multiline ;
IN: brainfuck
: (-) ( brainfuck n -- brainfuck )
[ get-memory ] dip - 255 bitand set-memory ;
-: (?) ( brainfuck -- brainfuck t/f )
- get-memory zero? not ;
-
: (.) ( brainfuck -- brainfuck )
get-memory write1 ;
: compose-all ( seq -- quot )
[ ] [ compose ] reduce ;
-EBNF: parse-brainfuck
+EBNF: parse-brainfuck [=[
inc-ptr = (">")+ => [[ length '[ _ (>) ] ]]
dec-ptr = ("<")+ => [[ length '[ _ (<) ] ]]
unknown = (.) => [[ "Invalid input" throw ]]
ops = inc-ptr|dec-ptr|inc-mem|dec-mem|output|input|debug|space
-loop = "[" {loop|ops}+ "]" => [[ second compose-all '[ [ (?) ] _ while ] ]]
+loop = "[" {loop|ops}+ "]" => [[ second compose-all '[ [ get-memory zero? ] _ until ] ]]
code = (loop|ops|unknown)* => [[ compose-all ]]
-;EBNF
+]=]
PRIVATE>
: brainfuck-main ( -- )
command-line get [
- contents (run-brainfuck)
+ read-contents (run-brainfuck)
] [
[ binary file-contents (run-brainfuck) ] each
] if-empty ;