package mireka.address.parser.base; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; public class CharScanner { private final String input; private int index = 0; private int currentChar; private int currentSpelling; private LinkedList<CharToken> pushBackBuffer = new LinkedList<CharToken>(); public CharScanner(String input) { this.input = input; // store first char if (input.isEmpty()) currentChar = -1; else currentChar = input.charAt(0); } public CharToken scan() { if (!pushBackBuffer.isEmpty()) { CharToken result = pushBackBuffer.removeFirst(); return result; } int position = index; takeIt(); CharToken result = new CharToken(currentSpelling, position); return result; } public String peekString(int length) { StringBuilder buffer = new StringBuilder(); List<CharToken> charTokens = new ArrayList<CharToken>(); for (int i = 0; i < length; i++) { CharToken charToken = scan(); charTokens.add(charToken); if (charToken.ch == -1) break; else buffer.append((char) charToken.ch); } pushBack(charTokens); return buffer.toString(); } private void takeIt() { currentSpelling = currentChar; index++; if (index < input.length()) currentChar = input.charAt(index); else currentChar = -1; } public void pushBack(Token token) { pushBack(token.getSpellingTokens()); } private void pushBack(List<CharToken> charTokens) { pushBackBuffer.addAll(0, charTokens); } }