exception Unrecognized_character of string type memory = int array [@@deriving show] let rec interpret code pc ptr stack memory = if pc < String.length code then ( let ch = code.[pc] in let next_pc = pc + 1 in let ret_val = match ch with | '+' -> memory.(ptr) <- memory.(ptr) + 1 | '-' -> memory.(ptr) <- memory.(ptr) - 1 | '>' -> interpret code next_pc (ptr + 1) stack memory | '<' -> interpret code next_pc (ptr - 1) stack memory | '.' -> Printf.printf "%c" (char_of_int memory.(ptr)) | '[' -> ( Stack.push next_pc stack; interpret code next_pc ptr stack memory ) | ']' -> ( if memory.(ptr) == 0 then ( let _ = Stack.pop_opt stack in () ) else ( interpret code (Stack.top stack) ptr stack memory ) ) | '\n' | ' ' -> () | _ -> raise (Unrecognized_character (Char.escaped ch)) in interpret code next_pc ptr stack memory; ret_val ) ;; let () = let file = open_in Sys.argv.(1) in let code = really_input_string file (in_channel_length file) in let stack = Stack.create () in let memory = Array.make 100 0 in try interpret code 0 0 stack memory; with | Unrecognized_character(ch) -> Printf.printf "ERROR: Unrecognized character \"%s\"\n" ch | Stack.Empty -> (); (*Printf.printf "%s\n" (show_memory memory)*)