fork(2) download
  1. // Learn more about F# at http://f...content-available-to-author-only...p.net
  2. let GetNumber3 akk h =
  3. 10.0*akk + float h - 48.0
  4.  
  5. let rec GetNumber2 (akk:float) arr (coof:float) isFloat =
  6. match (arr, isFloat) with
  7. |(h::t,false) when h >= '0'&& h<='9' -> GetNumber2 (GetNumber3 akk h) t coof isFloat;
  8. |(h::t, true) when h >= '0'&& h<='9' -> GetNumber2 (GetNumber3 akk h) t (coof*10.0) isFloat;
  9. |('.'::t, false) -> GetNumber2 akk t coof true;
  10. |(t,_) -> (akk/coof, t)
  11.  
  12. let GetNumber arr = GetNumber2 0.0 arr 1.0 false
  13.  
  14. type Token =
  15. | Add | Sub | Un | Mul | Div
  16.  
  17. let Convolution tokens action =
  18. match (action, tokens) with
  19. | (Add,v1::v2::t2) -> (v2+v1)::t2
  20. | (Sub,v1::v2::t2) -> (v2-v1)::t2
  21. | (Un,v::t2) -> -v::t2
  22. | (Mul,v1::v2::t2) -> (v2*v1)::t2
  23. | (Div,v1::v2::t2) -> (v2/v1)::t2
  24. | _ -> tokens
  25.  
  26. let rec Pushing tokens actions priority=
  27. match (actions, priority) with
  28. | ((Un|Mul|Div)::t,2)-> Pushing (Convolution tokens (List.head actions)) t 2
  29. | (h::t,1) -> Pushing (Convolution tokens (List.head actions)) t 1
  30. | _ -> (tokens, actions)
  31.  
  32. let rec Parse arr tokens actions =
  33. let pushingFunc = Pushing tokens actions
  34. match arr with
  35. | '*'::t-> let (ts, acs) = pushingFunc 2 in Parse t ts (Mul:: acs)
  36. | '/'::t-> let (ts, acs) = pushingFunc 2 in Parse t ts (Div:: acs)
  37. | '~'::t-> let (ts, acs) = pushingFunc 2 in Parse t ts (Un:: acs)
  38. | '+'::t-> let (ts, acs) = pushingFunc 1 in Parse t ts (Add:: acs)
  39. | '-'::t-> let (ts, acs) = pushingFunc 1 in Parse t ts (Sub:: acs)
  40. | '('::t-> let (ts,newArr) = Parse t [] [] in (let ts2 = (List.head ts) :: tokens in Parse newArr ts2 actions)
  41. | ')'::t-> let (ts,_) = pushingFunc 1 in (ts,t)
  42. | h::t when (h >= '0'&& h<='9')||h='.' -> let (num,newArr) = (GetNumber arr) in Parse newArr (num::tokens) actions
  43. | _::t -> Parse t tokens actions
  44. | _ -> let (ts,_) = pushingFunc 1 in (ts,[])
  45.  
  46. let rec ArrToList2 arr (str:string) i =
  47. match i with
  48. |index when index > 0 -> ArrToList2 ((str.[index-1])::arr) (str) (index-1)
  49. |_ -> arr
  50.  
  51. let ArrToList str = ArrToList2 [] str (String.length str)
  52.  
  53. let calculator (input:string) =
  54. match Parse (ArrToList input) [] [] with
  55. | (v::_,_) -> string v
  56. | _ -> "Error"
  57.  
  58. open System
  59.  
  60. let rec InputFunc() =
  61. match Console.ReadLine() with
  62. | "exit" -> Console.WriteLine ""
  63. | input -> Console.WriteLine ((calculator input)); InputFunc()
  64.  
  65. [<EntryPoint>]
  66. let main argv =
  67. InputFunc ()
  68. 0 // return an integer exit code
Success #stdin #stdout 0.07s 11568KB
stdin
10+6/(3-1)
2+2*2
5/0
exit
stdout
13
6
Infinity