org.ow2.mind.doc.idl.IDLTreeDumper Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of mindoc Show documentation
Show all versions of mindoc Show documentation
Document generator for MIND
//
// Generated by JTB 1.3.2
//
package org.ow2.mind.doc.idl;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.Writer;
import java.util.LinkedList;
import java.util.List;
import org.ow2.mind.idl.jtb.syntaxtree.NodeToken;
import org.ow2.mind.idl.jtb.syntaxtree.TypeDefName;
import org.ow2.mind.idl.jtb.visitor.DepthFirstVisitor;
/**
* Dumps the syntax tree to a Writer using the location information in
* each NodeToken.
*/
public class IDLTreeDumper extends DepthFirstVisitor {
protected PrintWriter out;
private int curLine = 1;
private int curColumn = 1;
private boolean startAtNextToken = false;
/**
* The default constructor uses System.out as its output location.
* You may specify your own Writer or OutputStream using one of the
* other constructors.
*/
public IDLTreeDumper() { out = new PrintWriter(System.out, true); }
public IDLTreeDumper(final Writer o) { out = new PrintWriter(o, true); }
public IDLTreeDumper(final OutputStream o) { out = new PrintWriter(o, true); }
List tagQueue = new LinkedList();
/**
* Flushes the OutputStream or Writer that this TreeDumper is using.
*/
public void flushWriter() { out.flush(); }
/**
* Starts the tree dumper on the line containing the next token
* visited. For example, if the next token begins on line 50 and the
* dumper is currently on line 1 of the file, it will set its current
* line to 50 and continue printing from there, as opposed to
* printing 49 blank lines and then printing the token.
*/
public void startAtNextToken() { startAtNextToken = true; }
/**
* Resets the position of the output "cursor" to the first line and
* column. When using a dumper on a syntax tree more than once, you
* either need to call this method or startAtNextToken() between each
* dump.
*/
public void resetPosition() { curLine = curColumn = 1; }
/**
* Dumps the current NodeToken to the output stream being used.
*
* @throws IllegalStateException if the token position is invalid
* relative to the current position, i.e. its location places it
* before the previous token.
*/
@Override
public void visit(final NodeToken n) {
if ( n.beginLine == -1 || n.beginColumn == -1 ) {
printToken(n.tokenImage);
return;
}
//
// Handle startAtNextToken option
//
if ( startAtNextToken ) {
curLine = n.beginLine;
curColumn = 1;
startAtNextToken = false;
if ( n.beginColumn < curColumn )
out.println();
}
//
// Check for invalid token position relative to current position.
//
if ( n.beginLine < curLine )
throw new IllegalStateException("at token \"" + n.tokenImage +
"\", n.beginLine = " + Integer.toString(n.beginLine) +
", curLine = " + Integer.toString(curLine));
else if ( n.beginLine == curLine && n.beginColumn < curColumn )
throw new IllegalStateException("at token \"" + n.tokenImage +
"\", n.beginColumn = " +
Integer.toString(n.beginColumn) + ", curColumn = " +
Integer.toString(curColumn));
//
// Move output "cursor" to proper location, then print the token
//
if ( curLine < n.beginLine ) {
curColumn = 1;
for ( ; curLine < n.beginLine; ++curLine )
out.print("
");
}
for ( ; curColumn < n.beginColumn; ++curColumn )
out.print(" ");
/*for (final String tag : tagQueue) {
out.print(tag);
}
tagQueue.clear();*/
printToken(n.tokenImage);
}
private void printToken(final String s) {
for ( int i = 0; i < s.length(); ++i ) {
if ( s.charAt(i) == '\n' ) {
++curLine;
curColumn = 1;
}
else
curColumn++;
out.print(s.charAt(i));
}
out.flush();
}
protected void addTag(final String tag) {
tagQueue.add(tag);
}
@Override
public void visit(final TypeDefName n) {
addTag(String.format("", n.f0.toString(), n.f0.toString()));
super.visit(n);
addTag("");
}
}