Mercurial > hg > Members > kono > PLparser
view src/plparser/PLCharScannerImpl.java @ 11:79d492bce828
clean up
author | one |
---|---|
date | Thu, 02 Sep 2010 11:55:56 +0900 |
parents | |
children | da8c1569b0c1 |
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() { super(); } 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; } }