duke@1: /* jjg@1358: * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. duke@1: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. duke@1: * duke@1: * This code is free software; you can redistribute it and/or modify it duke@1: * under the terms of the GNU General Public License version 2 only, as ohair@554: * published by the Free Software Foundation. Oracle designates this duke@1: * particular file as subject to the "Classpath" exception as provided ohair@554: * by Oracle in the LICENSE file that accompanied this code. duke@1: * duke@1: * This code is distributed in the hope that it will be useful, but WITHOUT duke@1: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or duke@1: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License duke@1: * version 2 for more details (a copy is included in the LICENSE file that duke@1: * accompanied this code). duke@1: * duke@1: * You should have received a copy of the GNU General Public License version duke@1: * 2 along with this work; if not, write to the Free Software Foundation, duke@1: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. duke@1: * ohair@554: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ohair@554: * or visit www.oracle.com if you need additional information or have any ohair@554: * questions. duke@1: */ duke@1: duke@1: package com.sun.tools.javac.parser; duke@1: duke@1: import java.nio.*; mcimadamore@1144: import java.util.List; mcimadamore@1144: import java.util.ArrayList; duke@1: mcimadamore@1113: import com.sun.tools.javac.util.Position.LineMap; mcimadamore@1113: import com.sun.tools.javac.parser.JavaTokenizer.*; duke@1: mcimadamore@1113: import static com.sun.tools.javac.parser.Tokens.*; duke@1: duke@1: /** The lexical analyzer maps an input stream consisting of duke@1: * ASCII characters and Unicode escapes into a token sequence. duke@1: * jjg@581: *

This is NOT part of any supported API. jjg@581: * If you write code that depends on this, you do so at your own risk. duke@1: * This code and its internal interfaces are subject to change or duke@1: * deletion without notice. duke@1: */ duke@1: public class Scanner implements Lexer { duke@1: mcimadamore@1113: private Tokens tokens; duke@1: duke@1: /** The token, set by nextToken(). duke@1: */ duke@1: private Token token; duke@1: mcimadamore@1113: /** The previous token, set by nextToken(). duke@1: */ mcimadamore@1113: private Token prevToken; duke@1: mcimadamore@1144: /** Buffer of saved tokens (used during lookahead) mcimadamore@1144: */ mcimadamore@1144: private List savedTokens = new ArrayList(); mcimadamore@1144: mcimadamore@1113: private JavaTokenizer tokenizer; duke@1: /** duke@1: * Create a scanner from the input array. This method might duke@1: * modify the array. To avoid copying the input array, ensure duke@1: * that {@code inputLength < input.length} or duke@1: * {@code input[input.length -1]} is a white space character. duke@1: * duke@1: * @param fac the factory which created this Scanner jjg@1358: * @param buf the input, might be modified duke@1: * Must be positive and less than or equal to input.length. duke@1: */ mcimadamore@1113: protected Scanner(ScannerFactory fac, CharBuffer buf) { mcimadamore@1113: this(fac, new JavaTokenizer(fac, buf)); duke@1: } duke@1: mcimadamore@1113: protected Scanner(ScannerFactory fac, char[] buf, int inputLength) { mcimadamore@1113: this(fac, new JavaTokenizer(fac, buf, inputLength)); duke@1: } duke@1: mcimadamore@1113: protected Scanner(ScannerFactory fac, JavaTokenizer tokenizer) { mcimadamore@1113: this.tokenizer = tokenizer; mcimadamore@1113: tokens = fac.tokens; mcimadamore@1113: token = prevToken = DUMMY; duke@1: } duke@1: duke@1: public Token token() { mcimadamore@1144: return token(0); duke@1: } duke@1: mcimadamore@1144: public Token token(int lookahead) { mcimadamore@1144: if (lookahead == 0) { mcimadamore@1144: return token; mcimadamore@1144: } else { mcimadamore@1144: ensureLookahead(lookahead); mcimadamore@1144: return savedTokens.get(lookahead - 1); mcimadamore@1144: } mcimadamore@1144: } mcimadamore@1144: //where mcimadamore@1144: private void ensureLookahead(int lookahead) { mcimadamore@1144: for (int i = savedTokens.size() ; i < lookahead ; i ++) { mcimadamore@1144: savedTokens.add(tokenizer.readToken()); mcimadamore@1144: } mcimadamore@1144: } mcimadamore@1144: mcimadamore@1113: public Token prevToken() { mcimadamore@1113: return prevToken; duke@1: } duke@1: mcimadamore@1113: public void nextToken() { mcimadamore@1113: prevToken = token; mcimadamore@1144: if (!savedTokens.isEmpty()) { mcimadamore@1144: token = savedTokens.remove(0); mcimadamore@1144: } else { mcimadamore@1144: token = tokenizer.readToken(); mcimadamore@1144: } duke@1: } duke@1: mcimadamore@1113: public Token split() { mcimadamore@1113: Token[] splitTokens = token.split(tokens); mcimadamore@1113: prevToken = splitTokens[0]; mcimadamore@1113: token = splitTokens[1]; mcimadamore@1113: return token; duke@1: } duke@1: mcimadamore@1113: public LineMap getLineMap() { mcimadamore@1113: return tokenizer.getLineMap(); duke@1: } duke@1: duke@1: public int errPos() { mcimadamore@1113: return tokenizer.errPos(); duke@1: } duke@1: duke@1: public void errPos(int pos) { mcimadamore@1113: tokenizer.errPos(pos); duke@1: } duke@1: }