1 /* Generated By:JavaCC: Do not edit this line. ParseException.java Version 0.7pre6 */ 2 3 /** 4 * Redistribution and use of this software and associated documentation ("Software"), with or 5 * without modification, are permitted provided that the following conditions are met: 6 * 7 * 1. Redistributions of source code must retain copyright statements and notices. Redistributions 8 * must also contain a copy of this document. 9 * 10 * 2. Redistributions in binary form must reproduce the above copyright notice, this list of 11 * conditions and the following disclaimer in the documentation and/or other materials provided with 12 * the distribution. 13 * 14 * 3. The name "Exolab" must not be used to endorse or promote products derived from this Software 15 * without prior written permission of Intalio, Inc. For written permission, please contact 16 * info@exolab.org. 17 * 18 * 4. Products derived from this Software may not be called "Exolab" nor may "Exolab" appear in 19 * their names without prior written permission of Intalio, Inc. Exolab is a registered trademark of 20 * Intalio, Inc. 21 * 22 * 5. Due credit should be given to the Exolab Project (http://www.exolab.org/). 23 * 24 * THIS SOFTWARE IS PROVIDED BY INTALIO, INC. AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESSED OR 25 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 26 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTALIO, INC. OR ITS 27 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 29 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 30 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY 31 * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 * 33 * Copyright 2000 (C) Intalio Inc. All Rights Reserved. 34 * 35 * $Id$ 36 */ 37 38 package org.exolab.castor.xml.dtd.parser; 39 40 /** 41 * This exception is thrown when parse errors are encountered. You can explicitly create objects of 42 * this exception type by calling the method generateParseException in the generated parser. 43 * <p> 44 * You can modify this class to customize your error reporting mechanisms so long as you retain the 45 * public fields. 46 * 47 * @author Generated automatically by <b>JavaCC</b> 48 * @version Version 0.7pre6 49 */ 50 public class ParseException extends Exception { 51 /** SerialVersionUID */ 52 private static final long serialVersionUID = 5798523224831508600L; 53 54 /** 55 * This constructor is used by the method "generateParseException" in the generated parser. 56 * Calling this constructor generates a new object of this type with the fields "currentToken", 57 * "expectedTokenSequences", and "tokenImage" set. The boolean flag "specialConstructor" is also 58 * set to true to indicate that this constructor was used to create this object. This constructor 59 * calls its super class with the empty string to force the "toString" method of parent class 60 * "Throwable" to print the error message in the form: ParseException: <result of getMessage> 61 */ 62 public ParseException(Token currentTokenVal, int[][] expectedTokenSequencesVal, 63 String[] tokenImageVal) { 64 super(""); 65 specialConstructor = true; 66 currentToken = currentTokenVal; 67 expectedTokenSequences = expectedTokenSequencesVal; 68 tokenImage = tokenImageVal; 69 } 70 71 /** 72 * The following constructors are for use by you for whatever purpose you can think of. 73 * Constructing the exception in this manner makes the exception behave in the normal way - i.e., 74 * as documented in the class "Throwable". The fields "errorToken", "expectedTokenSequences", and 75 * "tokenImage" do not contain relevant information. The JavaCC generated code does not use these 76 * constructors. 77 */ 78 79 public ParseException() { 80 super(); 81 specialConstructor = false; 82 } 83 84 public ParseException(String message) { 85 super(message); 86 specialConstructor = false; 87 } 88 89 /** 90 * This variable determines which constructor was used to create this object and thereby affects 91 * the semantics of the "getMessage" method (see below). 92 */ 93 protected boolean specialConstructor; 94 95 /** 96 * This is the last token that has been consumed successfully. If this object has been created due 97 * to a parse error, the token followng this token will (therefore) be the first error token. 98 */ 99 public Token currentToken; 100 101 /** 102 * Each entry in this array is an array of integers. Each array of integers represents a sequence 103 * of tokens (by their ordinal values) that is expected at this point of the parse. 104 */ 105 public int[][] expectedTokenSequences; 106 107 /** 108 * This is a reference to the "tokenImage" array of the generated parser within which the parse 109 * error occurred. This array is defined in the generated ...Constants interface. 110 */ 111 public String[] tokenImage; 112 113 /** 114 * This method has the standard behavior when this object has been created using the standard 115 * constructors. Otherwise, it uses "currentToken" and "expectedTokenSequences" to generate a 116 * parse error message and returns it. If this object has been created due to a parse error, and 117 * you do not catch it (it gets thrown from the parser), then this method is called during the 118 * printing of the final stack trace, and hence the correct error message gets displayed. 119 */ 120 public String getMessage() { 121 if (!specialConstructor) { 122 return super.getMessage(); 123 } 124 String expected = ""; 125 int maxSize = 0; 126 for (int i = 0; i < expectedTokenSequences.length; i++) { 127 if (maxSize < expectedTokenSequences[i].length) { 128 maxSize = expectedTokenSequences[i].length; 129 } 130 for (int j = 0; j < expectedTokenSequences[i].length; j++) { 131 expected += tokenImage[expectedTokenSequences[i][j]] + " "; 132 } 133 if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) { 134 expected += "..."; 135 } 136 expected += eol + " "; 137 } 138 String retval = "Encountered \""; 139 Token tok = currentToken.next; 140 for (int i = 0; i < maxSize; i++) { 141 if (i != 0) 142 retval += " "; 143 if (tok.kind == 0) { 144 retval += tokenImage[0]; 145 break; 146 } 147 retval += add_escapes(tok.image); 148 tok = tok.next; 149 } 150 retval += "\" at line " + currentToken.next.beginLine + ", column " 151 + currentToken.next.beginColumn + "." + eol; 152 if (expectedTokenSequences.length == 1) { 153 retval += "Was expecting:" + eol + " "; 154 } else { 155 retval += "Was expecting one of:" + eol + " "; 156 } 157 retval += expected; 158 return retval; 159 } 160 161 /** 162 * The end of line string for this machine. 163 */ 164 protected String eol = System.getProperty("line.separator", "\n"); 165 166 /** 167 * Used to convert raw characters to their escaped version when these raw version cannot be used 168 * as part of an ASCII string literal. 169 */ 170 protected String add_escapes(String str) { 171 StringBuffer retval = new StringBuffer(); 172 char ch; 173 for (int i = 0; i < str.length(); i++) { 174 switch (str.charAt(i)) { 175 case 0: 176 continue; 177 case '\b': 178 retval.append("\\b"); 179 continue; 180 case '\t': 181 retval.append("\\t"); 182 continue; 183 case '\n': 184 retval.append("\\n"); 185 continue; 186 case '\f': 187 retval.append("\\f"); 188 continue; 189 case '\r': 190 retval.append("\\r"); 191 continue; 192 case '\"': 193 retval.append("\\\""); 194 continue; 195 case '\'': 196 retval.append("\\\'"); 197 continue; 198 case '\\': 199 retval.append("\\\\"); 200 continue; 201 default: 202 if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) { 203 String s = "0000" + Integer.toString(ch, 16); 204 retval.append("\\u" + s.substring(s.length() - 4, s.length())); 205 } else { 206 retval.append(ch); 207 } 208 continue; 209 } 210 } 211 return retval.toString(); 212 } 213 214 }