In this project, you will write a operation on parse trees. Given a Jay program represented as a parse tree, your program shall print it to the screen back as a Jay program, but "pretty-printed," that is, with conventional spacing and indentation.
The parser, syntax tree classes, and generic visitors have already been generated for you from the Jay grammar, and they are archived in a tar file. Copy the file from the class directory and untar it.
cp /cslab/class/cs365/proj2.tar . tar xvf jay.tar
A driver program is also provided in Main.java
.
You will need to uncomment two lines of this file before you
test your code, but you will not be making any other changes.
To help you understand JTB's syntax trees and the visitor pattern a little better, I've provided a feature called "syntax-printing." This prints out the parse tree, showing what each node (object) in the tree is, and uses indentation to show the structure. For example, syntax-printing the following Jay program
void main() { int x; x = 2 + 3; System.out.println(x); }
produces
Program NodeToken: void NodeToken: main NodeToken: ( NodeToken: ) NodeToken: { NodeList NodeListOptional Declaration Type NodeToken: int Identifiers NodeToken: x NodeListOptional NodeToken: ; Statements NodeListOptional Statement Assignment NodeToken: x NodeToken: = Expression Conjunction Relation Addition Term Negation NodeOptional Factor NodeToken: 2 NodeListOptional NodeListOptional NodeSequence AdditionOperator NodeToken: + Term Negation NodeOptional Factor NodeToken: 3 NodeListOptional NodeOptional NodeListOptional NodeListOptional NodeToken: ; Statement PrintStatement NodeToken: System.out.println NodeToken: ( Expression Conjunction Relation Addition Term Negation NodeOptional Factor NodeToken: x NodeListOptional NodeListOptional NodeOptional NodeListOptional NodeListOptional NodeToken: ) NodeToken: ; NodeToken: } NodeToken:
This is to help you in two ways:
syntaxtree
classes that JTB produces.
It will be hard to remember what construct becomes a NodeListOptional
and what becomes a NodeSequence
.
Syntax-printing a sample Jay program should clarify things.
SyntaxPrintingVisitor.java
is a second example of a JTB visitor (after the one we saw in class).
You can imitate this class in what you write for this project.
Pretty-printing refers to formating a file so that it is easily
readable for humans.
Write a class PrettyPrintingVisitor
to implement Visitor
or
to extend
DepthFirstVisitor
which will traverse a parse
tree and print to the screen equivalent Jay source code
with readable spacing.
For example, the program above should appear as
void main() { int x; x = 2 + 3; System.out.println(x); }
I will be using diff to grade your projects (I will diff the output of your code with what I think the output should be), so we'll need to set a standard guideline for what the format should be. Follow the style I have indicated above (for example, opening curly brace on the same line as whatever introduces the block, spaces between operands and operators...). Use the same indentation that the default version of Xemacs in the lab uses. Ask if you have any questions on formatting and style.
You can find two Jay examples in
the directory given (add.jay
and euclid.java
).
You are also encouraged to write your own examples and to share them
with your classmates.
As mentioned above, I have included a driver program. Uncomment the lines indicated to test your pretty-printer. The command
java Main add.jay --s
will "syntax-print" the file add.jay
, and
you can pretty-print it by
java Main add.jay --p
To turn in this project, please copy your
PrettyPrintingVisitor.java
to the turn-in directory I will prepare for you:
/cslab/class/cs365/turnin/proj2/xxxxxx
where "xxxxxx" is [andy|david|tyler|yelemis]. I will grade your project by running it against a collection of test files.
DUE: Friday, Feb 1, 5:00 pm.