001 /* 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 package org.apache.commons.jexl2.parser; 018 019 /** 020 * Token Manager Error. 021 */ 022 public class TokenMgrError extends Error { 023 /** 024 * The version identifier for this Serializable class. 025 * Increment only if the <i>serialized</i> form of the 026 * class changes. 027 */ 028 private static final long serialVersionUID = 1L; 029 030 /* 031 * Ordinals for various reasons why an Error of this type can be thrown. 032 */ 033 /** 034 * Lexical error occurred. 035 */ 036 public static final int LEXICAL_ERROR = 0; 037 /** 038 * An attempt was made to create a second instance of a static token manager. 039 */ 040 public static final int STATIC_LEXER_ERROR = 1; 041 /** 042 * Tried to change to an invalid lexical state. 043 */ 044 public static final int INVALID_LEXICAL_STATE = 2; 045 /** 046 * Detected (and bailed out of) an infinite loop in the token manager. 047 */ 048 public static final int LOOP_DETECTED = 3; 049 /** 050 * Indicates the reason why the exception is thrown. It will have 051 * one of the above 4 values. 052 */ 053 private int errorCode; 054 /** 055 * The lexer state. 056 */ 057 @SuppressWarnings("unused") // not read currently 058 private int state; 059 /** 060 * The current character. 061 */ 062 private char current; 063 /** 064 * Last correct input before error occurs. 065 */ 066 private String after; 067 /** 068 * 069 */ 070 private boolean eof; 071 /** 072 * Error line. 073 */ 074 private int line; 075 /** 076 * Error column. 077 */ 078 private int column; 079 080 /** 081 * Gets the reason why the exception is thrown. 082 * @return one of the 4 lexical error codes 083 */ 084 public int getErrorCode() { 085 return errorCode; 086 } 087 088 /** 089 * Gets the line number. 090 * @return line number. 091 */ 092 public int getLine() { 093 return line; 094 } 095 096 /** 097 * Gets the column number. 098 * @return the column. 099 */ 100 public int getColumn() { 101 return column; 102 } 103 104 /** 105 * Gets the last correct input. 106 * @return the string after which the error occured 107 */ 108 public String getAfter() { 109 return after; 110 } 111 112 113 /** 114 * Returns a detailed message for the Error when it is thrown by the 115 * token manager to indicate a lexical error. 116 * @return the message 117 */ 118 @Override 119 public String getMessage() { 120 return ("Lexical error at line " 121 + line + ", column " 122 + column + ". Encountered: " 123 + (eof ? "<EOF> " 124 : (StringParser.escapeString(String.valueOf(current), '"')) + " (" + (int) current + "), ") 125 + "after : " + StringParser.escapeString(after, '"')); 126 } 127 128 129 /** Constructor with message and reason. */ 130 public TokenMgrError(String message, int reason) { 131 super(message); 132 errorCode = reason; 133 } 134 135 /** Full Constructor. */ 136 public TokenMgrError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar, int reason) { 137 eof = EOFSeen; 138 state = lexState; 139 line = errorLine; 140 column = errorColumn; 141 after = errorAfter; 142 current = curChar; 143 errorCode = reason; 144 } 145 }