Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Learn more about F# at http://fsharp.org
- // See the 'F# Tutorial' project for more help.
- 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 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 *)
- let il1 = [PUSH 3.0; PUSH 4.0; ADD; PUSH 2.0; MUL]
- [<EntryPoint>]
- let main argv =
- (*
- let i1 = PUSH 3.0;
- let i2 = PUSH 4.0;
- let i3 = ADD;
- let stos:stack = [];
- let stos1 = intInstr(i1,stos);
- let stos2 = intInstr(i2,stos1);
- let stos3 = intInstr(i3,stos2);
- let stos:stack = [];
- let it = intInstr(PUSH 5.0, stos)
- let stos1 = intInstr(PUSH 3.0,it);
- let stos2 = intInstr(ADD ,stos1);
- *)
- (*
- let stos:stack = []
- let stos1 = intInstr(PUSH 3.0,stos);
- let stos2 = intInstr(ADD ,stos1);
- (* tu jest zgłaszany wyjatek BLEDNY_ARGUMENT *)
- *)
- 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 ;
- (* aktualna wartość stosu *)
- b
- );
- let il1 = [PUSH 3.0; PUSH 4.0; ADD; PUSH 2.0; MUL]
- let il2 = [PUSH 3.0; PUSH 4.0; ADD; PUSH 2.0];
- let il3 = [PUSH 3.0; PUSH 4.0; ADD; MUL];
- let w = intpProg(il1)
- printfn "%A" w
- (*printfn "%A" stos2*)
- 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