-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcompiler.bf
148 lines (138 loc) · 7.08 KB
/
compiler.bf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
[
Copyright 2021 Tomás Vallotton
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
]
First we write the boilerplate code including the stdio and stdlib headers
and initializing the memory with calloc
++++++++++.-[->++++<]>-.[->+++<]>.+++++.-----------.+++++++++.+++++++++.+[->+++<]>++.+.--[--->+<]>-.--[->
++<]>.--[->++<]>-.+.++[->+++<]>++.+++++.++++++.[->+++++<]>+++.+[--->+<]>+++.++[->+++<]>.>++++++++++.-[->+
+++<]>-.[->+++<]>.+++++.-----------.+++++++++.+++++++++.+[->+++<]>++.+.--[--->+<]>-.--[->++<]>.--[->++<]>
-.+.++[->+++<]>++.++++++++.---.-------.[-->+<]>---.+[--->+<]>+++.++[->+++<]>.>++++++++++.--[----->+<]>+.+
++++.++++++.[---->+<]>+++.+[----->+<]>.------------.++++++++.+++++.++[++>---<]>.-----[->+++<]>.+++++.++++
++.[---->+<]>+++.[->+++<]>+.--[--->+<]>---.-----------.----.+[->+++<]>.------------.+[->+++<]>.+++++.----
---.--[--->+<]>---.[-->+++++<]>+++.++++++++++.-[--->+<]>--.--[--->+<]>---.-----------.--[--->+<]>-.--[->+
++<]>-.++.-[->++++++<]>+.---------.-[->++++<]>-.>++++++++++.[->+++<]>++....+[->+++<]>.+++++.-------.--[--
->+<]>---.[-->+++++<]>+++.++++++++++.--[--->++<]>.++++.--.[-->+++++<]>+++.-[->++<]>-.+[-->+<]>+.+[->+++<]
>.--.+++++++++++..+++.------------.[->+++<]>-.++++++++++++++.-..--.+++.----------.------------.[-->+++<]>
+.--------.-[-->+++<]>-.>++++++++++.[->+++<]>++....+++[->++<]>.+++.+++.-------.-[-->+<]>--.++++++++++.[--
>+++++<]>.+++++.++.+++++.-.[-->+<]>+.>++++++++++.[->+++<]>++....+++[->++<]>.+++.+++.-------.-[-->+<]>--.+
+++++++++.+[----->+<]>.++++++.-.----.+++++.-.[-->+<]>+.>++++++++++.[->+++<]>++....-[--->++<]>-.---.[--->+
<]>--.++++++++.+++++++++.-[--->++<]>.+.--[->++<]>-.+[-->+<]>+.[->+++<]>+.--[--->+<]>---.-----------.----.
[->+++<]>.---------.-[->++++<]>-.>++++++++++.[->+++<]>++........-[--->++<]>-.+++++.++.+++++.-.[---->+<]>+
++.-[->++<]>-.+[-->+<]>+.++[->+++<]>.+++++++++.+.-----------.+++++++++.++[++>---<]>.--[--->+<]>-.--[--->+
<]>---.-----------.--[--->+<]>-.--[->+++<]>-.+[-->+<]>+++.--[->++<]>-.-[-->+<]>--.------------.++.++++[->
+++<]>.[--->+<]>----.+++++++.-[-->+++<]>-.>++++++++++.[->+++<]>++....-[->++++<]>+.-[---->+<]>+.+[->+++<]>
++.+++++++.+++++++.++++[->+++<]>.--[--->+<]>-.-[->++++<]>-.>++++++++++.[->+++<]>++........-[--->++<]>-.++
+++.++.+++++.-.[---->+<]>+++.-[->++<]>-.+[-->+<]>+.---[->++++<]>-.+.++[->+++<]>++.+++++.+++++.[-->+<]>+++
+.>++++++++++.[->+++<]>++....-[->++++<]>+.>++++++++++.[->+++<]>++....-[--->++<]>-.---.[--->+<]>--.+++++++
+.+++++++++++.[--->++<]>--.--[->++<]>.+.+[-->+<]>+.[->+++<]>+.--[--->+<]>---.-----------.----.[->+++<]>.-
--------.-[->++++<]>-.>++++++++++.[->+++<]>++........+++++[->+++<]>.++++++.-.----.+++++.-.[---->+<]>+++.-
[->++<]>-.+[-->+<]>+.++[->+++<]>.+++++++++.+.-----------.+++++++++.++[++>---<]>.--[--->+<]>-.--[--->+<]>-
--.-----------.--[--->+<]>-.--[->+++<]>-.+[-->+<]>++++.---[->++<]>-.-[-->+<]>--.------------.++.[-->+++++
++<]>.[------->++<]>.+++++++.-[-->+++<]>-.>++++++++++.[->+++<]>++....-[->++++<]>+.-[---->+<]>+.+[->+++<]>
++.+++++++.+++++++.++++[->+++<]>.--[--->+<]>-.-[->++++<]>-.>++++++++++.[->+++<]>++........+++++[->+++<]>.
++++++.-.----.+++++.-.[---->+<]>+++.-[->++<]>-.+[-->+<]>+.---[->++++<]>-.+.++[->+++<]>++.+++++++++++.++++
++.-.[-->+<]>+.>++++++++++.[->+++<]>++....-[->++++<]>+.
Note here X is used to denote some special character in
brainfuck's syntax. A questionmark is used to denote values
that have a boolean semantics.
We begin to parse in a loop until a EOF character is fed (minus 1)
,+
[
decremet previously incremented character
-
copy input char 9 times 0|c|c|c|c|c|c|c|c|c|0
we have to copy 9 times to perfom 9 comparisons
[>+>+>+>+>+>+>+>+>+>+<<<<<<<<<<-]
move to the outermost copy
>>>>>>>>>>
write a plus sign and return to the outermost copy
>>++[------<+>][-]<<
*
compare characters: 0|c|c|c|c|c|0|?|0|0|0|0|0
>[-<->]<[>-<[-]]>+
*
// if they are equal write increment ptr 0|c|c|c|c|c|0|0|0|0|0|0|0
[
[-]++[------>+<]>..-.--[--->++<]>.++++.--.[-->+<]>++.>++++++++++.
[-]<[-]<[-]<[-]<
]<
*
// write a minus sign: 0|c|c|c|c|c|X|0|0|0|0|0
>++[------<+>][-]<++<
*
// compare 0|c|c|c|c|0|?|0|0|0|0|0
>[-<->]<[>-<[-]]>+
*
// if they are equal write decrement ptr 0|c|c|c|c|0|0|0|0|0|0|0
[
[-]++[------>+<]>++..---.--[--->++<]>.++++.--.[-->+<]>++.>++++++++++.
[-]<[-]<[-]<[-]<
]<
*
// write forward move 0|c|c|c|c|X|0|0|0|0|0|0
>----[----<+>][-]<-<
*
// compare 0|c|c|c|c|0|?|0|0|0|0|0
>[-<->]<[>-<[-]]>+
*
// if they are equal move forward 0|c|c|c|0|0|0|0|0|0|0|0
[
[-]++[------>+<]>..[----->+<]>+.++++.--.[-->+<]>++.>++++++++++.
[-]<[-]<[-]<[-]<
]<
// write backwards move
>----[----<+>][-]<---<
// compare 0|c|c|0|0|0|0|0|0|0|0|0
>[-<->]<[>-<[-]]>+
[
[-]++[------>+<]>++..--[----->+<]>+.++++.--.[-->+<]>++.>++++++++++.
[-]<[-]<[-]<[-]<
]<
// write a comma
>++[------<+>][-]<+<
// compare
>[-<->]<[>-<[-]]>+
[
[-]++[------>+<]>-.--[--->++<]>.++++.--.[-->+++++<]>+++.-[->++<]>-.+[-->+<]>+.++[->+++<]>.+.--.[---
>+<]>---.++[->+++<]>+.[->+++<]>-.-----[->+++<]>.+++++.++.+++++.-.+[--->+<]>++.-[-->+++<]>-.
[-]<[-]<[-]<[-]<[-]<[-]<[-]<[-]<[-]<[-]<[-]<[-]<
]<
// write period
>++[------<+>][-]<+++<
// compare
>[-<->]<[>-<[-]]>+
[
[-]--[----->+<]>.++++++++++.+++++.-.++[->+++<]>+.[->+++<]>-.++.--[--->++<]>.++++.--.[++>---<]>+.---
---------.+++++[->+++<]>.++++++.-.----.+++++.-.+[--->+<]>++.-[-->+++<]>-.>++++++++++.
[-]<[-]<[-]<[-]<[-]<[-]<[-]<[-]<[-]<
]<
print "while (*ptr) {"
>+[---<++>][-]<+++++<
>[-<->]<[>-<[-]]>+
[
[-]------[-->+++<]>.+[->+++<]>.+.+++.-------.--[--->+<]>-.++++++++.++.--[--->++<]>.++++.--.[--->+<]>+
++.---------.-[->++++<]>-.
[-]<[-]<[-]<[-]<[-]<[-]<
]<
print "}"
>+[---<++>][-]<+++++++<
>[-<->]<[>-<[-]]>+
[
[-]--[-->+++<]>.
[-]<
][-]<<
// EOF = minus 1; so this will exit in that case
,+
]
// close main function
++++++++++.[------->+++<]>.-------------.[--->+<]>---.+.---.----.-[->+++++<]>
-.[-->+++<]>.+++++++++++.+[-->+<]>++.>++++++++++.>--[-->+++<]>.