import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
/**
* This parser reads user input and tries to interpret
* it as an "Adventure" command. Every time it is called it reads a line
* from the terminal and tries to interpret the line as a two word command.
* It returns the command as an object of class Command.
*
* The parser has a set of known command words. It
* checks user input against the known commands, and if the input is not one of
* the known commands, it returns a command object that is marked as an
* unknown command.
*
* @author Muhammad Naufaldillah
* @version 24 Novemebr 2020
*/
public class Parser
{
private CommandWords commands; // holds all valid command words
public Parser()
{
commands = new CommandWords();
}
public Command getCommand()
{
String inputLine = ""; // will hold the full line
String word1;
String word2;
System.out.print("> "); // print prompt
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
try
{
inputLine = reader.readLine();
}
catch(java.io.IOException exc)
{
System.out.println("There was an error during reading: " + exc.getMessage());
}
StringTokenizer tokenizer = new StringTokenizer(inputLine);
if(tokenizer.hasMoreTokens())
{
word1 = tokenizer.nextToken(); // get first word
}
else
{
word1 = null;
}
if(tokenizer.hasMoreTokens())
{
word2 = tokenizer.nextToken(); // get second word word
}
else
{
word2 = null;
}
// note: we just ignore the rest of the input line.
// Now check whether this word is known. If so, create a command
// with it. If not, create a "null" command (for unknown command).
if(commands.isCommand(word1))
{
return new Command(word1, word2);
}
else
{
return new Command(null, word2);
}
}
}