/*
 * Created on 27.10.2003
 *
 */
package local.purelisp.eval;

import java.util.Vector;

import local.purelisp.analysis.DepthFirstAdapter;
import local.purelisp.eval.errors.LError;
import local.purelisp.node.AConstail;
import local.purelisp.node.ADotlistExp;
import local.purelisp.node.AGoal;
import local.purelisp.node.AIntExp;
import local.purelisp.node.AListExp;
import local.purelisp.node.AQuoteExp;
import local.purelisp.node.AStringExp;
import local.purelisp.node.ASymbolExp;
import local.purelisp.node.Node;
import local.purelisp.node.Start;

/**
 * @author god
 *
 */
public class TreeBuilder extends DepthFirstAdapter {
	public void set(Node node, LObj obj) {
		setIn(node, obj);	
	}

	public LObj get(Node node) {
		return (LObj)getIn(node);
	}
	
	public void outAGoal(AGoal node) {
		super.outAGoal(node);
		set(node, get(node.getExp()));
	}

	public void outAListExp(AListExp node) {
		Object el[];
		Vector list;
		int i;
		
		super.outAListExp(node);
		el = node.getExp().toArray();
		list = new Vector(el.length);
		for (i = 0; i < el.length; ++ i) {
			list.add(get((Node)el[i]));			
		}
		set(node, ConsCell.buildWList(list));
	}

	public void outASymbolExp(ASymbolExp node) {
		super.outASymbolExp(node);
		set(node, Symbol.get(node.getIdent().getText()));
	}

	public void outStart(Start node) {
		super.outStart(node);
		set(node, get(node.getPGoal()));
	}

	public void outADotlistExp(ADotlistExp node) {
		Object el[];
		Vector list;
		int i;
		
		super.outADotlistExp(node);
		el = node.getExp().toArray();
		list = new Vector(el.length);
		for (i = 0; i < el.length; ++ i) {
			list.add(get((Node)el[i]));			
		}
		set(node, ConsCell.buildList(list, get(node.getConstail())));
	}

	public void outAConstail(AConstail node) {
		set(node, get(node.getExp()));
	}

	public void outAIntExp(AIntExp node) {
		try {
			set(node, LInt.parse(node.getIntegerConstant().getText()));
		} catch(LError lerr) {
			set(node, Bot.getBot());
		}
	}
	public void outAQuoteExp(AQuoteExp node) {
		set(node, new ConsCell(quote, new ConsCell(get(node.getExp()), nil)));
	}
	public void outAStringExp(AStringExp node) {
		super.outAStringExp(node);
		set(node, LString.parse(node.getStringConstant().getText()));
	}
	private LObj nil = Nil.getNil();
	private LObj quote = Symbol.get("quote");
}
