Last active
August 9, 2020 17:42
-
-
Save notfoundry/fad611951bbcec68d72be4fa093537a8 to your computer and use it in GitHub Desktop.
Brainfuck interpreter written in the C preprocessor
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #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" |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #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)))) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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