Advertisement
Guest User

Untitled

a guest
Dec 15th, 2018
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.10 KB | None | 0 0
  1. type instruction =
  2. | ADD (* dodawanie *)
  3. | SUB (* odejmowanie *)
  4. | MUL (* mnozenie *)
  5. | SQR (* podnoszenie do kwadratu *)
  6. | PUSH of float (* odkladanie na stos *)
  7.  
  8. type stack = float list
  9.  
  10. exception BLEDNY_PROGRAM of (instruction * stack)
  11. let intInstr (x , y) =
  12. match x , y with
  13. | ADD, a::b::ys -> (b + a) :: ys : stack
  14. | SUB, a::b::ys -> (b - a) :: ys
  15. | MUL, a::b::ys -> (b * a) :: ys
  16. | SQR, a::ys -> (a * a) :: ys
  17. | PUSH x, ys -> x::ys
  18. | _ , _ -> raise (BLEDNY_PROGRAM(x, y));
  19.  
  20. let wypisz_instr = function
  21. | ( PUSH x) -> "PUSH " + System.Convert.ToString(x)
  22. | ( SQR ) -> " SQR "
  23. | ( ADD ) -> " ADD "
  24. | ( SUB ) -> " SUB "
  25. | ( MUL ) -> " MUL ";
  26. let intpProg(is) =
  27. let rec iPS = function
  28. | ([],x::xs) -> x (* koniec listy instrukcji (obliczeń)
  29. zwracany wierzchołek stosu *)
  30. | (i::is, xs) -> iPS(is, intInstr(i, xs))
  31. (* wykonanie pojedynczej instrukcji i *)
  32. iPS(is,[]) (* start programu, stos początkowo pusty *)
  33. [<EntryPoint>]
  34. let main argv =
  35. let il1 = [PUSH 3.0; PUSH 4.0; ADD; PUSH 2.0; MUL];
  36. let il2 = [PUSH 2.0; PUSH 3.0; ADD; PUSH 4.0];
  37. let il3 = [PUSH 1.0; PUSH 2.0; ADD; MUL];
  38. let stos:stack = []
  39. let stos1 = intInstr(PUSH 3.0,stos);
  40. let stos2 = try intInstr(ADD, stos1) with BLEDNY_PROGRAM (a, b) ->( printf "Wyjątek: Błędne wykonanie programu\nOperand: %A, Stos: %A" a b ; b);
  41. let w1 = intpProg(il1)
  42. let w2 = intpProg(il2)
  43. //let w3 = intpProg(il3)
  44. printfn "%A" argv
  45. printfn "stos1: %A " <| (stos1)
  46. printfn "stos2: %A " <| (stos2)
  47. printfn "intprog: %A" <| (w1)
  48. printfn "intprog: %A" <| (w2)
  49. //printfn "intprog: %A" <| (w3)
  50.  
  51.  
  52.  
  53. printf "Naciśnij klawisz..."
  54. ignore (System.Console.ReadKey(true))
  55. 0 // return an integer exit code
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement