Advertisement
Sawy3R11

LAB#_SiWP

Mar 27th, 2019
1,549
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 2.51 KB | None | 0 0
  1. // Learn more aout F# at http://fsharp.org
  2. // See the 'F# Tutorial' project for more help.
  3.  
  4. type instruction =
  5.     | ADD
  6.     | SUB
  7.     | MUL
  8.     | SQR
  9.     | PUSH of float
  10. type stack = float list
  11.  
  12. let wypisz_instr = function
  13.    | (PUSH x) -> "PUSH" + System.Convert.ToString( x )
  14.    | (SQR)-> " SQR "
  15.    | (ADD) -> " ADD "
  16.    | (SUB) -> " SUB "
  17.    | (MUL) -> " MUL "
  18. let rec wypisz_inst_wszytkie = function
  19.    | ([], x::xs) -> printf "%A\n" x  
  20.    | (i::is, xs) -> wypisz_inst_wszytkie( is, xs )
  21.  
  22. exception BLEDNY_PROGRAM of (instruction * stack)
  23. let intInstr (x, y) =
  24.     match x, y with
  25.     | ADD, a::b::ys -> (b+a) :: ys : stack
  26.     | SUB, a::b::ys -> (b-a) ::ys
  27.     | MUL, a::b::ys -> (b*a)::ys
  28.     | SQR, a::ys-> (a*a) :: ys
  29.     | PUSH x, ys-> x::ys
  30.     | _, _ -> raise (BLEDNY_PROGRAM(x, y))
  31.  
  32. let intpProg(is) =
  33.    let rec iPS = function
  34.       | ([], x::xs) -> x
  35.       | (i::is, xs) -> try iPS(is, intInstr(i, xs)) with
  36.                                                     BLEDNY_PROGRAM(a, b)->
  37.                                                     (
  38.                                                        printf "Wyjatek: Bledne wykonanie proramu \n Operand: %A, STOS: %A" a b
  39.                                                        wypisz_inst_wszytkie b
  40.                                                        b
  41.                                                     )
  42.    iPS(is, [])
  43.      
  44.  
  45. [<EntryPoint>]
  46. let main argv =
  47.     printfn "%A" argv
  48.  
  49.     let i1 = PUSH 3.0
  50.     let i2 = PUSH 4.0
  51.     let i3 =ADD
  52.     let stos: stack=[]
  53.     let stos1= intInstr( i1, stos)
  54.     let stos2= intInstr( i2, stos1)
  55.     let stos3 = intInstr( i3, stos2)
  56.     printf "stos: %A" stos3
  57.     //2
  58.     let stos2:stack = [4.0; 3.0; 2.0]
  59.     let stos2_2 = intInstr(SUB, stos2);
  60.     let stos2_3 = intInstr(MUL, stos2_2)
  61.     printf "stos2 = %A" stos2_3
  62.     //3
  63.     let stos2_4 = try intInstr(ADD, stos2_3) with
  64.                                              BLEDNY_PROGRAM(a, b) ->
  65.                                              (
  66.                                                 printf "Wyjatek: Blende wykonanie programu\n Operand: %A, STOS: %A" a b
  67.                                                 b    
  68.                                              )
  69.     let il1 = [PUSH 3.0; PUSH 4.0; ADD; PUSH 2.0; MUL]
  70.     let w = intpProg( il1 )
  71.     printf "w = %A" w
  72.  
  73.     let il2 = [PUSH 3.0; PUSH 4.0; ADD; PUSH 2.0]
  74.     let w2 = intpProg( il2 )
  75.     printf "\n w2 = %A" w2
  76.     0 // return an integer exit code
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement