view src/plparser/PLScannerImpl.java @ 11:79d492bce828

clean up
author one
date Thu, 02 Sep 2010 11:55:56 +0900
parents 619472ca4742
children
line wrap: on
line source

package plparser;

import java.io.FileReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Iterator;

public abstract class PLScannerImpl<Node> implements PLScanner<Node> {

	public int lineno;
	public Token<Node> nextToken;
	public Dictionary<Node> dict;
	public PLScanner<Node> next;
	public InputStreamReader file;
	public String filename;
	public PLScanner<Node> prev;
	public Token<Node> nullToken;
	public String prompt;
	public static final int BufferSize = 4096;

	/**
	 * Construtor for push Scanner
	 * @param p previous scanner
	 * @param dict dictionary
	 * @param nullToken shared null token
	 */
	public PLScannerImpl(PLScanner<Node> p,
			Dictionary<Node> dict, Token<Node> nullToken) {
		this.prev = p;
		this.dict = dict; 
		this.nullToken = nullToken;
	}

	
	public PLScannerImpl() {
		this.dict = new Dictionary<Node>();
		this.nullToken = new Token<Node>("",TokenID.NULL);
		this.prev = null;
	}


	public PLScanner<Node> popScanner() {
		return prev;
	}

	private PLScanner<Node> findFileName() {
		for(PLScanner<Node> s = this;s!=null ; s = s.prev()) {
			if (s.filename()!=null) return s;
		}
		return null;
	}
	/*
	 * Read From String
	 */

	public void error(String err) {
		PLScanner<Node> s = findFileName();
		if (s!=null) {
			System.err.print(s.filename()+":"+s.lineno()+": ");
		}
		System.err.println("error: "+err);
	}

	public Iterable<Token<Node>> scanToken(String exp) {
		set(exp);
		return iterator();
	}

	public Iterable<Token<Node>> scanToken(FileReader file) {
		set(file);
		return iterator();
	}

	private Iterable<Token<Node>> iterator() {
		return new Iterable<Token<Node>>() {
			public Iterator<Token<Node>> iterator() {
				return new Iterator<Token<Node>>() {
					public boolean hasNext() {
						return hasRemaining();
					}
					public Token<Node> next() {
						return nextToken();
					}
					public void remove() {
					}
				};
			}
		};
	}

	public PLScanner<Node> setFile(InputStream newfile, String prompt) {
		this.filename = newfile.toString();
		nextToken = nullToken;
		this.prompt = prompt;
		set(new InputStreamReader(newfile));
		return this;
	}

	@Override
	public String filename() {
		return filename;
	}

	@Override
	public int lineno() {
		return lineno;
	}

	@Override
	public PLScanner<Node> prev() {
		return prev;
	}

	public Dictionary<Node> dictionary() {
		return dict;
	}

}