Skip to content

Instantly share code, notes, and snippets.

@notfoundry
Last active August 9, 2020 17:42
Show Gist options
  • Select an option

  • Save notfoundry/fad611951bbcec68d72be4fa093537a8 to your computer and use it in GitHub Desktop.

Select an option

Save notfoundry/fad611951bbcec68d72be4fa093537a8 to your computer and use it in GitHub Desktop.
Brainfuck interpreter written in the C preprocessor
#include "bf.h"
#define LHS 2
#define RHS 5
PPFUCK (
(LHS, RHS),
G // G ("get") is ,
R G // R ("right") is >
( // ( is [
L I // I ("increment") is +, L ("left") is <
R D // D ("decrement") is -
) // ) is ]
I I I I I I I I
(
L I I I I I I
R D
)
L P // P ("put") is .
)
// prints "7"
#include <order/interpreter.h>
#define PPFUCK_ASCII_0 \x00
#define PPFUCK_ASCII_1 \x01
#define PPFUCK_ASCII_2 \x02
#define PPFUCK_ASCII_3 \x03
#define PPFUCK_ASCII_4 \x04
#define PPFUCK_ASCII_5 \x05
#define PPFUCK_ASCII_6 \x06
#define PPFUCK_ASCII_7 \x07
#define PPFUCK_ASCII_8 \x08
#define PPFUCK_ASCII_9 \x09
#define PPFUCK_ASCII_10 \x0a
#define PPFUCK_ASCII_11 \x0b
#define PPFUCK_ASCII_12 \x0c
#define PPFUCK_ASCII_13 \x0d
#define PPFUCK_ASCII_14 \x0e
#define PPFUCK_ASCII_15 \x0f
#define PPFUCK_ASCII_16 \x10
#define PPFUCK_ASCII_17 \x11
#define PPFUCK_ASCII_18 \x12
#define PPFUCK_ASCII_19 \x13
#define PPFUCK_ASCII_20 \x14
#define PPFUCK_ASCII_21 \x15
#define PPFUCK_ASCII_22 \x16
#define PPFUCK_ASCII_23 \x17
#define PPFUCK_ASCII_24 \x18
#define PPFUCK_ASCII_25 \x19
#define PPFUCK_ASCII_26 \x1a
#define PPFUCK_ASCII_27 \x1b
#define PPFUCK_ASCII_28 \x1c
#define PPFUCK_ASCII_29 \x1d
#define PPFUCK_ASCII_30 \x1e
#define PPFUCK_ASCII_31 \x1f
#define PPFUCK_ASCII_32 \x20
#define PPFUCK_ASCII_33 \x21
#define PPFUCK_ASCII_34 \x22
#define PPFUCK_ASCII_35 \x23
#define PPFUCK_ASCII_36 \x24
#define PPFUCK_ASCII_37 \x25
#define PPFUCK_ASCII_38 \x26
#define PPFUCK_ASCII_39 \x27
#define PPFUCK_ASCII_40 \x28
#define PPFUCK_ASCII_41 \x29
#define PPFUCK_ASCII_42 \x2a
#define PPFUCK_ASCII_43 \x2b
#define PPFUCK_ASCII_44 \x2c
#define PPFUCK_ASCII_45 \x2d
#define PPFUCK_ASCII_46 \x2e
#define PPFUCK_ASCII_47 \x2f
#define PPFUCK_ASCII_48 0
#define PPFUCK_ASCII_49 1
#define PPFUCK_ASCII_50 2
#define PPFUCK_ASCII_51 3
#define PPFUCK_ASCII_52 4
#define PPFUCK_ASCII_53 5
#define PPFUCK_ASCII_54 6
#define PPFUCK_ASCII_55 7
#define PPFUCK_ASCII_56 8
#define PPFUCK_ASCII_57 9
#define PPFUCK_ASCII_58 \x3a
#define PPFUCK_ASCII_59 \x3b
#define PPFUCK_ASCII_60 \x3c
#define PPFUCK_ASCII_61 \x3d
#define PPFUCK_ASCII_62 \x3e
#define PPFUCK_ASCII_63 \x3f
#define PPFUCK_ASCII_64 \x40
#define PPFUCK_ASCII_65 A
#define PPFUCK_ASCII_66 B
#define PPFUCK_ASCII_67 C
#define PPFUCK_ASCII_68 D
#define PPFUCK_ASCII_69 E
#define PPFUCK_ASCII_70 F
#define PPFUCK_ASCII_71 G
#define PPFUCK_ASCII_72 H
#define PPFUCK_ASCII_73 I
#define PPFUCK_ASCII_74 J
#define PPFUCK_ASCII_75 K
#define PPFUCK_ASCII_76 L
#define PPFUCK_ASCII_77 M
#define PPFUCK_ASCII_78 N
#define PPFUCK_ASCII_79 O
#define PPFUCK_ASCII_80 P
#define PPFUCK_ASCII_81 Q
#define PPFUCK_ASCII_82 R
#define PPFUCK_ASCII_83 S
#define PPFUCK_ASCII_84 T
#define PPFUCK_ASCII_85 U
#define PPFUCK_ASCII_86 V
#define PPFUCK_ASCII_87 W
#define PPFUCK_ASCII_88 X
#define PPFUCK_ASCII_89 Y
#define PPFUCK_ASCII_90 Z
#define PPFUCK_ASCII_91 \x5b
#define PPFUCK_ASCII_92 \x5c
#define PPFUCK_ASCII_93 \x5d
#define PPFUCK_ASCII_94 \x5e
#define PPFUCK_ASCII_95 _
#define PPFUCK_ASCII_96 \x60
#define PPFUCK_ASCII_97 a
#define PPFUCK_ASCII_98 b
#define PPFUCK_ASCII_99 c
#define PPFUCK_ASCII_100 d
#define PPFUCK_ASCII_101 e
#define PPFUCK_ASCII_102 f
#define PPFUCK_ASCII_103 g
#define PPFUCK_ASCII_104 h
#define PPFUCK_ASCII_105 i
#define PPFUCK_ASCII_106 j
#define PPFUCK_ASCII_107 k
#define PPFUCK_ASCII_108 l
#define PPFUCK_ASCII_109 m
#define PPFUCK_ASCII_110 n
#define PPFUCK_ASCII_111 o
#define PPFUCK_ASCII_112 p
#define PPFUCK_ASCII_113 q
#define PPFUCK_ASCII_114 r
#define PPFUCK_ASCII_115 s
#define PPFUCK_ASCII_116 t
#define PPFUCK_ASCII_117 u
#define PPFUCK_ASCII_118 v
#define PPFUCK_ASCII_119 w
#define PPFUCK_ASCII_120 x
#define PPFUCK_ASCII_121 y
#define PPFUCK_ASCII_122 z
#define PPFUCK_ASCII_123 \x7b
#define PPFUCK_ASCII_124 \x7c
#define PPFUCK_ASCII_125 \x7d
#define PPFUCK_ASCII_126 \x7e
#define PPFUCK_ASCII_127 \x7f
#define PPFUCK_ASCII_128 \x80
#define PPFUCK_ASCII_129 \x81
#define PPFUCK_ASCII_130 \x82
#define PPFUCK_ASCII_131 \x83
#define PPFUCK_ASCII_132 \x84
#define PPFUCK_ASCII_133 \x85
#define PPFUCK_ASCII_134 \x86
#define PPFUCK_ASCII_135 \x87
#define PPFUCK_ASCII_136 \x88
#define PPFUCK_ASCII_137 \x89
#define PPFUCK_ASCII_138 \x8a
#define PPFUCK_ASCII_139 \x8b
#define PPFUCK_ASCII_140 \x8c
#define PPFUCK_ASCII_141 \x8d
#define PPFUCK_ASCII_142 \x8e
#define PPFUCK_ASCII_143 \x8f
#define PPFUCK_ASCII_144 \x90
#define PPFUCK_ASCII_145 \x91
#define PPFUCK_ASCII_146 \x92
#define PPFUCK_ASCII_147 \x93
#define PPFUCK_ASCII_148 \x94
#define PPFUCK_ASCII_149 \x95
#define PPFUCK_ASCII_150 \x96
#define PPFUCK_ASCII_151 \x97
#define PPFUCK_ASCII_152 \x98
#define PPFUCK_ASCII_153 \x99
#define PPFUCK_ASCII_154 \x9a
#define PPFUCK_ASCII_155 \x9b
#define PPFUCK_ASCII_156 \x9c
#define PPFUCK_ASCII_157 \x9d
#define PPFUCK_ASCII_158 \x9e
#define PPFUCK_ASCII_159 \x9f
#define PPFUCK_ASCII_160 \xa0
#define PPFUCK_ASCII_161 \xa1
#define PPFUCK_ASCII_162 \xa2
#define PPFUCK_ASCII_163 \xa3
#define PPFUCK_ASCII_164 \xa4
#define PPFUCK_ASCII_165 \xa5
#define PPFUCK_ASCII_166 \xa6
#define PPFUCK_ASCII_167 \xa7
#define PPFUCK_ASCII_168 \xa8
#define PPFUCK_ASCII_169 \xa9
#define PPFUCK_ASCII_170 \xaa
#define PPFUCK_ASCII_171 \xab
#define PPFUCK_ASCII_172 \xac
#define PPFUCK_ASCII_173 \xad
#define PPFUCK_ASCII_174 \xae
#define PPFUCK_ASCII_175 \xaf
#define PPFUCK_ASCII_176 \xb0
#define PPFUCK_ASCII_177 \xb1
#define PPFUCK_ASCII_178 \xb2
#define PPFUCK_ASCII_179 \xb3
#define PPFUCK_ASCII_180 \xb4
#define PPFUCK_ASCII_181 \xb5
#define PPFUCK_ASCII_182 \xb6
#define PPFUCK_ASCII_183 \xb7
#define PPFUCK_ASCII_184 \xb8
#define PPFUCK_ASCII_185 \xb9
#define PPFUCK_ASCII_186 \xba
#define PPFUCK_ASCII_187 \xbb
#define PPFUCK_ASCII_188 \xbc
#define PPFUCK_ASCII_189 \xbd
#define PPFUCK_ASCII_190 \xbe
#define PPFUCK_ASCII_191 \xbf
#define PPFUCK_ASCII_192 \xc0
#define PPFUCK_ASCII_193 \xc1
#define PPFUCK_ASCII_194 \xc2
#define PPFUCK_ASCII_195 \xc3
#define PPFUCK_ASCII_196 \xc4
#define PPFUCK_ASCII_197 \xc5
#define PPFUCK_ASCII_198 \xc6
#define PPFUCK_ASCII_199 \xc7
#define PPFUCK_ASCII_200 \xc8
#define PPFUCK_ASCII_201 \xc9
#define PPFUCK_ASCII_202 \xca
#define PPFUCK_ASCII_203 \xcb
#define PPFUCK_ASCII_204 \xcc
#define PPFUCK_ASCII_205 \xcd
#define PPFUCK_ASCII_206 \xce
#define PPFUCK_ASCII_207 \xcf
#define PPFUCK_ASCII_208 \xd0
#define PPFUCK_ASCII_209 \xd1
#define PPFUCK_ASCII_210 \xd2
#define PPFUCK_ASCII_211 \xd3
#define PPFUCK_ASCII_212 \xd4
#define PPFUCK_ASCII_213 \xd5
#define PPFUCK_ASCII_214 \xd6
#define PPFUCK_ASCII_215 \xd7
#define PPFUCK_ASCII_216 \xd8
#define PPFUCK_ASCII_217 \xd9
#define PPFUCK_ASCII_218 \xda
#define PPFUCK_ASCII_219 \xdb
#define PPFUCK_ASCII_220 \xdc
#define PPFUCK_ASCII_221 \xdd
#define PPFUCK_ASCII_222 \xde
#define PPFUCK_ASCII_223 \xdf
#define PPFUCK_ASCII_224 \xe0
#define PPFUCK_ASCII_225 \xe1
#define PPFUCK_ASCII_226 \xe2
#define PPFUCK_ASCII_227 \xe3
#define PPFUCK_ASCII_228 \xe4
#define PPFUCK_ASCII_229 \xe5
#define PPFUCK_ASCII_230 \xe6
#define PPFUCK_ASCII_231 \xe7
#define PPFUCK_ASCII_232 \xe8
#define PPFUCK_ASCII_233 \xe9
#define PPFUCK_ASCII_234 \xea
#define PPFUCK_ASCII_235 \xeb
#define PPFUCK_ASCII_236 \xec
#define PPFUCK_ASCII_237 \xed
#define PPFUCK_ASCII_238 \xee
#define PPFUCK_ASCII_239 \xef
#define PPFUCK_ASCII_240 \xf0
#define PPFUCK_ASCII_241 \xf1
#define PPFUCK_ASCII_242 \xf2
#define PPFUCK_ASCII_243 \xf3
#define PPFUCK_ASCII_244 \xf4
#define PPFUCK_ASCII_245 \xf5
#define PPFUCK_ASCII_246 \xf6
#define PPFUCK_ASCII_247 \xf7
#define PPFUCK_ASCII_248 \xf8
#define PPFUCK_ASCII_249 \xf9
#define PPFUCK_ASCII_250 \xfa
#define PPFUCK_ASCII_251 \xfb
#define PPFUCK_ASCII_252 \xfc
#define PPFUCK_ASCII_253 \xfd
#define PPFUCK_ASCII_254 \xfe
#define PPFUCK_ASCII_255 \xff
#define PPFUCK_TOKEN_R (1ppf_op_inc_data_ptr)
#define PPFUCK_TOKEN_L (1ppf_op_dec_data_ptr)
#define PPFUCK_TOKEN_I (1ppf_op_inc_data)
#define PPFUCK_TOKEN_D (1ppf_op_dec_data)
#define PPFUCK_TOKEN_G (1ppf_op_input_data)
#define PPFUCK_TOKEN_P (1ppf_op_output_data)
#define ORDER_PP_DEF_1ppf_cell_maxt ORDER_PP_MACRO(8nat(2,5,6))
#define ORDER_PP_DEF_1ppf_initial_cells ORDER_PP_CONST((0)(0)(0)(0)(0)(0)(0)(0))
#define ORDER_PP_DEF_1ppf_initial_cell_count ORDER_PP_CONST(8)
#define ORDER_PP_DEF_1ppf_env ORDER_PP_MACRO(8seq)
#define ORDER_PP_DEF_1ppf_initial_env(input) ORDER_PP_MACRO(1ppf_env(0, 8eval(8env_nil, 8(8seq input)), 1ppf_initial_cells, 1ppf_initial_cell_count, 8nil))
#define ORDER_PP_DEF_1ppf_env_get_ptr(env) ORDER_PP_MACRO(8seq_at(0, env))
#define ORDER_PP_DEF_1ppf_env_get_input(env) ORDER_PP_MACRO(8seq_at(1, env))
#define ORDER_PP_DEF_1ppf_env_get_cells(env) ORDER_PP_MACRO(8seq_at(2, env))
#define ORDER_PP_DEF_1ppf_env_num_cells(env) ORDER_PP_MACRO(8seq_at(3, env))
#define ORDER_PP_DEF_1ppf_env_get_output(env) ORDER_PP_MACRO(8seq_at(4, env))
#define ORDER_PP_DEF_1ppf_env_resize_cells \
ORDER_PP_FN(8fn(8C, 8N, 1ppf_env_set_cells(8C, 8seq_join(1ppf_env_get_cells(8C), 1ppf_initial_cells))))
#define ORDER_PP_DEF_1ppf_env_set_ptr \
ORDER_PP_FN(8fn(8C, 8X, \
8if(8greater(8X, 1ppf_env_num_cells(8C)), \
8seq_set(0, 1ppf_env_resize_cells(8C, 8X), 8X), \
8seq_set(0, 8C, 8X))))
#define ORDER_PP_DEF_1ppf_env_set_cells \
ORDER_PP_FN(8fn(8C, 8X, 8seq_set(2, 8C, 8X)))
#define ORDER_PP_DEF_1ppf_env_read_ptr_cell \
ORDER_PP_FN(8fn(8C, 8seq_at(1ppf_env_get_ptr(8C), 1ppf_env_get_cells(8C))))
#define ORDER_PP_DEF_1ppf_env_write_ptr_cell \
ORDER_PP_FN(8fn(8C, 8X, 8seq_set(1ppf_env_get_ptr(8C), 1ppf_env_get_cells(8C), 8remainder(8X, 1ppf_cell_maxt))))
#define ORDER_PP_DEF_1ppf_env_add_output \
ORDER_PP_FN(8fn(8C, 8X, 8seq_set(4, 8C, 8seq_push_back(8X, 1ppf_env_get_output(8C)))))
#define ORDER_PP_DEF_1ppf_op_inc_data_ptr \
ORDER_PP_FN(8fn(8C, 1ppf_env_set_ptr(8C, 8inc(1ppf_env_get_ptr(8C)))))
#define ORDER_PP_DEF_1ppf_op_dec_data_ptr \
ORDER_PP_FN(8fn(8C, 1ppf_env_set_ptr(8C, 8dec(1ppf_env_get_ptr(8C)))))
#define ORDER_PP_DEF_1ppf_op_inc_data \
ORDER_PP_FN(8fn(8C, 1ppf_env_set_cells(8C, 1ppf_env_write_ptr_cell(8C, 8inc(1ppf_env_read_ptr_cell(8C))))))
#define ORDER_PP_DEF_1ppf_op_dec_data \
ORDER_PP_FN(8fn(8C, 1ppf_env_set_cells(8C, 1ppf_env_write_ptr_cell(8C, 8dec(1ppf_env_read_ptr_cell(8C))))))
#define ORDER_PP_DEF_1ppf_op_input_data \
ORDER_PP_FN(8fn(8C, \
1ppf_env(1ppf_env_get_ptr(8C), \
8seq_pop_front(1ppf_env_get_input(8C)), \
1ppf_env_write_ptr_cell(8C, 8seq_head(1ppf_env_get_input(8C))), \
1ppf_env_num_cells(8C), \
1ppf_env_get_output(8C))))
#define ORDER_PP_DEF_1ppf_op_output_data \
ORDER_PP_FN(8fn(8C, \
1ppf_env_add_output( \
8C, \
8to_lit(8seq_at(1ppf_env_get_ptr(8C), 1ppf_env_get_cells(8C))))))
#define ORDER_PP_DEF_1ppf_parse \
ORDER_PP_FN(8fn(8T, \
8seq_map(8fn(8X, \
8if(8is_seq(8X), \
1ppf_parse(8seq_head(8X)), \
8X)), \
8tokens_to_seq_with(8(PPFUCK_TOKEN), 8T))))
#define ORDER_PP_DEF_1ppf_optimize \
ORDER_PP_FN(8fn(8T, 8T))
#define ORDER_PP_DEF_1ppf_interpret \
ORDER_PP_FN(8fn(8T, 8C, \
8seq_fold(8fn(8A, 8X, \
8if(8is_seq(8X), \
8while(8fn(8U, 8isnt_0(1ppf_env_read_ptr_cell(8U))), \
8fn(8U, 1ppf_interpret(8X, 8U)), \
8A), \
8ap(8eval(8env_nil, 8X), 8A))), \
8C, \
8T)))
#define ORDER_PP_DEF_1ppf_format_output \
ORDER_PP_FN(8fn(8C, \
8stringize( \
8seq_fold(8fn(8A, 8B, \
8adjacent(8A, 8cat(8(PPFUCK_ASCII_), 8B))), \
8nil, \
1ppf_env_get_output(8C)))))
#define PPFUCK(input, ...) \
ORDER_PP(1ppf_format_output(\
1ppf_interpret(\
1ppf_optimize(\
1ppf_parse(8(__VA_ARGS__))), \
1ppf_initial_env(input))))
import re
import sys
def translate(bf_program):
raw_bf_program = re.sub(r'[^+-<>\[\],.\n]', '', bf_program)
mapping = {
'>': 'R', '<': 'L',
'+': 'I', '-': 'D',
'.': 'P', ',': 'G',
'[': '(', ']': ')',
'\n': '\n'
}
return ' '.join(mapping[c] for c in raw_bf_program)
if __name__ == '__main__':
with open(sys.argv[1]) as bf_file:
bf_program = ''.join(bf_file)
print(translate(bf_program))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment