CSCI 136 :: Fall 2020
Data Structures & Advanced Programming
Home | Schedule | Labs | Handouts | Links | CS@Williams
Lab 5: P.S. It's Just a Stack!
In this week's lab (described in Section 10.5 of Bailey) we will implement a small portion of the stack-based language Postscript, a language designed to describe graphical images. When you create a Postscript file or print to a PostScript printer, you actually create a file that contains a program written in this language. A printer or viewer interprets that program to render the image described by the file.
Pre-lab Task: Explore the Starter Code
      For this lab, we provide you with several useful classes to serve as building blocks for your implementation.
      These starter files are well documented, but sometimes reading source code can be daunting.
      To help out, we will use the javadoc program to generate Javdoc-formatted webpages that we can use to
      get a handle on the ways these classes can fit into our lab program design.
    
      To create Javadoc documentation from the files in your repository,
      we can use the javadoc program that is included with our Java installation.
      By default, javadoc will process the
      Javadoc-formatted comments in a source file and generate a series
      of webpages and resources in the current directory. We don't
      want to clutter our repositories, so we will tell Javadoc to place
      its output inside the javadoc/ folder that we have created.
      The command we suggest that you use is:
    
$ javadoc -d javadoc/ *.javaSome notes on this command:
-d javadoc option tells the javadoc program to place its output in the javadoc/ directory.
      *.java argument tells Javadoc to create documentation for every single file in your current directory that ends with the extension .java. The * is what is called a "wildcard character" (in *.java, the * will expand to match anything that it can, given the constraint that the string ends in .java).
    After you are done, you should see many new files in your javadoc/ directory:
$ ls javadoc/
Interpreter.html         help-doc.html            package-tree.html
Reader.html              index-all.html           resources
SymbolTable.html         index.html               script-dir
Token.html               member-search-index.js   script.js
allclasses-index.html    member-search-index.zip  search.js
allpackages-index.html   overview-tree.html       stylesheet.css
constant-values.html     package-search-index.js  system-properties.html
deprecated-list.html     package-search-index.zip type-search-index.js
element-list             package-summary.html     type-search-index.zip
If I want to view my newly created documentation, I would open the file index.html. This is the webpage that forms the "root" of my Javadoc websites. In macOS, I could use the open command:
$ open javadoc/index.htmlI can also use my browser of choice (e.g., Firefox, Chrome, Safari, Edge, etc.) to open that local file.
Before lab, please do the following:
Token, Reader,
	  and SymbolTable classes.
	  These classes will be helpful in your implementation.
	Lab Assignment
Complete Laboratory Assignment 10.5, which begins on page 247 of Bailey (PDF excerpt here). We have provided additional notes below.
In addition, answer the following Questions on page 246 of your text in a file called PROBLEMS.md, and submit it with the rest of your code this week. Note that we have added additional text in italics below to help clarify the questions.
Helpful Notes
.ps file extension.
	Interpreter.
	  You should only need to modify the Interpreter class
	  and nothing else.
	sample.ps
	  to your Interpreter program by using a command like:
	  $ java Interpreter < sample.psmain method very short.
	  All it should do is create an Interpreter
	  object and tell it to start parsing the postscript program
	  provided as standard input.
	  Create a method interpret that takes a single parameter
	  of type Reader
	  and processes the PostScript tokens returned by that Reader.
	interpret(Reader reader) method
	  incrementally.  Get your
	  simple push, pop,
	  and pstack operations working, then move on to
	  the arithmetic operators, and finally the definition and
	  usage of symbols.
	  Decompose the program into small, manageable
	    helper methods as you go!
	  You may wish to use a large switch statement,
	  but each "case" should call an appropriate helper.
	Assert.condition()
	  and Assert.fail() for this (or use the
	  Java assert statement).  Think about the
	  different operations that may share preconditions.  Can you
	  create helper methods that meaningfully handle multiple
	  operations?
	$  gs -dNODISPLAY
      checkstyle requirements:
    
      For this lab, we will be not be adding any
      new checkstyle rules to the set of rules that we
      have used in previous weeks. Last week we requested that you
      include
Javadoc-style
      comments for each public method, and this
      week we are asking you to use the javadoc program to
      produce real Javadoc webpages. We hope that you generate these
      webpages using your comments in Interpreter.java, and
      use the generated files to help you improve your documentation.
    
We STRONGLY ENCOURAGE you to run checkstyle early and often when developing your code, and try to program in a way that minimizes WARNING messages. The checkstyle rules that we use in this course are based on real-world style guides; internalizing good style practices will help us write more readable code.
In total, checkstyle will enforce the following guidelines:
final must be
	declared private or protected (i.e.,
	no public member variables unless they are
	constants). (We don't expect this to be an issue this week.)
      public methods must include a “Javadoc” comment
	(starts with /** and ends with */;
	it should include descriptions of the function at the top,
	descriptions of return values after a @return tag,
	descriptions of each argument after a @param tag,
	and pre/post conditions after the @pre
	or @post tags).
          .
    .
    .
    switch (symbolToken.getSymbol()) {
    case "add":
        doAdd();
        break;
    .
    .
    .    .
    .
    .
    switch (symbolToken.getSymbol()) {
    case "add":
    case "sub":
    case "mul":
    case "div":
        doMathOp(symbolToken);
        break;
    .
    .
    .
      To run checkstyle, you would type the following
      command at the terminal:
    
$ ./checkstyle
      The ./ is peculiar to Unix: it tells the terminal
      to look for the checkstyle program in the current
      directory.  This command will run checkstyle on
      every Java program in your directory.  To
      run checkstyle on a specific Java file, type:
    
$ ./checkstyle SomeFile.java
Lab Deliverables
For this lab, please submit the following:
If you worked with a partner, submit your collaborative solution in your shared repository.
As in all labs, you will be graded on design, documentation, style, and correctness. Be sure to document your program with appropriate comments, including class-level and method-level comments (with pre- and post-conditions where appropriate). Also use comments and descriptive variable names to clarify sections of the code which may not be clear to someone trying to understand it. The CS136 Style Guide may be helpful.
Whenever you see yourself duplicating functionality, consider moving that code to a helper method. There are several opportunities in this lab to simplify your code by using helper methods. Think carefully!
Submitting Your Lab
As you complete various milestones, you should commit your changes and push them. Commit early and often. When the deadline arrives, we will retrieve the latest version of your code. If you are confident that you are done, please include "Lab Submission" as the commit message for your final commit. If you later decide that you have more edits to make, it is OK. We will look at the latest commit before the deadline.
We will know that the files are yours because they are in your git repository. Do not include identifying information in the code that you submit. Our goal is to grade the programs anonymously to avoid any bias. However, in your README.md file, please cite any sources of inspiration or collaboration (e.g., conversations with classmates). We take the honor code very seriously, and so should you. Please include the statement "I am the sole author of the work in this repository." In the comments at the top your Interpreter.java file.
Late Days
At any point up to the lab deadline, and for any reason at all, you may decide to take a late day. In order to let us know, you must fill out this form.
Over the course of the semester, you have a total of 3 free late days at your disposal. You may not take more than two late days on a given lab. When deciding whether or not to take a late day, please remember that we give partial credit for any work that you complete.