A Console User Interface for the Stack Machine

Create a package called presentation.

Add a class called StackMachineCUI. This class should have a main method.

A console user interface (CUI) is driven by a perpetual loop of the form:

while(true) {
   read next command
   if command is quit then break
   execute command
   print result
}

Scanners

While System.out is barely adequate for console output, System.in is totally inadequate. We can enhance it by wrapping it in a scanner:

Scanner kbd = new Scanner(System.in);

Scanners have many useful methods for extracting tokens from strings and streams.

For example:

String command = kbd.next(); // command = next token in System.in
double operand = kbd.nextDouble();

Commands

Before we can complete our control loop we must decide on the commands we will execute and their syntax and semantics.

Assume sm is some stack machine:

StackMachine sm = new StackMachine();

Here is a list of commands for the stack machine and their interpretations:

quit // terminate program

push NUMBER // sm.push(NUMBER)

pop // sm.pop()

top // display sm.peek()

add // sm.add()

mul // sm.mul()

sub // sm.sub()

div // sm.div()

A Basic Control Loop

Here's a basic control loop. Finish it by replacing the ??? comments:

   public static void main(String[] args) {
      StackMachine sm = new StackMachine();
      Scanner kbd = new Scanner(System.in);
      while(true) {
         System.out.print("-> ");
         String command = kbd.next();
         String result = "done";
         if (command.equals("quit")) {
            break;
         }
         try {
            if (command.equals("push")) {
               if (!kbd.hasNextDouble()) {
                  kbd.nextLine(); // flush
                  System.out.println("argument to push must be a double");
                  continue;
               }
               sm.push(kbd.nextDouble());
            } else if (command.equals("pop")) {
               // ???
            } else if (command.equals("top")) {
               result = "" + sm.peek();
            } else if (command.equals("add")) {
               sm.add();
            } else if (command.equals("mul")) {
               // ???
            } else if (command.equals("sub")) {
               // ???
            } else if (command.equals("div")) {
               // ???
            } else {
               System.out.println("unrecognized command: " + command);
               kbd.nextLine(); // flush
            }
         } catch (Exception e) {
            System.out.println(e.getMessage());
            kbd.nextLine(); // flush
            continue;
         }
         System.out.println(result);
      }
      System.out.println("bye");

   }

Here's a sample output:

-> push 3
done
-> push 4
done
-> top
4.0
-> push ten
argument to push must be a double
-> puch
unrecognized command: puch
done
-> add
done
-> top
7.0
-> add
stack needs at least 2 numbers
-> quit
bye