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