--
-- Copyright (C) 1996 Ada Resource Association (ARA), Columbus, Ohio.
-- Author: David A. Wheeler
--
with Text_IO, Ada.Strings.Maps.Constants, Ustrings, Things, Occupants, World;
use Text_IO, Ada.Strings.Maps.Constants, Ustrings, Things, Occupants, World;
use Ada.Strings, Ada.Strings.Maps;
with Directions;
use Directions;
package body Parser is
Spaces : constant Character_Set := To_Set(' ');
procedure Split(Source : in Unbounded_String;
First_Word : out Unbounded_String;
Rest : out Unbounded_String) is
First : Positive; -- Index values of first word.
Last : Natural;
-- Puts first word of Source into First_Word, the rest of the words in Rest
-- (without leading spaces); words are separated by one or more spaces;
-- if there are no spaces, Rest returns empty.
begin
Find_Token(Source, Spaces, Outside, First, Last);
First_Word := U(Slice(Source, First, Last));
Rest := Trim(U(Slice(Source, Last + 1, Length(Source))), Left);
end Split;
procedure Execute(Command : in Unbounded_String; Quit : out Boolean) is
Trimmed_Command : Unbounded_String := Trim(Command, Both);
Verb, Arguments, First_Argument, Rest_Of_Arguments : Unbounded_String;
Direct_Object : Occupant_Access;
begin
Quit := False; -- By default assume we won't quit.
if (Empty(Trimmed_Command)) then
return; -- Ignore blank lines.
end if;
-- Extract Verb and First_Argument and force them to lower case.
Split(Trimmed_Command, Verb, Arguments);
Translate(Verb, Lower_Case_Map);
Split(Arguments, First_Argument, Rest_Of_Arguments);
Translate(First_Argument, Lower_Case_Map);
-- Try to execute "Verb".
if Verb = "look" then
Look(Me);
elsif Verb = "get" then
Direct_Object := Occupant_Access(Find(Me, First_Argument));
if Direct_Object /= null then
Get(Me, Direct_Object);
end if;
elsif Verb = "drop" then
Direct_Object := Occupant_Access(Find_Inside(Me, First_Argument));
if Direct_Object /= null then
Drop(Me, Direct_Object);
end if;
elsif Verb = "inventory" or Verb = "inv" then
Inventory(Me);
elsif Verb = "quit" then
Quit := True;
elsif Verb = "go" and then Is_Direction(First_Argument) then
Go(Me, To_Direction(First_Argument));
Look(Me);
elsif Is_Direction(Verb) then -- Is the verb a direction (north, etc)?
Go(Me, To_Direction(Verb));
Look(Me);
elsif Verb = "help" then
Put_Line("Please type in one or two word commands, beginning with a verb");
Put_Line("or direction. Directions are north, south, east, west, etc.");
Put_Line("Here are some sample commands:");
Put_Line("look, get box, drop box, inventory, go west, west, w, quit.");
else
Put_Line("Sorry, I don't recognize that verb. Try 'help'.");
end if;
end Execute;
end Parser;
--
-- Permission to use, copy, modify, and distribute this software and its
-- documentation for any purpose and without fee is hereby granted,
-- provided that the above copyright and authorship notice appear in all
-- copies and that both that copyright notice and this permission notice
-- appear in supporting documentation.
--
-- The ARA makes no representations about the suitability of this software
-- for any purpose. It is provided "as is" without express
-- or implied warranty.
--
You may also see the corresponding specification.
You may also see the list of program units.
The following compilation units are referred to ("with"'ed) by Package body Parser:
This hypertext format was generated by David A. Wheeler's ada2html