package typer;
import java.util.LinkedList;
import java.util.Stack;
import typer.analysis.DepthFirstAdapter;
import typer.node.AArrowType;
import typer.node.ABoolType;
import typer.node.AIntType;
import typer.node.ATupleType;
import typer.node.AUnitType;
import typing.ArrowType;
import typing.PrimitiveType;
import typing.TupleType;
import typing.MonoType;
public class Translator extends DepthFirstAdapter {
public Translator() {
this.types = new Stack<MonoType>();
}
public void outAArrowType(AArrowType node) {
MonoType t2 = this.types.pop();
MonoType t1 = this.types.pop();
this.types.push(new ArrowType (t1, t2));
}
public void outABoolType(ABoolType node) {
types.push(PrimitiveType.BOOL);
}
public void outAIntType(AIntType node) {
types.push(PrimitiveType.INT);
}
public void outATupleType(ATupleType node) {
LinkedList typeList = node.getType();
MonoType[] types = new MonoType [typeList.size()];
for (int i=types.length-1; i>=0; i--) {
types [i] = this.types.pop();
}
this.types.push(new TupleType (types));
}
public void outAUnitType(AUnitType node) {
types.push(PrimitiveType.UNIT);
}
public MonoType getType () {
assert (this.types.size() == 1);
return this.types.get(0);
}
private Stack<MonoType> types;
}