Advertisement
Guest User

Untitled

a guest
Nov 10th, 2018
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 1.97 KB | None | 0 0
  1. (*   Shared code Section  *)
  2. let nt_symbol = pack (plus nt_symbolchar) (fun (a) -> String(list_to_string a));;
  3. let nt_string = pack (caten (caten (char '\"') (star (disj_list [nt_stringlitteralchar;nt_stringmetachar;nt_stringhexchar]))) (char '\"')) (fun ((a,b),c) -> String (list_to_string (List.flatten b)));;
  4. let nt_char = pack (caten nt_charprefix (disj_list [nt_hexchar;nt_visiblechar;nt_namedchar;])) (fun (a,b) -> Char b);;
  5. let nt_number = disj (pack (disj_list [nt_scientific_int;nt_scientific_float;nt_float;nt_hexfloat]) (fun (a) -> (Number (Float(a))))) (pack (disj nt_plusminusinteger nt_hex) (fun (a) -> (Number (Int(a)))));;
  6.  
  7. (*   Genna's Section  *)
  8.  
  9. let gen_bool =
  10. let istrue = pack (word_ci "#t") (fun _ -> Bool true) in
  11. let isfalse = pack (word_ci "#f") (fun _ -> Bool false) in
  12. disj istrue isfalse;;
  13.  
  14. let lp = char '(';;
  15. let rp = char ')';;
  16. let nt_white = pack nt_whitespace (fun a -> None);;
  17. (* sexprs disjoint impl *)
  18. let nt_sexprs = disj_list [nt_symbol;nt_string;gen_bool;nt_char;nt_number;nt_white];;
  19.  
  20. (*test_string (star nt_sexprs) "1 #f \"Test\" 0x44 'a'";; *)
  21. (* list impl *)
  22. let nt_lst s =
  23. let x = pack (caten (caten lp (star nt_sexprs)) rp) (fun ((l,p),r) -> p) in
  24. let x = pack x (fun l -> List.fold_right (fun a b -> Pair(a,b)) l Nil) in
  25. x s;;
  26.  
  27. let _whitespaces_ = star nt_whitespace;;
  28.  
  29.  
  30. let nt_not_end_line =  pack (const (fun ch -> ch != '\n'))
  31. (fun ch -> ch);;
  32. (* line comment impl *)
  33. let nt_skip_line =
  34. let rec skip_this_spaces () =
  35. pack (caten nt_not_end_line
  36. (disj (delayed skip_this_spaces) nt_epsilon))
  37. (function (a, s) -> s) in
  38. skip_this_spaces();;
  39.  
  40. let nt_del_semi= function
  41. | x :: l  -> if (x == ';') then ( ([], l)) else (raise X_no_match)
  42. | _ -> raise X_no_match;;
  43. let nt_del_nwln_ch= function
  44. | x :: l  -> if (x == '\n') then ( ([], l)) else (raise X_no_match)
  45. | _ -> raise X_no_match;;
  46.  
  47. let nt_line_comment = caten nt_del_semi (caten nt_skip_line (disj nt_del_nwln_ch nt_end_of_input));;
  48.  
  49.  
  50.  
  51. (*   Genna's Section ends *)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement