001 002 003 /* Generated By:JavaCC: Do not edit this line. TokenMgrError.java Version 0.7pre2 */ 004 package lapis.parsers; 005 006 public class TokenMgrError extends RuntimeException 007 { 008 /* 009 * Ordinals for various reasons why an Error of this type can be thrown. 010 */ 011 012 /** 013 * Lexical error occured. 014 */ 015 static final int LEXICAL_ERROR = 0; 016 017 /** 018 * An attempt wass made to create a second instance of a static token manager. 019 */ 020 static final int STATIC_LEXER_ERROR = 1; 021 022 /** 023 * Tried to change to an invalid lexical state. 024 */ 025 static final int INVALID_LEXICAL_STATE = 2; 026 027 /** 028 * Detected (and bailed out of) an infinite loop in the token manager. 029 */ 030 static final int LOOP_DETECTED = 3; 031 032 /** 033 * Indicates the reason why the exception is thrown. It will have 034 * one of the above 4 values. 035 */ 036 int errorCode; 037 038 /** 039 * Replaces unprintable characters by their espaced (or unicode escaped) 040 * equivalents in the given string 041 */ 042 protected static final String addEscapes(String str) { 043 StringBuffer retval = new StringBuffer(); 044 char ch; 045 for (int i = 0; i < str.length(); i++) { 046 switch (str.charAt(i)) 047 { 048 case 0 : 049 continue; 050 case '\b': 051 retval.append("\\b"); 052 continue; 053 case '\t': 054 retval.append("\\t"); 055 continue; 056 case '\n': 057 retval.append("\\n"); 058 continue; 059 case '\f': 060 retval.append("\\f"); 061 continue; 062 case '\r': 063 retval.append("\\r"); 064 continue; 065 case '\"': 066 retval.append("\\\""); 067 continue; 068 case '\'': 069 retval.append("\\\'"); 070 continue; 071 case '\\': 072 retval.append("\\\\"); 073 continue; 074 default: 075 if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) { 076 String s = "0000" + Integer.toString(ch, 16); 077 retval.append("\\u" + s.substring(s.length() - 4, s.length())); 078 } else { 079 retval.append(ch); 080 } 081 continue; 082 } 083 } 084 return retval.toString(); 085 } 086 087 /** 088 * Returns a detailed message for the Error when it is thrown by the 089 * token manager to indicate a lexical error. 090 * Parameters : 091 * EOFSeen : indicates if EOF caused the lexicl error 092 * curLexState : lexical state in which this error occured 093 * errorLine : line number when the error occured 094 * errorColumn : column number when the error occured 095 * errorAfter : prefix that was seen before this error occured 096 * curchar : the offending character 097 * Note: You can customize the lexical error message by modifying this method. 098 */ 099 private static final String LexicalError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar) { 100 return("Lexical error at line " + 101 errorLine + ", column " + 102 errorColumn + ". Encountered: " + 103 (EOFSeen ? "<EOF> " : ("\"" + addEscapes(String.valueOf(curChar)) + "\"") + " (" + (int)curChar + "), ") + 104 "after : \"" + addEscapes(errorAfter) + "\""); 105 } 106 107 /** 108 * You can also modify the body of this method to customize your error messages. 109 * For example, cases like LOOP_DETECTED and INVALID_LEXICAL_STATE are not 110 * of end-users concern, so you can return something like : 111 * 112 * "Internal Error : Please file a bug report .... " 113 * 114 * from this method for such cases in the release version of your parser. 115 */ 116 public String getMessage() { 117 return super.getMessage(); 118 } 119 120 /* 121 * Constructors of various flavors follow. 122 */ 123 124 public TokenMgrError() { 125 } 126 127 public TokenMgrError(String message, int reason) { 128 super(message); 129 errorCode = reason; 130 } 131 132 public TokenMgrError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar, int reason) { 133 this(LexicalError(EOFSeen, lexState, errorLine, errorColumn, errorAfter, curChar), reason); 134 } 135 }