import pascal.PascalNonterminals;

import rebelsky.compiler.misc.Checker;
import rebelsky.compiler.misc.Traverser;
import rebelsky.compiler.parser.Node;
import rebelsky.compiler.types.Type;

/**
 * A traverser that prints every node.  Typed nodes also get their types.
 *
 * @author Samuel A. Rebelsky
 * @version 1.0 of April 2004
 */
public class PrintTyped
  extends Traverser
{
  String indent = "";

  public PrintTyped()
  {
    this.setDefault(new Checker() {
      public void check(Traverser t, Node n) 
        throws Exception
      {
        if (n == null)
          System.out.println(indent + "<>");
        else {
          Object type = n.getAttribute("type");
          if (type == null)
            System.out.println(indent + n.getSymbol());
          else
            System.out.println(indent + n.getSymbol() + ": " + type);
          indent = indent + "  ";
          int numchildren = n.numChildren();
          for (int i = 0; i < numchildren; i++)
            t.traverse(n.getChild(i));
          indent = indent.substring(2);
        } // not null
      } // check(Traverser, Node)
    });
  } // PrintTyped()
} // class PrintTyped

