Thun/implementations/Ocaml/helloworld/bin/main.ml

87 lines
2.1 KiB
OCaml

type joy_type =
| JoySymbol of string
| JoyTrue
| JoyFalse
| JoyInt of int
| JoyList of joy_type list
(* type joy_list = joy_type list *)
let joy_true = JoyTrue
let joy_false = JoyFalse
let j_loop = JoySymbol "loop"
let zero = JoyInt 0
let dummy = JoyList [ joy_true; joy_false; j_loop; zero ]
let rec joy_to_string jt =
match jt with
| JoySymbol sym -> sym
| JoyTrue -> "true"
| JoyFalse -> "false"
| JoyInt i -> string_of_int i
| JoyList el -> "[" ^ expression_to_string el ^ "]"
and expression_to_string el = String.concat " " (List.map joy_to_string el)
type token = Left_bracket | Right_bracket | Token of string
let delimiter str last =
last >= String.length str || String.contains "[] " (String.get str last)
(* string -> int -> int -> token * int *)
let rec tokenize1 str start last =
if delimiter str last then (Token (String.sub str start (last - start)), last)
else tokenize1 str start (last + 1)
let rec tokenize0 str start acc =
if start >= String.length str then acc
else
let ch = String.get str start in
match ch with
| '[' -> Left_bracket :: tokenize0 str (start + 1) acc
| ']' -> Right_bracket :: tokenize0 str (start + 1) acc
| ' ' -> tokenize0 str (start + 1) acc
| _ ->
let token, n = tokenize1 str start (start + 1) in
token :: tokenize0 str n acc
let tokenize str = tokenize0 str 0 []
let token_to_string token =
match token with
| Left_bracket -> "["
| Right_bracket -> "]"
| Token str -> str
(*
let char_tok ch acc =
match ch with
| '[' -> Left_bracket :: acc
| ']' -> Right_bracket :: acc
| ' ' -> acc
| x -> (Token x) :: acc
let tokenize str =
String.fold_right char_tok str []
let text_to_expression str =
let tokens = tokenize str in
tokens
let token_to_string token =
match token with
| Left_bracket -> "["
| Right_bracket -> "]"
| Token x -> Char.escaped x
let s = String.concat "" (List.map token_to_string (text_to_expression "1 [2]3" ))
*)
(* let () = print_endline (joy_to_string dummy) *)
let s = String.concat " " (List.map token_to_string (tokenize "1 [2]3"))
let () =
print_endline s;
print_endline (joy_to_string dummy)