CSCI 136 :: Spring 2021
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/ *.java
Some 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.html
This will open the javadoc page for your Interpreter class. To see the javadocs for all four classes, try:
$ open javadoc/allclasses-index.html
I 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 from page 246 of your text in 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.ps
main
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
to get a text-only postscript interpreter (or to learn whether
gs is installed on your system.
You can type commands at the prompt as they appear in the lab
assignment. Type quit to exit the interpreter.
If PostScript is not installed, try the website above or
search the web for a free GhostScript installation.
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;
.
.
.
and
.
.
.
switch (symbolToken.getSymbol()) {
case "add":
case "sub":
case "mul":
case "div":
doMathOp(symbolToken);
break;
.
.
.
are two examples where the Java code that implements the logic for
performing a PostScript operation are handled inside a helper method
instead of directly inside the switch statement.
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
Remember that if‐for any reason‐you will be submitting your lab beyond submission deadline, you'll need to fill out the Late Lab Form. That form contains a description of the late lab submission policy for the course