1
2
3 /************************************************************************************************************************
4 * Copyright (c) Jonas Bonér, Alexandre Vasseur. All rights reserved. * http://aspectwerkz.codehaus.org *
5 * ---------------------------------------------------------------------------------- * The software in this package is
6 * published under the terms of the LGPL license * a copy of which has been included with this distribution in the
7 * license.txt file. *
8 **********************************************************************************************************************/
9 package org.codehaus.aspectwerkz.annotation.expression.ast;
10
11 public class TokenMgrError extends Error {
12
13
14
15
16 /***
17 * Lexical error occured.
18 */
19 static final int LEXICAL_ERROR = 0;
20
21 /***
22 * An attempt wass made to create a second instance of a static token manager.
23 */
24 static final int STATIC_LEXER_ERROR = 1;
25
26 /***
27 * Tried to change to an invalid lexical state.
28 */
29 static final int INVALID_LEXICAL_STATE = 2;
30
31 /***
32 * Detected (and bailed out of) an infinite loop in the token manager.
33 */
34 static final int LOOP_DETECTED = 3;
35
36 /***
37 * Indicates the reason why the exception is thrown. It will have one of the above 4 values.
38 */
39 int errorCode;
40
41
42
43
44 public TokenMgrError() {
45 }
46
47 public TokenMgrError(String message, int reason) {
48 super(message);
49 errorCode = reason;
50 }
51
52 public TokenMgrError(boolean EOFSeen,
53 int lexState,
54 int errorLine,
55 int errorColumn,
56 String errorAfter,
57 char curChar,
58 int reason) {
59 this(LexicalError(EOFSeen, lexState, errorLine, errorColumn, errorAfter, curChar), reason);
60 }
61
62 /***
63 * Replaces unprintable characters by their espaced (or unicode escaped) equivalents in the given string
64 */
65 protected static final String addEscapes(String str) {
66 StringBuffer retval = new StringBuffer();
67 char ch;
68 for (int i = 0; i < str.length(); i++) {
69 switch (str.charAt(i)) {
70 case 0:
71 continue;
72 case '\b':
73 retval.append("//b");
74 continue;
75 case '\t':
76 retval.append("//t");
77 continue;
78 case '\n':
79 retval.append("//n");
80 continue;
81 case '\f':
82 retval.append("//f");
83 continue;
84 case '\r':
85 retval.append("//r");
86 continue;
87 case '\"':
88 retval.append("//\"");
89 continue;
90 case '\'':
91 retval.append("//\'");
92 continue;
93 case '//':
94 retval.append("////");
95 continue;
96 default:
97 if (((ch = str.charAt(i)) < 0x20) || (ch > 0x7e)) {
98 String s = "0000" + Integer.toString(ch, 16);
99 retval.append("//u" + s.substring(s.length() - 4, s.length()));
100 } else {
101 retval.append(ch);
102 }
103 continue;
104 }
105 }
106 return retval.toString();
107 }
108
109 /***
110 * Returns a detailed message for the Error when it is thrown by the token manager to indicate a lexical error.
111 * Parameters : EOFSeen : indicates if EOF caused the lexicl error curLexState : lexical state in which this error
112 * occured errorLine : line number when the error occured errorColumn : column number when the error occured
113 * errorAfter : prefix that was seen before this error occured curchar : the offending character Note: You can
114 * customize the lexical error message by modifying this method.
115 */
116 protected static String LexicalError(
117 boolean EOFSeen,
118 int lexState,
119 int errorLine,
120 int errorColumn,
121 String errorAfter,
122 char curChar) {
123 return ("Lexical error at line "
124 + errorLine
125 + ", column "
126 + errorColumn
127 + ". Encountered: "
128 + (EOFSeen
129 ? "<EOF> "
130 : (("\"" + addEscapes(String.valueOf(curChar)) + "\"") + " (" + (int) curChar + "), "))
131 + "after : \""
132 + addEscapes(errorAfter) + "\"");
133 }
134
135 /***
136 * You can also modify the body of this method to customize your error messages. For example, cases like
137 * LOOP_DETECTED and INVALID_LEXICAL_STATE are not of end-users concern, so you can return something like :
138 * <p/>"Internal Error : Please file a bug report .... " <p/>from this method for such cases in the release version
139 * of your parser.
140 */
141 public String getMessage() {
142 return super.getMessage();
143 }
144 }