view src/plparser/PLCharScannerImpl.java @ 13:da8c1569b0c1

minor fix
author one
date Thu, 02 Sep 2010 18:39:15 +0900
parents 79d492bce828
children
line wrap: on
line source

package plparser;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.CharBuffer;

public abstract class PLCharScannerImpl<Node> extends PLScannerImpl<Node> {

	public CharBuffer cb;


	public PLCharScannerImpl(PLScanner<Node> plScannerImpl, Dictionary<Node> dict,
			Token<Node> nullToken) {
		super(plScannerImpl, dict, nullToken);
	}

	public PLCharScannerImpl() {
		}

	public Token<Node> lookupDict(CharBuffer w, TokenID id) {
		Token<Node> t;
		String s = w.flip().toString();
		if ((t = dict.get(s))==null) {
			dict.put(s, t = new Token<Node>(s,id));
		}
		return nextToken = t;
	}

	public char nextChar() {
		if (!cb.hasRemaining()) extendInput();
		char ch = cb.get();
		if (ch=='\n') lineno++;
		return ch;
	}

	@Override
	public boolean hasRemaining() {
		return cb.hasRemaining()||extendInput();
	}

	protected boolean extendInput() {
		if (file!=null && cb.position()!=0) {
			// move remaining data to the top, set position for next read
			cb.compact();
			try {
				if (prompt!=null) System.out.print(prompt);
				if (file.read(cb)>0) {
					cb.flip();    // prepare for get
					return true;
				} else {
					throw new IOException();
				}
			} catch (IOException e) {
				file = null ; 
				cb.flip();
			}
		}
		return false;
	}

	@Override
	public PLScanner<Node> set(String exp) {
		cb = CharBuffer.wrap(exp);
		filename = null; file = null;
		nextToken = nullToken;
		return this;
	}

	@Override
	public PLScanner<Node> setFile(String file) throws FileNotFoundException {
		this.filename = file;
		nextToken = nullToken;
		set(new FileReader(file));
		return this;
	}

	@Override
	public PLScanner<Node> set(InputStreamReader file) {
		this.file = file;
		cb = CharBuffer.allocate(BufferSize);
		try {
			if (prompt!=null) System.out.print(prompt);
			if (file.read(cb) <= 0) {
				throw new IOException();
			}
		} catch (IOException e) {
			file = null; cb = null;
			set("");
			return this;
		} finally {
			cb.flip();
		}
		lineno = 0;
		return this;
	}

}