You've already forked gnatstudio
mirror of
https://github.com/AdaCore/gnatstudio.git
synced 2026-02-12 12:42:33 -08:00
72 lines
1.3 KiB
Ada
72 lines
1.3 KiB
Ada
with Except;
|
|
with Screen_Output;
|
|
with Stack;
|
|
|
|
package body Values.Operations is
|
|
|
|
----------
|
|
-- Read --
|
|
----------
|
|
|
|
function Read (Op : String) return Operation is
|
|
begin
|
|
if Op = "+" then
|
|
return Add;
|
|
|
|
elsif Op = "-" then
|
|
return Sub;
|
|
|
|
elsif Op = "*" then
|
|
return Mul;
|
|
|
|
elsif Op = "/" then
|
|
return Div;
|
|
|
|
else
|
|
raise Except.User_Error;
|
|
end if;
|
|
end Read;
|
|
|
|
-------------
|
|
-- Process --
|
|
-------------
|
|
|
|
procedure Process (Op : Operation) is
|
|
V2 : Value := Stack.Pop;
|
|
V1 : Value := Stack.Pop;
|
|
|
|
Result : Integer;
|
|
|
|
begin
|
|
case Op is
|
|
when Add =>
|
|
Result := V1.E + V2.E;
|
|
|
|
when Div =>
|
|
Result := V1.E / V2.E;
|
|
|
|
when Mul =>
|
|
Result := V1.E * V2.E;
|
|
|
|
when Sub =>
|
|
Result := V1.E - V2.E;
|
|
end case;
|
|
|
|
-- Create an integer Value by setting the field "E" of the record
|
|
-- to Result.
|
|
|
|
Stack.Push (new Value_Info'(E => Result));
|
|
|
|
exception
|
|
-- If we get a Constraint_Error exception, then we had a computation
|
|
-- overflow or a divide by zero.
|
|
|
|
when Constraint_Error =>
|
|
Screen_Output.Error_Msg ("Operation error. Values popped.");
|
|
|
|
end Process;
|
|
|
|
end Values.Operations;
|
|
|
|
|