view src/plparser/PLScannerImpl.java @ 7:619472ca4742

Refactoring for multiple implementation of scanner
author one
date Wed, 01 Sep 2010 15:23:37 +0900
parents
children 79d492bce828
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;

	public PLScannerImpl() {
		super();
	}

	public PLScannerImpl(PLScannerImpl<Node> plScannerImpl,
			Dictionary<Node> dict, Token<Node> nullToken) {
		this.dict = dict; 
		this.nullToken = nullToken;
	}


	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;
	}

}