Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- type instruction =
- | ADD (* dodawanie *)
- | SUB (* odejmowanie *)
- | MUL (* mnozenie *)
- | SQR (* podnoszenie do kwadratu *)
- | PUSH of float (* odkladanie na stos *)
- type stack = float list
- exception BLEDNY_PROGRAM of (instruction * stack)
- let intInstr (x , y) =
- match x , y with
- | ADD, a::b::ys -> (b + a) :: ys : stack
- | SUB, a::b::ys -> (b - a) :: ys
- | MUL, a::b::ys -> (b * a) :: ys
- | SQR, a::ys -> (a * a) :: ys
- | PUSH x, ys -> x::ys
- | _ , _ -> raise (BLEDNY_PROGRAM(x, y));
- let wypisz_instr = function
- | ( PUSH x) -> "PUSH " + System.Convert.ToString(x)
- | ( SQR ) -> " SQR "
- | ( ADD ) -> " ADD "
- | ( SUB ) -> " SUB "
- | ( MUL ) -> " MUL ";
- let intpProg(is) =
- let rec iPS = function
- | ([],x::xs) -> x (* koniec listy instrukcji (obliczeń)
- zwracany wierzchołek stosu *)
- | (i::is, xs) -> iPS(is, intInstr(i, xs))
- (* wykonanie pojedynczej instrukcji i *)
- iPS(is,[]) (* start programu, stos początkowo pusty *)
- [<EntryPoint>]
- let main argv =
- let il1 = [PUSH 3.0; PUSH 4.0; ADD; PUSH 2.0; MUL];
- let il2 = [PUSH 2.0; PUSH 3.0; ADD; PUSH 4.0];
- let il3 = [PUSH 1.0; PUSH 2.0; ADD; MUL];
- let stos:stack = []
- let stos1 = intInstr(PUSH 3.0,stos);
- 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);
- let w1 = intpProg(il1)
- let w2 = intpProg(il2)
- //let w3 = intpProg(il3)
- printfn "%A" argv
- printfn "stos1: %A " <| (stos1)
- printfn "stos2: %A " <| (stos2)
- printfn "intprog: %A" <| (w1)
- printfn "intprog: %A" <| (w2)
- //printfn "intprog: %A" <| (w3)
- printf "Naciśnij klawisz..."
- ignore (System.Console.ReadKey(true))
- 0 // return an integer exit code
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement