package code.loop.parser;

import java.util.Vector;

/**
 *  This class implements a printer of an Ast object
 *  to help understanding its structure and content.
 *
 *@author   Sergio Antoy
 *@since    August 28, 2004
 */
public class AstPrinter implements AstVisitor {

    public Object visit(Ast.Term t, Object o) {
        System.err.print("Term(");
        t.expr.accept(this,null);
        System.err.print(",");
        printVector(t.wt.variableList);
        System.err.println(")");
        return null;
    }

    public Object visit(Ast.IfExpr t, Object o) {
        System.err.print("IfExpr(");
        t.e1.accept(this,null);
        System.err.print(",");
        t.e2.accept(this,null);
        System.err.print(",");
        t.e3.accept(this,null);
        System.err.print(")");
        return null;
    }

    public Object visit(Ast.InfixOperation t, Object o) {
        System.err.print("InfixOperation(");
        t.e1.accept(this,null);
        System.err.print(","+t.infixId+",");
        t.e2.accept(this,null);
        System.err.print(")");
        return null;
    }

    public Object visit(Ast.FunctionExpr t, Object o) {
        System.err.print("FunctionExpr(");
        printVector(t.basics);
        System.err.print(")");
        return null;
    }

    public Object visit(Ast.Uminus t, Object o) {
        System.err.print("Uminus(");
        t.e.accept(this,null);
        System.err.print(")");
        return null;
    }

    public Object visit(Ast.PrefixId t, Object o) {
        System.err.print("PrefixId("+t.id+")");
        return null;
    }

    public Object visit(Ast.InfixId t, Object o) {
        System.err.print("InfixId("+t.id+")");
        return null;
    }

    public Object visit(Ast.ParenExpr t, Object o) {
        System.err.print("ParenExpr(");
        t.e.accept(this,null);
        System.err.print(")");
        return null;
    }

    public Object visit(Ast.LeftSection t, Object o) {
        System.err.print("LeftSection(");
        t.e.accept(this,null);
        System.err.print(","+t.infixId+")");
        return null;
    }

    public Object visit(Ast.RightSection t, Object o) {
        System.err.print("RightSection("+t.infixId+",");
        t.e.accept(this,null);
        System.err.print(")");
        return null;
    }

    public Object visit(Ast.IntLit t, Object o) {
        System.err.print("IntLit("+t.i+")");

        return null;
    }

    public Object visit(Ast.CharLit t, Object o) {
        System.err.print("IntLit('"+t.c+"')");
        return null;
    }

    public Object visit(Ast.StringLit t, Object o) {
        System.err.print("StringLit(\""+t.s+"\")");
        return null;
    }

    public Object visit(Ast.FloatLit t, Object o) {
        System.err.print("FloatLit("+t.f+")");
        return null;
    }

    public Object visit(Ast.List t, Object o) {
        System.err.print("List(");
        printVector(t.listListing);
        System.err.print(")");
        return null;
    }

    public Object visit(Ast.Tuple t, Object o) {
        System.err.print("Tuple(");
        printVector(t.tupleListing);
        System.err.print(")");
        return null;
    }

    public Object visit(Ast.ArithSeq t, Object o) {
        System.err.print("ArithSeq(");
        t.from.accept(this,null);
        System.err.print(",");
        t.then.accept(this,null);
        System.err.print(",");
        t.to.accept(this,null);
        System.err.print(")");
        return null;
    }

    private void printVector(Vector v) {
        System.err.print("[");
        for (int i=0; i<v.size();i++) {
            Ast.Expr e = (Ast.Expr) v.elementAt(i);
            e.accept(this,null);
            if (i<v.size()-1) System.err.print(",");
        }
        System.err.print("]");
    }

}
