package rpn;

import rpn.Calculator;
import rpn.basic.Item;
import rpn.basic.EOFItem;

/** ItemInputs interpret character input to make up semantics. 
    They do this in the tokenToItem() routine. */

public class ItemInput extends ItemStream implements SimpleToken {
	// The calculator ca is used only to construct items
	public Calculator ca = null;
	public Input in;
	Item buffer = null;
	ItemInterpreter interpreter;
	
	public ItemInput(ItemInterpreter interpreter) {
		this.interpreter = interpreter;
		ca = null; in = null;
	}
	
	public ItemInput(ItemInterpreter interpreter, 
			Input in) {
		this.interpreter = interpreter;
		this.in = in;
	}
	
	public ItemInput(ItemInterpreter interpreter, 
			Calculator ca, 
			Input in) {
		this.interpreter = interpreter;
		this.ca = ca;
		this.in = in;
	}
	
	// Don't need to set ca until Items are to be interpreted
	public void setCalculator(Calculator ca) {
		this.ca = ca;
	}
	
	// Don't need to set in until Items are to be interpreted
	public void setInput(Input in) {
		this.in = in;
	}
	
	public Item getItem() {
		if (buffer != null) {
			Item it = buffer;
			buffer = null;
			return(it);
		} else {
			Item it = null;
			do {
				it = interpreter.getItem(ca, in);
			} while (it == null);
			return(it);
		}
	}
	
	public Item peek() {
		if (buffer != null) {
			return(buffer);
		} else {
			Item it = null;
			do {
				it = interpreter.getItem(ca, in);
			} while (it == null);
			buffer = it;
			return(buffer);
		}
	}
	
	public boolean atEOF() {
		return(peek() instanceof EOFItem);
	}
	
	public String toString() {
		return("<item input>");
	}
}