Newer
Older
zweic / sources / zweic / Printer-partial.scala
/*  zweic -- a compiler for Zwei
 *
 *  Stephane Micheloud & LAMP
 *
 *  $Id$
 */

package zweic;

import java.io.PrintWriter;


/**
 * This class implements a pretty printer for abstract syntax
 * trees in Zwei.
 */
class Printer(out: PrintWriter) {
  import Operators._;

  /**
   * Indentation string.
   */
  private val step = "  ";

  /**
   * indentation level.
   */
  private var level = 0;

  /**
   * Prints a tree node.
   */
  def print(tree: Tree): Printer = tree match {
    case Program(decls, main) =>
      for (val d <- decls)
        print(d).println;
      print(main).println
    // ... à compléter ...
    case Select(prefix, selector) =>
      print(prefix).print(".").print(selector)
  }

  /**
   * Print abstract syntax trees separated by commas.
   */
  private def print(trees: List[Tree]): Printer = trees match {
    // ... à compléter ...
    case _ => this
  }

  /**
   * Print a string.
   */
  private def print(value: String): Printer = {
    out.print(value);
    this
  }

  private def print(name: Name): Printer = print(name.name);

  private def print(formal: Pair[Name, TypeTree]): Printer =
    print(formal._2).print(" ").print(formal._1);

  /**
   * Print abstract syntax trees separated by commas.
   */
  private def printFormals(formals: List[Pair[Name, TypeTree]]): Printer =
    formals match {
      // ... à compléter ...
      case _ => this
    }

  /**
   * Print an end-of-line character and indent the following
   * line appropriately.
   */
  private def println = {
    out.println();
    for (val i <- List.range(0, level)) out.print(step);
    this
  }

  /**
   * Increment the indentation level.
   */
  private def indent = {
    level = level + 1;
    this
  }

  /**
   * Decrement the indentation level.
   */
  private def undent = {
    level = level - 1;
    this
  }
}