Advertisement
ElfikCo

SWiP - Lab 3

Apr 6th, 2022
3,284
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 6.31 KB | None | 0 0
  1. open System
  2.  
  3. type instruction =
  4.     | ADD
  5.     | SUB
  6.     | MUL
  7.     | DIV
  8.     | SQR
  9.     | TAN
  10.     | WRX
  11.     | RDX
  12.     | PUSH of float
  13.  
  14. type stack = float list
  15.  
  16. exception BLEDNY_PROGRAM of (instruction * stack);
  17. exception DOMAIN;
  18.  
  19. let intInstr (x , y) =
  20.     match  x, y  with
  21.     | ADD, a::b::ys -> (b + a) :: ys : stack
  22.     | ADD, a::ys -> ( printf "ADD, jeden argument\n"; raise (BLEDNY_PROGRAM(x, y)))
  23.     | ADD, [] -> ( printf "ADD, brak argumentów\n"; raise (BLEDNY_PROGRAM(x, y)))
  24.     | SUB, a::b::ys -> (b - a) :: ys
  25.     | MUL, a::b::ys -> try (b * a) :: ys with
  26.                                         | :? OverflowException -> (
  27.                                                                     printf "Przelano wartość"
  28.                                                                     Double.MaxValue :: ys
  29.                                         )
  30.     | DIV, a::b::ys -> try (b / a) :: ys with
  31.                                         | :? DivideByZeroException -> (
  32.                                                                         printf "Nie dziel przez 0"
  33.                                                                         0.0 :: ys
  34.                                         )
  35.     | SQR, a::ys -> (a * a) :: ys
  36.     | TAN, a::ys -> try if Math.Cos(a) = 0.0 then raise DOMAIN else Math.Tan(a) :: ys with
  37.                                         | :? DOMAIN -> (
  38.                                                         printf "TAN: Invalid domain"
  39.                                                         Double.MaxValue :: ys
  40.                                         )
  41.     | PUSH x, ys -> x::ys
  42.     | _, _ -> raise (BLEDNY_PROGRAM(x, y));
  43.  
  44. let wypisz_instr = function
  45.     | ( PUSH x) -> "PUSH " + Convert.ToString(x)
  46.     | ( SQR ) -> " SQR "
  47.     | ( ADD ) -> " ADD "
  48.     | ( SUB ) -> " SUB "
  49.     | ( MUL ) -> " MUL ";
  50.  
  51. let rec wypisz = function
  52.     | [] -> ""
  53.     | x::xs -> ((wypisz_instr x) + ";" + (wypisz xs))
  54.  
  55. let intpProg(is) =
  56.     let rec iPS = function
  57.         | ([], x::xs) -> x
  58.         | (i::is, xs) -> (
  59.                             printf "Przycisk %A\n" i
  60.                             let _ = Console.ReadKey true
  61.                             try iPS(is, intInstr(i, xs)) with
  62.                                                     BLEDNY_PROGRAM(a, b) -> (
  63.                                                                             printf "%s" (wypisz(is))
  64.                                                                             -1.0
  65.                                                     )
  66.         )
  67.     iPS(is, [])
  68.  
  69. type boolInstruction =
  70.     | OR
  71.     | NOT
  72.     | UP of bool
  73.  
  74. let boolOperation = function
  75.     | OR, a::b::rest -> (a || b) :: rest
  76.     | NOT, a::rest -> (not a) :: rest
  77.     | UP a, rest -> a :: rest
  78.  
  79. let boolProc(is) =
  80.     let rec boolPS = function
  81.         | ([], x::xs) -> x
  82.         | (i::is, xs) -> boolPS(is, boolOperation(i, xs))
  83.     boolPS(is, [])
  84.  
  85. let intInstrWithR (x, y, r) =
  86.     match  x, y, r  with
  87.     | ADD, a::b::ys, r -> ((b + a) :: ys, r)
  88.     | ADD, a::ys, r -> ( printf "ADD, jeden argument\n"; raise (BLEDNY_PROGRAM(x, y)))
  89.     | ADD, [], r -> ( printf "ADD, brak argumentów\n"; raise (BLEDNY_PROGRAM(x, y)))
  90.     | SUB, a::b::ys, r -> ((b - a) :: ys, r)
  91.     | MUL, a::b::ys, r -> try ((b * a) :: ys, r) with
  92.                                         | :? OverflowException -> (
  93.                                                                     printf "Przelano wartość"
  94.                                                                     (Double.MaxValue :: ys, r)
  95.                                         )
  96.     | DIV, a::b::ys, r -> try ((b / a) :: ys, r) with
  97.                                         | :? DivideByZeroException -> (
  98.                                                                         printf "Nie dziel przez 0"
  99.                                                                         (0.0 :: ys, r)
  100.                                         )
  101.     | SQR, a::ys, r -> ((a * a) :: ys, r)
  102.     | TAN, a::ys,r  -> try if Math.Cos(a) = 0.0 then raise DOMAIN else (Math.Tan(a) :: ys, r) with
  103.                                         | :? DOMAIN -> (
  104.                                                         printf "TAN: Invalid domain"
  105.                                                         (Double.MaxValue :: ys, r)
  106.                                         )
  107.     | PUSH x, ys, r -> (x::ys, r)
  108.     | WRX, y::ys, r -> (y::ys, y)
  109.     | RDX, ys, r -> (r::ys, r)
  110.     | _, _, _ -> raise (BLEDNY_PROGRAM(x, y));
  111.  
  112. let intpProgWithR(is) =
  113.     let rec iPS = function
  114.         | ([], (x::xs, r)) -> x
  115.         | (i::is, (xs, r)) -> (
  116.                                 printf "Przycisk %A\n" i
  117.                                 let _ = Console.ReadKey true
  118.                                 try iPS(is, intInstrWithR(i, xs, r)) with
  119.                                                     BLEDNY_PROGRAM(a, b) -> (
  120.                                                                             printf "%s" (wypisz(is))
  121.                                                                             -1.0
  122.                                                     )
  123.         )
  124.     iPS(is, ([], 0.0))
  125.  
  126. [<EntryPoint>]
  127. let main argv =
  128.     let stos: stack = [];
  129.     let stos1 = intInstr(PUSH 3.0, stos);
  130.     let stos2 = try intInstr(ADD, stos1) with
  131.                                             BLEDNY_PROGRAM(a, b) -> (
  132.                                                                     //printf "Wyjątek: Błędne wykonanie programu.\nOperand: %A, Stos: %A\n" a b;
  133.                                                                     b
  134.                                             )
  135.     let il1 = [PUSH 3.0; PUSH 4.0; ADD; PUSH 2.0; MUL]
  136.     let il2 = [PUSH 3.0; PUSH 4.0; ADD; PUSH 2.0];
  137.     let il3 = [PUSH 3.0; PUSH 4.0; ADD; MUL; ADD; SUB];
  138.     let divide0Error = [PUSH 0.0; PUSH 1.0; DIV; PUSH 1.0; ADD]
  139.     let oveflow = [PUSH Double.MaxValue; PUSH 2.0; MUL; PUSH 1.0; SUB]
  140.     let tan = [PUSH 2.0; TAN]
  141.     let add1 = [PUSH 2.0; ADD]
  142.     let add0 = [ADD]
  143.     let wa = intpProg(add1)
  144.     let w1 = intpProg(add0)
  145.     //let w = boolProc([UP true; NOT; UP false; OR])
  146.     let withR = [PUSH 2.0; PUSH 3.0; ADD; WRX; PUSH 3.0; MUL; PUSH 4.0; RDX; MUL; ADD;]
  147.     let w = intpProgWithR(withR)
  148.     printfn "%A" w
  149.     //printfn "%A" stos2
  150.     0 // return an integer exit code
  151.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement