2002-06-03 15:05:58 +00:00
|
|
|
with Except;
|
2002-10-03 08:36:40 +00:00
|
|
|
with Screen_Output;
|
2002-06-03 15:05:58 +00:00
|
|
|
|
|
|
|
|
package body Stack is
|
|
|
|
|
|
|
|
|
|
----------------
|
|
|
|
|
-- Local Data --
|
|
|
|
|
----------------
|
|
|
|
|
|
|
|
|
|
Size : constant := 200;
|
|
|
|
|
-- The stack size.
|
|
|
|
|
|
|
|
|
|
Tab : array (1 .. Size) of Value;
|
|
|
|
|
-- The stack. We push and pop pointers to Values.
|
|
|
|
|
|
|
|
|
|
Last : Natural := Tab'First - 1;
|
|
|
|
|
-- Indicates the top of the stack. When 0 the stack is empty.
|
|
|
|
|
|
|
|
|
|
-----------
|
|
|
|
|
-- Clear --
|
|
|
|
|
-----------
|
|
|
|
|
|
|
|
|
|
procedure Clear is
|
|
|
|
|
begin
|
|
|
|
|
Last := Tab'First - 1;
|
|
|
|
|
end Clear;
|
|
|
|
|
|
|
|
|
|
-----------
|
|
|
|
|
-- Empty --
|
|
|
|
|
-----------
|
|
|
|
|
|
|
|
|
|
function Empty return Boolean is
|
|
|
|
|
begin
|
|
|
|
|
return Last < Tab'First;
|
|
|
|
|
end Empty;
|
|
|
|
|
|
|
|
|
|
----------
|
|
|
|
|
-- Push --
|
|
|
|
|
----------
|
|
|
|
|
|
|
|
|
|
procedure Push (V : Value) is
|
|
|
|
|
begin
|
|
|
|
|
if Last = Tab'Last then
|
|
|
|
|
raise Overflow;
|
|
|
|
|
end if;
|
|
|
|
|
|
2002-10-03 08:36:40 +00:00
|
|
|
Screen_Output.Debug_Msg ("Pushing -> " & Values.To_String (V));
|
2002-06-03 15:05:58 +00:00
|
|
|
|
2003-09-19 09:30:38 +00:00
|
|
|
Last := Last - 1;
|
2002-06-24 10:56:14 +00:00
|
|
|
Tab (Last) := V;
|
2002-06-03 15:05:58 +00:00
|
|
|
end Push;
|
|
|
|
|
|
|
|
|
|
---------
|
|
|
|
|
-- Pop --
|
|
|
|
|
---------
|
|
|
|
|
|
|
|
|
|
function Pop return Value is
|
|
|
|
|
V : Value;
|
|
|
|
|
|
|
|
|
|
begin
|
|
|
|
|
if Empty then
|
|
|
|
|
raise Underflow;
|
|
|
|
|
end if;
|
|
|
|
|
|
|
|
|
|
V := Tab (Last);
|
|
|
|
|
Last := Last - 1;
|
|
|
|
|
|
2002-10-03 08:36:40 +00:00
|
|
|
Screen_Output.Debug_Msg ("Popping <- " & Values.To_String (V));
|
2002-06-03 15:05:58 +00:00
|
|
|
|
|
|
|
|
return V;
|
|
|
|
|
end Pop;
|
|
|
|
|
|
|
|
|
|
---------
|
|
|
|
|
-- Top --
|
|
|
|
|
---------
|
|
|
|
|
|
|
|
|
|
function Top return Value is
|
|
|
|
|
begin
|
|
|
|
|
if Empty then
|
|
|
|
|
raise Underflow;
|
|
|
|
|
end if;
|
|
|
|
|
|
|
|
|
|
return Tab (Last);
|
|
|
|
|
end Top;
|
|
|
|
|
|
|
|
|
|
----------
|
|
|
|
|
-- View --
|
|
|
|
|
----------
|
|
|
|
|
|
|
|
|
|
procedure View is
|
|
|
|
|
begin
|
|
|
|
|
for I in Tab'First .. Last loop
|
2002-10-03 08:36:40 +00:00
|
|
|
Screen_Output.Msg (Values.To_String (Tab (I)));
|
2002-06-03 15:05:58 +00:00
|
|
|
end loop;
|
|
|
|
|
|
2002-10-03 08:36:40 +00:00
|
|
|
Screen_Output.Msg ("");
|
2002-06-03 15:05:58 +00:00
|
|
|
end View;
|
|
|
|
|
|
|
|
|
|
end Stack;
|