Last active 1 week ago

kapunta's Avatar kapunta revised this gist 1 week ago. Go to revision

1 file changed, 111 insertions

bf.nova(file created)

@@ -0,0 +1,111 @@
1 + |# Brainfuck
2 +
3 + the brackets are written as { } because of the January syntax.
4 +
5 + output is stored in :output: as bits.
6 +
7 + the input operator is not implemented.
8 +
9 + #|
10 +
11 + || :: control test
12 +
13 + |# test programs #|
14 +
15 + | :: number 65 test |
16 + :: start
17 + :program: (
18 + + + + + + + + + + + + + + + + + + + + +
19 + + + + + + + + + + + + + + + + + + + + +
20 + + + + + + + + + + + + + + + + + + + + +
21 + + + + + + [.]
22 + )
23 +
24 + | :: overflow test |
25 + :: start
26 + :program: (
27 + - - - [.] + + + + + [.]
28 + )
29 +
30 + | :: tape test |
31 + :: start
32 + :program: (
33 + + > + + > + + + > > - < < < - - -
34 + < < < + + + + + + +
35 + > > > +
36 + )
37 +
38 + | :: control test |
39 + :: start
40 + :program: (
41 + + + + + + { > + > + + < < - }
42 + > [.] > [.]
43 + )
44 +
45 + |# interpreter #|
46 +
47 + | :: start | :: head empty :: interpret
48 +
49 + | :: head empty | :tape: ( 0 0 0 0 0 0 0 0 )
50 +
51 + | :symbol: + | :: increment
52 + | :: increment :tape: 0 | :tape: 1 :: restore number
53 + | :: increment? :tape: 1 | :number: 0
54 + | :: increment | :: restore number
55 +
56 + | :symbol: - | :: decrement
57 + | :: decrement? :tape: 0 | :number: 1
58 + | :: decrement :tape: 1 | :tape: 0 :: restore number
59 + | :: decrement | :: restore number
60 +
61 + | :symbol: > | :: next cell
62 + | :: next cell :after: ; | :tape: ; :: forward
63 + | :: next cell | :tape: ( 0 0 0 0 0 0 0 0 ; )
64 + | :: forward? :after: 0 | :tape: 0
65 + | :: forward? :after: 1 | :tape: 1
66 + | :: forward :after: ;? |
67 + | :: forward |
68 +
69 + | :symbol: < | :: previous cell
70 + | :: previous cell? :tape: 0 | :after: 0
71 + | :: previous cell? :tape: 1 | :after: 1
72 + | :: previous cell :tape: ; | :after: ; :: head not empty
73 + | :: previous cell | :after: ; :: refill head
74 + | :: head not empty :tape: $x? |
75 + | :: head not empty | :: refill head
76 + | :: refill head | :tape: ( 0 0 0 0 0 0 0 0 )
77 +
78 + | :: booleanise? :tape: 0 | :number: 0
79 + | :: booleanise :tape: 1? | :boolean: true :: restore number
80 + | :: booleanise | :boolean: false :: restore number
81 +
82 + | :symbol: { | :: booleanise :: forward jump
83 + | :: forward jump :boolean: true |
84 + | :: forward jump :boolean: false | :: skip forward
85 + | :: skip forward? :program: { | :seen: { :: skip forward
86 + | :: skip forward :program: } | :seen: }
87 + | :: skip forward? :program: $other | :seen: $other
88 + | :: skip forward | :: abort :reason: bracket mismatch
89 +
90 + | :symbol: } | :: booleanise :: backward jump
91 + | :: backward jump :boolean: true :seen: } | :program: } :: rewind
92 + | :: backward jump :boolean: false |
93 + | :: rewind? :seen: } | :program: } :: rewind
94 + | :: rewind :seen: {? |
95 + | :: rewind? :seen: $other | :program: $other
96 + | :: rewind | :: abort :reason: bracket mismatch
97 +
98 + | :symbol: [.] | :: output
99 + | :: output? :tape: 0 | :output: 0 :number: 0
100 + | :: output? :tape: 1 | :output: 1 :number: 1
101 + | :: output | :output: ; :: restore number
102 +
103 + | :symbol: , | :: abort :reason: no input facility
104 +
105 + | :symbol: $other |
106 +
107 + | :: restore number? :number: $digit | :tape: $digit
108 + | :: restore number |
109 +
110 + | :: interpret? :program: $symbol | :symbol: $symbol :seen: $symbol
111 + | :: interpret | :: done
Newer Older