Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- module NPI
- open System.Text.RegularExpressions
- type tok = Int of int |Operator of (int -> int -> int)
- let parse_op = function
- "-" -> Operator (-) | "/" -> Operator (/) | "*" -> Operator (*) | _ -> Operator (+)
- let parser (expr : string) =
- Regex.Split(expr, "(\s|\t|\+|\-|\/|\*)")
- |> Array.toList
- |> List.filter (fun x -> x <> "" && x <> " ")
- |> List.map (fun x -> match x with |"+"|"-"|"*"|"/" -> parse_op x |integer -> Int (int x))
- let exec (expr: string) : int =
- let rec exec stack (expr : list<tok>) =
- match expr with
- | Int x :: rest -> exec (x :: stack) rest
- | Operator formulas :: rest ->
- let (a::b::xs) = stack
- exec (formulas a b :: xs) rest
- | [] -> List.head (List.rev stack)
- | _ :: rest -> exec stack rest
- and exec_expr = exec []
- expr
- |> parser
- |> exec_expr
Add Comment
Please, Sign In to add comment