// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.javacc; import java.io.IOException; /** * @author Simon Thoresen Hult */ public class FastCharStream { private static final String JAVACC_EXCEPTION_FORMAT = "line -1, column "; private static final IOException EOF = new IOException(); private final String inputStr; private final char[] inputArr; private int tokenPos = 0; private int readPos = 0; private int tabSize = 1; private boolean trackLineColumn = true; public FastCharStream(String input) { this.inputStr = input; this.inputArr = input.toCharArray(); } public char readChar() throws IOException { if (readPos >= inputArr.length) { throw EOF; } return inputArr[readPos++]; } public int getEndColumn() { return readPos + 1; } public int getEndLine() { return -1; // indicate unset } public int getBeginColumn() { return tokenPos + 1; } public int getBeginLine() { return -1; // indicate unset } public void backup(int amount) { readPos -= amount; } public char beginToken() throws IOException { tokenPos = readPos; return readChar(); } public String getImage() { return inputStr.substring(tokenPos, readPos); } @SuppressWarnings("UnusedParameters") public char[] getSuffix(int len) { throw new UnsupportedOperationException(); } public void done() { } public void setTabSize(int i) { tabSize = i; } public int getTabSize() { return tabSize; } public void setTrackLineColumn(boolean tlc) { trackLineColumn = tlc; } public boolean isTrackLineColumn() { return trackLineColumn; } public String formatException(String parseException) { int errPos = findErrPos(parseException); if (errPos < 0 || errPos > inputArr.length + 1) { return parseException; } int errLine = 0; int errColumn = 0; for (int i = 0; i < errPos - 1; ++i) { if (inputStr.charAt(i) == '\n') { ++errLine; errColumn = 0; } else { ++errColumn; } } StringBuilder out = new StringBuilder(); out.append(parseException.replace(JAVACC_EXCEPTION_FORMAT + errPos, "line " + (errLine + 1) + ", column " + (errColumn + 1))); out.append("\nAt position:\n"); appendErrorPosition(errLine, out); for (int i = 0; i < errColumn; ++i) { out.append(" "); } out.append("^"); return out.toString(); } private void appendErrorPosition(int errLine, StringBuilder out) { String[] inputStrLines = inputStr.split("\n"); if (inputStrLines.length