Advertisement
Guest User

Untitled

a guest
Mar 10th, 2019
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 3.16 KB | None | 0 0
  1. let nip str = String.sub str 1 ((String.length str) - 1);;
  2.  
  3. type var  = Var   of string
  4. and  nnot = Nnot1 of nnot | Nnot2 of var | Nnot3 of expr
  5. and  aand = And1  of nnot | And2  of aand * nnot
  6. and  oor  = Or1   of aand | Or2   of oor * aand
  7. and  expr = Exp1  of oor  | Exp2  of oor * expr;;
  8.  
  9. let rec print_expr expr = match expr with
  10.     | Exp1 a      -> print_oor a
  11.     | Exp2 (a, b) -> "(->," ^ (print_oor a) ^ "," ^ (print_expr b) ^ ")"
  12. and print_oor expr = match expr with
  13.     | Or1 a      -> print_aand a
  14.     | Or2 (a, b) -> "(|," ^ (print_oor a) ^ "," ^ (print_aand b) ^ ")"
  15. and print_aand expr = match expr with
  16.     | And1 a      -> print_nnot a
  17.     | And2 (a, b) -> "(&," ^ (print_aand a) ^ "," ^ (print_nnot b) ^ ")"
  18. and print_nnot expr = match expr with
  19.     | Nnot1 a -> "(!" ^ (print_nnot a) ^ ")"
  20.     | Nnot2 a -> print_var a
  21.     | Nnot3 a -> print_expr a
  22. and print_var (Var a) = a;;
  23.  
  24. let strange = "’";;
  25.  
  26. let rec make_var str have = if String.length str == 0
  27.     then (Var have, str)
  28.     else if String.length str >= String.length strange && String.sub str 0 (String.length strange) = strange
  29.     then make_var (String.sub str (String.length strange) (String.length str - String.length strange)) (have ^ strange)
  30.     else match str.[0] with
  31.     | 'A'..'Z' | '0'..'9' -> make_var (nip str) (have ^ Char.escaped str.[0])
  32.     | _                   -> (Var have, (String.trim str))
  33.  
  34. and make_nnot str = match str.[0] with
  35.     | '!'      -> let (item, str) = make_nnot (String.trim (nip str)) in (Nnot1 item, str)
  36.     | 'A'..'Z' -> let (item, str) = make_var  (nip str) (Char.escaped str.[0]) in (Nnot2 item, str)
  37.     | _        -> let (item, str) = make_expr (String.trim (nip str)) in (Nnot3 item, (String.trim (nip str)))
  38.  
  39. and make_aand str = let (item, str) = make_nnot str in
  40.     let rec make_aand_internal str have =
  41.         if String.length str == 0 then (have, str)
  42.         else
  43.         match str.[0] with
  44.         | '&' -> let (item, str) = make_nnot (String.trim (nip str)) in make_aand_internal str (And2 (have, item))
  45.         | ')' | '|' | '-' -> (have, str)
  46.         | _   -> failwith "Error1"
  47.     in make_aand_internal str (And1 item)
  48.  
  49. and make_oor str = let (item, str) = make_aand str in
  50.     let rec make_oor_internal str have =
  51.         if String.length str == 0 then (have, str)
  52.         else
  53.         match str.[0] with
  54.         | '|' -> let (item, str) = make_aand (String.trim (nip str)) in make_oor_internal str (Or2 (have, item))
  55.         | ')' | '-' -> (have, str)
  56.         | _   -> failwith "Error2"
  57.     in make_oor_internal str (Or1 item)
  58.        
  59. and make_expr str = let (item, str) = make_oor str in
  60.     if String.length str == 0
  61.     then (Exp1 item, str)
  62.     else match str.[0] with
  63.         | '-' -> let (item2, str) = make_expr (String.trim (nip (nip str))) in (Exp2 (item, item2), str)
  64.         | ')' -> (Exp1 item, str)
  65.         | _   -> failwith "Error3";;
  66.        
  67. let parse_expr str = let (a, b) = make_expr (String.trim str) in a;;
  68.  
  69. print_string (print_expr (parse_expr "    ! A  & !   B   -> ! ( A  | B )    "));;
  70. print_string "\n";;
  71. print_string (print_expr (parse_expr "P1’->!QQ->!R1O&S|!T&U&V"));;
  72. print_string "\n";;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement