Guest User

Untitled

a guest
Aug 10th, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 0.87 KB | None | 0 0
  1. module NPI
  2. open System.Text.RegularExpressions
  3. type tok = Int of int |Operator of (int -> int -> int)
  4. let parse_op = function
  5.     "-" -> Operator (-) | "/" -> Operator (/) | "*" -> Operator (*) | _ -> Operator (+)
  6. let parser (expr : string) =
  7.     Regex.Split(expr, "(\s|\t|\+|\-|\/|\*)")
  8.     |> Array.toList
  9.     |> List.filter (fun x -> x <> "" && x <> " ")
  10.     |> List.map (fun x -> match x with |"+"|"-"|"*"|"/" -> parse_op x |integer -> Int (int x))
  11. let exec (expr: string) : int =
  12.     let rec exec stack (expr : list<tok>) =
  13.         match expr with
  14.         | Int x :: rest -> exec (x :: stack) rest
  15.         | Operator formulas :: rest ->
  16.             let (a::b::xs) = stack
  17.             exec (formulas a b :: xs) rest
  18.         | [] -> List.head (List.rev stack)
  19.         | _ :: rest -> exec stack rest
  20.     and exec_expr = exec []
  21.     expr
  22.     |> parser
  23.     |> exec_expr
Add Comment
Please, Sign In to add comment