-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbf-interpreter.cfg
50 lines (40 loc) · 4.89 KB
/
bf-interpreter.cfg
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
svar_set __bf_delay 1
svar_set __bf_dbg_hud 1000 // hud index
svar_set __empty ""
sar_function __tmp_cvar_save cond "!?__tmp_init_cvar_$1=1" "svar_set __tmp_init_cvar_$1 1; svar_from_cvar __tmp_cvar_$1 $1"
sar_function __tmp_cvar_restore cond "?__tmp_init_cvar_$1=1" "svar_set __tmp_init_cvar_$1 0; sar_expand $1 $$'$$__tmp_cvar_$1$$'"
sar_function run_quiet "__tmp_cvar_save sar_con_filter; __tmp_cvar_save sar_con_filter_default; sar_con_filter 1; sar_con_filter_default 0; $1 $+2; __tmp_cvar_restore sar_con_filter; __tmp_cvar_restore sar_con_filter_default"
// printing utils
svar_set __ascii_table " !_#_%&___*+,-./0123456789_______ABCDEFGHIJKLMNOPQRSTUVWXYZ______abcdefghijklmnopqrstuvwxyz_____"
sar_function __ascii_get "svar_set __ascii_idx $1; svar_sub __ascii_idx 32; svar_set __ascii_get_res $'$__ascii_table$'; run_quiet sar_expand svar_substr __ascii_get_res $$__ascii_idx 1; __ascii_check"
// bounds checking. if it's negative or the substring failed, print space
sar_function __ascii_check "svar_substr __ascii_idx 0 1; cond ?__ascii_idx=- svar_set __ascii_get_res $' $'; cond ?__ascii_get_res=?__ascii_table svar_set __ascii_get_res $' $'"
// need something to represent the list of loop beginnings?
// alternative is a function to find matching brace, slower for big programs?
// function definitions for the actions
sar_function __bf_< "svar_sub __data_ptr 1; sar_expand cond ?__tape_$$__data_ptr=?__empty svar_set __tape_$$__data_ptr 0"
sar_function __bf_> "svar_add __data_ptr 1; sar_expand cond ?__tape_$$__data_ptr=?__empty svar_set __tape_$$__data_ptr 0"
sar_function __bf_. "sar_expand __ascii_get $$__tape_$__data_ptr; sar_expand sar_echo_nolf #ffffff $$'$$__ascii_get_res$$'"
sar_function __bf_+ "svar_add __tape_$__data_ptr 257; svar_mod __tape_$__data_ptr 256"
sar_function __bf_- "svar_sub __tape_$__data_ptr 1; cond ?__tape_$__data_ptr=-1 svar_set __tape_$__data_ptr 255"
sar_function __bf_, "nop" // not implemented yet
sar_function __bf_[ "svar_add __stack_ptr 1; sar_expand svar_set __stack_$$__stack_ptr $__prgm_ptr" // record on loop stack
sar_function __bf_] "__bf_loop_close_jump; __bf_loop_close_exit" // go to beginning of loop or nothing
sar_function __bf_ "sar_echo ffffff $'$'; hwait 30 __bf_debug_clear"
sar_function __bf_loop_close_jump cond !?__tape_$__data_ptr=0 "sar_expand svar_set __prgm_ptr $$__stack_$__stack_ptr" // jump back to beginning of loop
sar_function __bf_loop_close_exit cond ?__tape_$__data_ptr=0 "svar_sub __stack_ptr 1" // exit loop
// it even clears negative data ptrs!
sar_function __bf_cleartape "svar_set __bf_clear_i 0; __bf_cleartape_h; svar_set __bf_clear_i -1; __bf_cleartape_h2"
sar_function __bf_cleartape_h cond !?__tape_$__bf_clear_i=?__empty "sar_expand svar_set __tape_$__bf_clear_i $$'$$'; svar_add __bf_clear_i 1; __bf_cleartape_h"
sar_function __bf_cleartape_h2 cond !?__tape_$__bf_clear_i=?__empty "sar_expand svar_set __tape_$__bf_clear_i $$'$$'; svar_sub __bf_clear_i 1; __bf_cleartape_h2"
// main interpreter function
sar_function bf_exec "__bf_cleartape; svar_set __bf_program $1; svar_set __data_ptr 0; svar_set __prgm_ptr 0; svar_set __stack_ptr 0; svar_set __current_char a; __bf_main_loop"
sar_function __bf_main_loop cond !?__current_char=?__empty "svar_set __current_char $__bf_program; svar_substr __current_char $__prgm_ptr 1; bf_debug; sar_expand __bf_$$__current_char; svar_add __prgm_ptr 1; hwait $__bf_delay __bf_main_loop"
// debug function
sar_function bf_debug cond !?__bf_delay=0 "__bf_debug_1; __bf_debug_2; __bf_debug_3"
sar_function __bf_debug_1 "svar_set __bf_dbg_i $__bf_dbg_hud; svar_set __tmp $__bf_program; svar_substr __tmp 0 $__prgm_ptr; sar_expand svar_set __tmp $'$$__tmp#00FF00$__current_char#r$'; svar_set __tmp2 $__bf_program; svar_set __tmp3 1; svar_add __tmp3 __prgm_ptr; sar_expand run_quiet svar_substr __tmp2 $$__tmp3; cond !?__tmp2=?__bf_program sar_expand svar_set __tmp $'$$__tmp$$__tmp2$'; sar_expand sar_hud_set_text $$__bf_dbg_i $'$$__tmp$'"
sar_function __bf_debug_2 "svar_add __bf_dbg_i 1; svar_set __tmp $'$'; svar_set __tmp2 0; __bf_debug_2_h; sar_expand sar_hud_set_text $$__bf_dbg_i $'$$__tmp$'"
sar_function __bf_debug_2_h cond !?__tape_$__tmp2=?__empty "cond ?__tmp2=?__data_ptr sar_expand svar_set __tmp $$'$__tmp#00FF00$$'; sar_expand svar_set __tmp $$'$$__tmp$$__tape_$__tmp2 $$'; cond ?__tmp2=?__data_ptr sar_expand svar_set __tmp $$'$$__tmp#r$$'; svar_add __tmp2 1; __bf_debug_2_h"
sar_function __bf_debug_3 "svar_add __bf_dbg_i 1; svar_set __tmp $'$'; svar_set __tmp2 0; __bf_debug_3_h; sar_expand sar_hud_set_text $$__bf_dbg_i $'$$__tmp$'"
sar_function __bf_debug_3_h cond !?__tmp2=?__stack_ptr "svar_add __tmp2 1; sar_expand sar_expand svar_set __tmp $$'$$__tmp$$$$__stack_$$__tmp2 $$'; __bf_debug_3_h"
sar_function __bf_debug_clear "svar_set __bf_dbg_i $__bf_dbg_hud; sar_hud_set_text $__bf_dbg_hud $'$'; svar_add __bf_dbg_i 1; sar_expand sar_hud_set_text $$__bf_dbg_i $'$'; svar_add __bf_dbg_i 1; sar_expand sar_hud_set_text $$__bf_dbg_i $'$'"