1 2 3 6 7 package polyglot.ext.jl.parse; 8 9 import java_cup.runtime.Symbol; 10 import polyglot.lex.Lexer; 11 import polyglot.lex.*; 12 import polyglot.util.Position; 13 import polyglot.util.ErrorQueue; 14 import polyglot.util.ErrorInfo; 15 import java.util.HashMap ; 16 import java.math.BigInteger ; 17 18 19 25 public class Lexer_c implements Lexer { 26 27 28 final public static int YYEOF = -1; 29 30 31 final private static int YY_BUFFERSIZE = 16384; 32 33 34 final public static int END_OF_LINE_COMMENT = 4; 35 final public static int STRING = 1; 36 final public static int YYINITIAL = 0; 37 final public static int CHARACTER = 2; 38 final public static int TRADITIONAL_COMMENT = 3; 39 40 43 final private static String yycmap_packed = 44 "\11\5\1\3\1\1\1\0\1\3\1\2\16\5\4\0\1\3\1\50"+ 45 "\1\23\1\0\1\4\1\60\1\54\1\22\1\35\1\36\1\21\1\56"+ 46 "\1\44\1\15\1\13\1\20\1\6\3\17\4\12\2\7\1\53\1\43"+ 47 "\1\47\1\45\1\46\1\52\1\0\3\11\1\63\1\14\1\62\5\4"+ 48 "\1\61\13\4\1\10\2\4\1\41\1\16\1\42\1\57\1\4\1\0"+ 49 "\1\31\1\64\1\11\1\63\1\27\1\30\5\4\1\32\1\4\1\34"+ 50 "\3\4\1\25\1\33\1\24\1\26\2\4\1\10\2\4\1\37\1\55"+ 51 "\1\40\1\51\41\5\2\0\4\4\4\0\1\4\12\0\1\4\4\0"+ 52 "\1\4\5\0\27\4\1\0\37\4\1\0\u0128\4\2\0\22\4\34\0"+ 53 "\136\4\2\0\11\4\2\0\7\4\16\0\2\4\16\0\5\4\11\0"+ 54 "\1\4\21\0\117\5\21\0\3\5\27\0\1\4\13\0\1\4\1\0"+ 55 "\3\4\1\0\1\4\1\0\24\4\1\0\54\4\1\0\10\4\2\0"+ 56 "\32\4\14\0\202\4\1\0\4\5\5\0\71\4\2\0\2\4\2\0"+ 57 "\2\4\3\0\46\4\2\0\2\4\67\0\46\4\2\0\1\4\7\0"+ 58 "\47\4\11\0\21\5\1\0\27\5\1\0\3\5\1\0\1\5\1\0"+ 59 "\2\5\1\0\1\5\13\0\33\4\5\0\3\4\56\0\32\4\5\0"+ 60 "\13\4\13\5\12\0\12\5\6\0\1\5\143\4\1\0\1\4\7\5"+ 61 "\2\0\6\5\2\4\2\5\1\0\4\5\2\0\12\5\3\4\22\0"+ 62 "\1\5\1\4\1\5\33\4\3\0\33\5\65\0\46\4\13\5\u0150\0"+ 63 "\3\5\1\0\65\4\2\0\1\5\1\4\20\5\2\0\1\4\4\5"+ 64 "\3\0\12\4\2\5\2\0\12\5\21\0\3\5\1\0\10\4\2\0"+ 65 "\2\4\2\0\26\4\1\0\7\4\1\0\1\4\3\0\4\4\2\0"+ 66 "\1\5\1\0\7\5\2\0\2\5\2\0\3\5\11\0\1\5\4\0"+ 67 "\2\4\1\0\3\4\2\5\2\0\12\5\4\4\16\0\1\5\2\0"+ 68 "\6\4\4\0\2\4\2\0\26\4\1\0\7\4\1\0\2\4\1\0"+ 69 "\2\4\1\0\2\4\2\0\1\5\1\0\5\5\4\0\2\5\2\0"+ 70 "\3\5\13\0\4\4\1\0\1\4\7\0\14\5\3\4\14\0\3\5"+ 71 "\1\0\7\4\1\0\1\4\1\0\3\4\1\0\26\4\1\0\7\4"+ 72 "\1\0\2\4\1\0\5\4\2\0\1\5\1\4\10\5\1\0\3\5"+ 73 "\1\0\3\5\2\0\1\4\17\0\1\4\5\0\12\5\21\0\3\5"+ 74 "\1\0\10\4\2\0\2\4\2\0\26\4\1\0\7\4\1\0\2\4"+ 75 "\2\0\4\4\2\0\1\5\1\4\6\5\3\0\2\5\2\0\3\5"+ 76 "\10\0\2\5\4\0\2\4\1\0\3\4\4\0\12\5\22\0\2\5"+ 77 "\1\0\6\4\3\0\3\4\1\0\4\4\3\0\2\4\1\0\1\4"+ 78 "\1\0\2\4\3\0\2\4\3\0\3\4\3\0\10\4\1\0\3\4"+ 79 "\4\0\5\5\3\0\3\5\1\0\4\5\11\0\1\5\17\0\11\5"+ 80 "\21\0\3\5\1\0\10\4\1\0\3\4\1\0\27\4\1\0\12\4"+ 81 "\1\0\5\4\4\0\7\5\1\0\3\5\1\0\4\5\7\0\2\5"+ 82 "\11\0\2\4\4\0\12\5\22\0\2\5\1\0\10\4\1\0\3\4"+ 83 "\1\0\27\4\1\0\12\4\1\0\5\4\4\0\7\5\1\0\3\5"+ 84 "\1\0\4\5\7\0\2\5\7\0\1\4\1\0\2\4\4\0\12\5"+ 85 "\22\0\2\5\1\0\10\4\1\0\3\4\1\0\27\4\1\0\20\4"+ 86 "\4\0\6\5\2\0\3\5\1\0\4\5\11\0\1\5\10\0\2\4"+ 87 "\4\0\12\5\22\0\2\5\1\0\22\4\3\0\30\4\1\0\11\4"+ 88 "\1\0\1\4\2\0\7\4\3\0\1\5\4\0\6\5\1\0\1\5"+ 89 "\1\0\10\5\22\0\2\5\15\0\60\4\1\5\2\4\7\5\4\0"+ 90 "\10\4\10\5\1\0\12\5\47\0\2\4\1\0\1\4\2\0\2\4"+ 91 "\1\0\1\4\2\0\1\4\6\0\4\4\1\0\7\4\1\0\3\4"+ 92 "\1\0\1\4\1\0\1\4\2\0\2\4\1\0\4\4\1\5\2\4"+ 93 "\6\5\1\0\2\5\1\4\2\0\5\4\1\0\1\4\1\0\6\5"+ 94 "\2\0\12\5\2\0\2\4\42\0\1\4\27\0\2\5\6\0\12\5"+ 95 "\13\0\1\5\1\0\1\5\1\0\1\5\4\0\2\5\10\4\1\0"+ 96 "\42\4\6\0\24\5\1\0\2\5\4\4\4\0\10\5\1\0\44\5"+ 97 "\11\0\1\5\71\0\42\4\1\0\5\4\1\0\2\4\1\0\7\5"+ 98 "\3\0\4\5\6\0\12\5\6\0\6\4\4\5\106\0\46\4\12\0"+ 99 "\47\4\11\0\132\4\5\0\104\4\5\0\122\4\6\0\7\4\1\0"+ 100 "\77\4\1\0\1\4\1\0\4\4\2\0\7\4\1\0\1\4\1\0"+ 101 "\4\4\2\0\47\4\1\0\1\4\1\0\4\4\2\0\37\4\1\0"+ 102 "\1\4\1\0\4\4\2\0\7\4\1\0\1\4\1\0\4\4\2\0"+ 103 "\7\4\1\0\7\4\1\0\27\4\1\0\37\4\1\0\1\4\1\0"+ 104 "\4\4\2\0\7\4\1\0\47\4\1\0\23\4\16\0\11\5\56\0"+ 105 "\125\4\14\0\u026c\4\2\0\10\4\12\0\32\4\5\0\113\4\225\0"+ 106 "\64\4\40\5\7\0\1\4\4\0\12\5\41\0\4\5\1\0\12\5"+ 107 "\6\0\130\4\10\0\51\4\1\5\u0556\0\234\4\4\0\132\4\6\0"+ 108 "\26\4\2\0\6\4\2\0\46\4\2\0\6\4\2\0\10\4\1\0"+ 109 "\1\4\1\0\1\4\1\0\1\4\1\0\37\4\2\0\65\4\1\0"+ 110 "\7\4\1\0\1\4\3\0\3\4\1\0\7\4\3\0\4\4\2\0"+ 111 "\6\4\4\0\15\4\5\0\3\4\1\0\7\4\17\0\4\5\32\0"+ 112 "\5\5\20\0\2\4\51\0\6\5\17\0\1\4\40\0\20\4\40\0"+ 113 "\15\5\4\0\1\5\40\0\1\4\4\0\1\4\2\0\12\4\1\0"+ 114 "\1\4\3\0\5\4\6\0\1\4\1\0\1\4\1\0\1\4\1\0"+ 115 "\4\4\1\0\3\4\1\0\7\4\46\0\44\4\u0e81\0\3\4\31\0"+ 116 "\11\4\6\5\1\0\5\4\2\0\3\4\6\0\124\4\4\0\2\5"+ 117 "\2\0\2\4\2\0\136\4\6\0\50\4\4\0\136\4\21\0\30\4"+ 118 "\u0248\0\u19b6\4\112\0\u51a6\4\132\0\u048d\4\u0773\0\u2ba4\4\u215c\0\u012e\4"+ 119 "\322\0\7\4\14\0\5\4\5\0\1\4\1\5\12\4\1\0\15\4"+ 120 "\1\0\5\4\1\0\1\4\1\0\2\4\1\0\2\4\1\0\154\4"+ 121 "\41\0\u016b\4\22\0\100\4\2\0\66\4\50\0\14\4\44\0\4\5"+ 122 "\17\0\2\4\30\0\3\4\31\0\1\4\6\0\3\4\1\0\1\4"+ 123 "\1\0\207\4\2\0\1\5\4\0\1\4\13\0\12\5\7\0\32\4"+ 124 "\4\0\1\4\1\0\32\4\12\0\132\4\3\0\6\4\2\0\6\4"+ 125 "\2\0\6\4\2\0\3\4\3\0\2\4\3\0\2\4\22\0\3\5"+ 126 "\4\0"; 127 128 131 final private static char [] yycmap = yy_unpack_cmap(yycmap_packed); 132 133 136 final private static int yy_rowMap [] = { 137 0, 53, 106, 159, 212, 265, 265, 318, 371, 424, 138 477, 530, 583, 636, 689, 265, 265, 742, 795, 848, 139 265, 265, 265, 265, 265, 265, 265, 265, 901, 954, 140 1007, 1060, 265, 265, 265, 1113, 1166, 1219, 1272, 1325, 141 1378, 265, 1431, 1484, 265, 1537, 265, 1590, 1643, 265, 142 1696, 265, 1749, 1802, 1855, 1908, 1961, 2014, 265, 265, 143 265, 265, 265, 265, 265, 265, 265, 2067, 2120, 2173, 144 265, 265, 2226, 265, 2279, 265, 265, 265, 265, 265, 145 265, 265, 265, 265, 265, 2332, 2385, 265, 265, 265, 146 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 147 265, 265, 265, 265, 2438, 2491, 2544, 2597, 2650, 2703, 148 265, 2756, 265, 265, 265, 371, 2809, 371, 265, 371 149 }; 150 151 154 final private static String yy_packed0 = 155 "\1\6\1\7\1\10\1\7\1\11\1\6\1\12\1\13"+ 156 "\2\11\1\13\1\14\1\11\1\15\1\6\1\13\1\16"+ 157 "\1\17\1\20\1\21\1\22\3\11\1\23\3\11\1\24"+ 158 "\1\25\1\26\1\27\1\30\1\31\1\32\1\33\1\34"+ 159 "\1\35\1\36\1\37\1\40\1\41\1\42\1\43\1\44"+ 160 "\1\45\1\46\1\47\1\50\4\11\1\51\1\52\1\53"+ 161 "\13\51\1\54\4\51\1\55\41\51\1\56\1\57\1\60"+ 162 "\13\56\1\61\3\56\1\62\42\56\21\7\1\63\44\7"+ 163 "\1\64\1\65\62\7\66\0\1\7\67\0\7\11\1\0"+ 164 "\1\11\2\0\1\11\4\0\11\11\24\0\4\11\6\0"+ 165 "\1\66\1\67\1\70\1\0\1\66\1\71\1\72\2\0"+ 166 "\1\66\7\0\1\72\1\73\1\0\1\74\26\0\1\74"+ 167 "\1\73\1\75\7\0\2\13\2\0\1\13\1\71\1\72"+ 168 "\2\0\1\13\7\0\1\72\1\73\1\0\1\74\26\0"+ 169 "\1\74\1\73\1\75\7\0\2\71\2\0\1\71\4\0"+ 170 "\1\71\62\0\1\76\27\0\1\77\37\0\1\100\1\101"+ 171 "\23\0\1\102\64\0\1\103\23\0\7\11\1\0\1\11"+ 172 "\2\0\1\11\4\0\1\11\1\104\7\11\24\0\4\11"+ 173 "\4\0\7\11\1\0\1\11\2\0\1\11\4\0\5\11"+ 174 "\1\105\3\11\24\0\4\11\4\0\7\11\1\0\1\11"+ 175 "\2\0\1\11\4\0\2\11\1\106\6\11\24\0\4\11"+ 176 "\45\0\1\107\64\0\1\110\1\111\63\0\1\112\1\0"+ 177 "\1\113\62\0\1\114\64\0\1\115\6\0\1\116\55\0"+ 178 "\1\117\7\0\1\120\54\0\1\121\10\0\1\122\53\0"+ 179 "\1\123\64\0\1\124\17\0\1\51\2\0\13\51\1\0"+ 180 "\4\51\1\0\41\51\1\0\1\52\63\0\1\125\1\0"+ 181 "\4\125\1\126\3\125\1\127\3\125\1\130\1\126\2\125"+ 182 "\1\131\1\132\1\133\1\134\2\125\1\135\3\125\1\136"+ 183 "\27\125\1\137\1\56\2\0\13\56\1\0\3\56\1\0"+ 184 "\42\56\1\0\1\57\63\0\1\125\1\0\4\125\1\126"+ 185 "\3\125\1\127\3\125\1\140\1\126\2\125\1\141\1\142"+ 186 "\1\143\1\144\2\125\1\145\3\125\1\146\27\125\1\147"+ 187 "\20\0\1\64\45\0\1\64\71\0\1\66\1\67\2\0"+ 188 "\1\66\1\71\1\72\2\0\1\66\7\0\1\72\2\0"+ 189 "\1\150\26\0\1\150\11\0\2\67\2\0\1\67\1\71"+ 190 "\1\72\2\0\1\67\7\0\1\72\43\0\2\151\1\0"+ 191 "\2\151\1\0\1\151\2\0\1\151\7\0\3\151\30\0"+ 192 "\3\151\6\0\2\71\2\0\1\71\1\0\1\72\2\0"+ 193 "\1\71\7\0\1\72\1\73\31\0\1\73\1\75\7\0"+ 194 "\2\152\2\0\1\152\2\0\1\153\1\0\1\152\36\0"+ 195 "\1\153\12\0\7\11\1\0\1\11\2\0\1\11\4\0"+ 196 "\2\11\1\154\6\11\24\0\4\11\4\0\7\11\1\0"+ 197 "\1\11\2\0\1\11\4\0\6\11\1\155\2\11\24\0"+ 198 "\4\11\4\0\7\11\1\0\1\11\2\0\1\11\4\0"+ 199 "\6\11\1\156\2\11\24\0\4\11\45\0\1\157\1\160"+ 200 "\63\0\1\161\25\0\1\127\3\0\1\127\4\0\1\127"+ 201 "\53\0\1\162\3\0\1\162\4\0\1\162\53\0\2\151"+ 202 "\1\0\2\151\1\0\1\151\2\0\1\151\7\0\3\151"+ 203 "\1\163\26\0\1\163\3\151\6\0\2\152\2\0\1\152"+ 204 "\4\0\1\152\10\0\1\73\31\0\1\73\1\75\7\0"+ 205 "\2\152\2\0\1\152\4\0\1\152\51\0\7\11\1\0"+ 206 "\1\11\2\0\1\11\4\0\3\11\1\164\5\11\24\0"+ 207 "\4\11\4\0\7\11\1\0\1\11\2\0\1\11\4\0"+ 208 "\7\11\1\165\1\11\24\0\4\11\4\0\7\11\1\0"+ 209 "\1\11\2\0\1\11\4\0\6\11\1\166\2\11\24\0"+ 210 "\4\11\45\0\1\167\23\0\7\11\1\0\1\11\2\0"+ 211 "\1\11\4\0\3\11\1\170\5\11\24\0\4\11"; 212 213 216 final private static int yytrans [] = yy_unpack(); 217 218 219 220 final private static int YY_UNKNOWN_ERROR = 0; 221 final private static int YY_ILLEGAL_STATE = 1; 222 final private static int YY_NO_MATCH = 2; 223 final private static int YY_PUSHBACK_2BIG = 3; 224 225 226 final private static String YY_ERROR_MSG[] = { 227 "Unkown internal scanner error", 228 "Internal error: unknown state", 229 "Error: could not match input", 230 "Error: pushback value was too large" 231 }; 232 233 236 private final static byte YY_ATTRIBUTE[] = { 237 0, 0, 0, 0, 0, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 9, 238 9, 1, 1, 1, 9, 9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 239 9, 9, 9, 1, 1, 1, 1, 1, 1, 9, 1, 1, 9, 1, 9, 1, 240 1, 9, 1, 9, 1, 1, 0, 0, 1, 0, 9, 9, 9, 9, 9, 9, 241 9, 9, 9, 1, 1, 1, 9, 9, 1, 9, 1, 9, 9, 9, 9, 9, 242 9, 9, 9, 9, 9, 1, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 243 9, 9, 9, 9, 9, 9, 9, 9, 1, 1, 0, 1, 1, 1, 9, 1, 244 9, 9, 9, 1, 1, 1, 9, 1 245 }; 246 247 248 private java.io.Reader yy_reader; 249 250 251 private int yy_state; 252 253 254 private int yy_lexical_state = YYINITIAL; 255 256 258 private char yy_buffer[] = new char[YY_BUFFERSIZE]; 259 260 261 private int yy_markedPos; 262 263 264 private int yy_pushbackPos; 265 266 267 private int yy_currentPos; 268 269 270 private int yy_startRead; 271 272 274 private int yy_endRead; 275 276 277 private int yyline; 278 279 280 private int yychar; 281 282 286 private int yycolumn; 287 288 291 private boolean yy_atBOL = true; 292 293 294 private boolean yy_atEOF; 295 296 297 StringBuffer sb = new StringBuffer (); 298 String file; 299 ErrorQueue eq; 300 HashMap keywords; 301 302 public Lexer_c(java.io.InputStream in, String file, ErrorQueue eq) { 303 this(new java.io.BufferedReader (new java.io.InputStreamReader (in)), 304 file, eq); 305 } 306 307 public Lexer_c(java.io.Reader reader, String file, ErrorQueue eq) { 308 this(new EscapedUnicodeReader(reader)); 309 this.file = file; 310 this.eq = eq; 311 this.keywords = new HashMap (); 312 init_keywords(); 313 } 314 315 protected void init_keywords() { 316 keywords.put("abstract", new Integer (sym.ABSTRACT)); 317 keywords.put("assert", new Integer (sym.ASSERT)); 318 keywords.put("boolean", new Integer (sym.BOOLEAN)); 319 keywords.put("break", new Integer (sym.BREAK)); 320 keywords.put("byte", new Integer (sym.BYTE)); 321 keywords.put("case", new Integer (sym.CASE)); 322 keywords.put("catch", new Integer (sym.CATCH)); 323 keywords.put("char", new Integer (sym.CHAR)); 324 keywords.put("class", new Integer (sym.CLASS)); 325 keywords.put("const", new Integer (sym.CONST)); 326 keywords.put("continue", new Integer (sym.CONTINUE)); 327 keywords.put("default", new Integer (sym.DEFAULT)); 328 keywords.put("do", new Integer (sym.DO)); 329 keywords.put("double", new Integer (sym.DOUBLE)); 330 keywords.put("else", new Integer (sym.ELSE)); 331 keywords.put("extends", new Integer (sym.EXTENDS)); 332 keywords.put("final", new Integer (sym.FINAL)); 333 keywords.put("finally", new Integer (sym.FINALLY)); 334 keywords.put("float", new Integer (sym.FLOAT)); 335 keywords.put("for", new Integer (sym.FOR)); 336 keywords.put("goto", new Integer (sym.GOTO)); 337 keywords.put("if", new Integer (sym.IF)); 338 keywords.put("implements", new Integer (sym.IMPLEMENTS)); 339 keywords.put("import", new Integer (sym.IMPORT)); 340 keywords.put("instanceof", new Integer (sym.INSTANCEOF)); 341 keywords.put("int", new Integer (sym.INT)); 342 keywords.put("interface", new Integer (sym.INTERFACE)); 343 keywords.put("long", new Integer (sym.LONG)); 344 keywords.put("native", new Integer (sym.NATIVE)); 345 keywords.put("new", new Integer (sym.NEW)); 346 keywords.put("package", new Integer (sym.PACKAGE)); 347 keywords.put("private", new Integer (sym.PRIVATE)); 348 keywords.put("protected", new Integer (sym.PROTECTED)); 349 keywords.put("public", new Integer (sym.PUBLIC)); 350 keywords.put("return", new Integer (sym.RETURN)); 351 keywords.put("short", new Integer (sym.SHORT)); 352 keywords.put("static", new Integer (sym.STATIC)); 353 keywords.put("strictfp", new Integer (sym.STRICTFP)); 354 keywords.put("super", new Integer (sym.SUPER)); 355 keywords.put("switch", new Integer (sym.SWITCH)); 356 keywords.put("synchronized", new Integer (sym.SYNCHRONIZED)); 357 keywords.put("this", new Integer (sym.THIS)); 358 keywords.put("throw", new Integer (sym.THROW)); 359 keywords.put("throws", new Integer (sym.THROWS)); 360 keywords.put("transient", new Integer (sym.TRANSIENT)); 361 keywords.put("try", new Integer (sym.TRY)); 362 keywords.put("void", new Integer (sym.VOID)); 363 keywords.put("volatile", new Integer (sym.VOLATILE)); 364 keywords.put("while", new Integer (sym.WHILE)); 365 } 366 367 public String file() { 368 return file; 369 } 370 371 private Position pos() { 372 return new Position(file, yyline+1, yycolumn, yyline+1, 373 yycolumn + yytext().length()); 374 } 375 376 private Position pos(int len) { 377 return new Position(file, yyline+1, yycolumn-len-1, yyline+1, 378 yycolumn+1); 379 } 380 381 private Token key(int symbol) { 382 return new Keyword(pos(), yytext(), symbol); 383 } 384 385 private Token op(int symbol) { 386 return new Operator(pos(), yytext(), symbol); 387 } 388 389 private Token id() { 390 return new Identifier(pos(), yytext(), sym.IDENTIFIER); 391 } 392 393 private Token int_lit(String s, int radix) { 394 BigInteger x = new BigInteger (s, radix); 395 boolean boundary = (radix == 10 && s.equals("2147483648")); 396 int bits = radix == 10 ? 31 : 32; 397 if (x.bitLength() > bits && ! boundary) { 398 eq.enqueue(ErrorInfo.LEXICAL_ERROR, "Integer literal \"" + 399 yytext() + "\" out of range.", pos()); 400 } 401 return new IntegerLiteral(pos(), x.intValue(), 402 boundary ? sym.INTEGER_LITERAL_BD : sym.INTEGER_LITERAL); 403 } 404 405 private Token long_lit(String s, int radix) { 406 BigInteger x = new BigInteger (s, radix); 407 boolean boundary = (radix == 10 && s.equals("9223372036854775808")); 408 int bits = radix == 10 ? 63 : 64; 409 if (x.bitLength() > bits && ! boundary) { 410 eq.enqueue(ErrorInfo.LEXICAL_ERROR, "Long literal \"" + 411 yytext() + "\" out of range.", pos()); 412 } 413 return new LongLiteral(pos(), x.longValue(), 414 boundary ? sym.LONG_LITERAL_BD : sym.LONG_LITERAL); 415 } 416 417 private Token float_lit(String s) { 418 try { 419 Float x = Float.valueOf(s); 420 boolean zero = true; 421 for (int i = 0; i < s.length(); i++) { 422 if ('1' <= s.charAt(i) && s.charAt(i) <= '9') { 423 zero = false; 424 break; 425 } 426 if (s.charAt(i) == 'e' || s.charAt(i) == 'E') { 427 break; } 429 } 430 if (x.isInfinite() || x.isNaN() || (x.floatValue() == 0 && ! zero)) { 431 eq.enqueue(ErrorInfo.LEXICAL_ERROR, 432 "Illegal float literal \"" + yytext() + "\"", pos()); 433 } 434 return new FloatLiteral(pos(), x.floatValue(), sym.FLOAT_LITERAL); 435 } 436 catch (NumberFormatException e) { 437 eq.enqueue(ErrorInfo.LEXICAL_ERROR, 438 "Illegal float literal \"" + yytext() + "\"", pos()); 439 return new FloatLiteral(pos(), 0f, sym.FLOAT_LITERAL); 440 } 441 } 442 443 private Token double_lit(String s) { 444 try { 445 Double x = Double.valueOf(s); 446 boolean zero = true; 447 for (int i = 0; i < s.length(); i++) { 448 if ('1' <= s.charAt(i) && s.charAt(i) <= '9') { 449 zero = false; 450 break; 451 } 452 if (s.charAt(i) == 'e' || s.charAt(i) == 'E') { 453 break; } 455 } 456 if (x.isInfinite() || x.isNaN() || (x.doubleValue() == 0 && ! zero)) { 457 eq.enqueue(ErrorInfo.LEXICAL_ERROR, 458 "Illegal double literal \"" + yytext() + "\"", pos()); 459 } 460 return new DoubleLiteral(pos(), x.doubleValue(), sym.DOUBLE_LITERAL); 461 } 462 catch (NumberFormatException e) { 463 eq.enqueue(ErrorInfo.LEXICAL_ERROR, 464 "Illegal double literal \"" + yytext() + "\"", pos()); 465 return new DoubleLiteral(pos(), 0., sym.DOUBLE_LITERAL); 466 } 467 } 468 469 private Token char_lit(String s) { 470 if (s.length() == 1) { 471 char x = s.charAt(0); 472 return new CharacterLiteral(pos(), x, sym.CHARACTER_LITERAL); 473 } 474 else { 475 eq.enqueue(ErrorInfo.LEXICAL_ERROR, 476 "Illegal character literal \'" + s + "\'", pos(s.length())); 477 return new CharacterLiteral(pos(), '\0', sym.CHARACTER_LITERAL); 478 } 479 } 480 481 private Token boolean_lit(boolean x) { 482 return new BooleanLiteral(pos(), x, sym.BOOLEAN_LITERAL); 483 } 484 485 private Token null_lit() { 486 return new NullLiteral(pos(), sym.NULL_LITERAL); 487 } 488 489 private Token string_lit() { 490 return new StringLiteral(pos(sb.length()), sb.toString(), 491 sym.STRING_LITERAL); 492 } 493 494 private String chop(int i, int j) { 495 return yytext().substring(i,yylength()-j); 496 } 497 498 private String chop(int j) { 499 return chop(0, j); 500 } 501 502 private String chop() { 503 return chop(0, 1); 504 } 505 506 507 513 public Lexer_c(java.io.Reader in) { 514 this.yy_reader = in; 515 } 516 517 523 public Lexer_c(java.io.InputStream in) { 524 this(new java.io.InputStreamReader (in)); 525 } 526 527 532 private static int [] yy_unpack() { 533 int [] trans = new int[2862]; 534 int offset = 0; 535 offset = yy_unpack(yy_packed0, offset, trans); 536 return trans; 537 } 538 539 545 private static int yy_unpack(String packed, int offset, int [] trans) { 546 int i = 0; 547 int j = offset; 548 int l = packed.length(); 549 while (i < l) { 550 int count = packed.charAt(i++); 551 int value = packed.charAt(i++); 552 value--; 553 do trans[j++] = value; while (--count > 0); 554 } 555 return j; 556 } 557 558 564 private static char [] yy_unpack_cmap(String packed) { 565 char [] map = new char[0x10000]; 566 int i = 0; 567 int j = 0; 568 while (i < 1642) { 569 int count = packed.charAt(i++); 570 char value = packed.charAt(i++); 571 do map[j++] = value; while (--count > 0); 572 } 573 return map; 574 } 575 576 577 584 private boolean yy_refill() throws java.io.IOException { 585 586 587 if (yy_startRead > 0) { 588 System.arraycopy(yy_buffer, yy_startRead, 589 yy_buffer, 0, 590 yy_endRead-yy_startRead); 591 592 593 yy_endRead-= yy_startRead; 594 yy_currentPos-= yy_startRead; 595 yy_markedPos-= yy_startRead; 596 yy_pushbackPos-= yy_startRead; 597 yy_startRead = 0; 598 } 599 600 601 if (yy_currentPos >= yy_buffer.length) { 602 603 char newBuffer[] = new char[yy_currentPos*2]; 604 System.arraycopy(yy_buffer, 0, newBuffer, 0, yy_buffer.length); 605 yy_buffer = newBuffer; 606 } 607 608 609 int numRead = yy_reader.read(yy_buffer, yy_endRead, 610 yy_buffer.length-yy_endRead); 611 612 if (numRead < 0) { 613 return true; 614 } 615 else { 616 yy_endRead+= numRead; 617 return false; 618 } 619 } 620 621 622 625 final public void yyclose() throws java.io.IOException { 626 yy_atEOF = true; 627 yy_endRead = yy_startRead; 628 629 if (yy_reader != null) 630 yy_reader.close(); 631 } 632 633 634 644 final public void yyreset(java.io.Reader reader) throws java.io.IOException { 645 yyclose(); 646 yy_reader = reader; 647 yy_atBOL = true; 648 yy_atEOF = false; 649 yy_endRead = yy_startRead = 0; 650 yy_currentPos = yy_markedPos = yy_pushbackPos = 0; 651 yyline = yychar = yycolumn = 0; 652 yy_lexical_state = YYINITIAL; 653 } 654 655 656 659 final public int yystate() { 660 return yy_lexical_state; 661 } 662 663 664 669 final public void yybegin(int newState) { 670 yy_lexical_state = newState; 671 } 672 673 674 677 final public String yytext() { 678 return new String ( yy_buffer, yy_startRead, yy_markedPos-yy_startRead ); 679 } 680 681 682 693 final public char yycharat(int pos) { 694 return yy_buffer[yy_startRead+pos]; 695 } 696 697 698 701 final public int yylength() { 702 return yy_markedPos-yy_startRead; 703 } 704 705 706 720 private void yy_ScanError(int errorCode) { 721 String message; 722 try { 723 message = YY_ERROR_MSG[errorCode]; 724 } 725 catch (ArrayIndexOutOfBoundsException e) { 726 message = YY_ERROR_MSG[YY_UNKNOWN_ERROR]; 727 } 728 729 throw new Error (message); 730 } 731 732 733 741 private void yypushback(int number) { 742 if ( number > yylength() ) 743 yy_ScanError(YY_PUSHBACK_2BIG); 744 745 yy_markedPos -= number; 746 } 747 748 749 756 public Token nextToken() throws java.io.IOException { 757 int yy_input; 758 int yy_action; 759 760 int yy_currentPos_l; 762 int yy_startRead_l; 763 int yy_markedPos_l; 764 int yy_endRead_l = yy_endRead; 765 char [] yy_buffer_l = yy_buffer; 766 char [] yycmap_l = yycmap; 767 768 int [] yytrans_l = yytrans; 769 int [] yy_rowMap_l = yy_rowMap; 770 byte [] yy_attr_l = YY_ATTRIBUTE; 771 772 while (true) { 773 yy_markedPos_l = yy_markedPos; 774 775 boolean yy_r = false; 776 for (yy_currentPos_l = yy_startRead; yy_currentPos_l < yy_markedPos_l; 777 yy_currentPos_l++) { 778 switch (yy_buffer_l[yy_currentPos_l]) { 779 case '\u000B': 780 case '\u000C': 781 case '\u0085': 782 case '\u2028': 783 case '\u2029': 784 yyline++; 785 yycolumn = 0; 786 yy_r = false; 787 break; 788 case '\r': 789 yyline++; 790 yycolumn = 0; 791 yy_r = true; 792 break; 793 case '\n': 794 if (yy_r) 795 yy_r = false; 796 else { 797 yyline++; 798 yycolumn = 0; 799 } 800 break; 801 default: 802 yy_r = false; 803 yycolumn++; 804 } 805 } 806 807 if (yy_r) { 808 boolean yy_peek; 810 if (yy_markedPos_l < yy_endRead_l) 811 yy_peek = yy_buffer_l[yy_markedPos_l] == '\n'; 812 else if (yy_atEOF) 813 yy_peek = false; 814 else { 815 boolean eof = yy_refill(); 816 yy_markedPos_l = yy_markedPos; 817 yy_buffer_l = yy_buffer; 818 if (eof) 819 yy_peek = false; 820 else 821 yy_peek = yy_buffer_l[yy_markedPos_l] == '\n'; 822 } 823 if (yy_peek) yyline--; 824 } 825 yy_action = -1; 826 827 yy_startRead_l = yy_currentPos_l = yy_currentPos = 828 yy_startRead = yy_markedPos_l; 829 830 yy_state = yy_lexical_state; 831 832 833 yy_forAction: { 834 while (true) { 835 836 if (yy_currentPos_l < yy_endRead_l) 837 yy_input = yy_buffer_l[yy_currentPos_l++]; 838 else if (yy_atEOF) { 839 yy_input = YYEOF; 840 break yy_forAction; 841 } 842 else { 843 yy_currentPos = yy_currentPos_l; 845 yy_markedPos = yy_markedPos_l; 846 boolean eof = yy_refill(); 847 yy_currentPos_l = yy_currentPos; 849 yy_markedPos_l = yy_markedPos; 850 yy_buffer_l = yy_buffer; 851 yy_endRead_l = yy_endRead; 852 if (eof) { 853 yy_input = YYEOF; 854 break yy_forAction; 855 } 856 else { 857 yy_input = yy_buffer_l[yy_currentPos_l++]; 858 } 859 } 860 int yy_next = yytrans_l[ yy_rowMap_l[yy_state] + yycmap_l[yy_input] ]; 861 if (yy_next == -1) break yy_forAction; 862 yy_state = yy_next; 863 864 int yy_attributes = yy_attr_l[yy_state]; 865 if ( (yy_attributes & 1) == 1 ) { 866 yy_action = yy_state; 867 yy_markedPos_l = yy_currentPos_l; 868 if ( (yy_attributes & 8) == 8 ) break yy_forAction; 869 } 870 871 } 872 } 873 874 yy_markedPos = yy_markedPos_l; 876 877 switch (yy_action) { 878 879 case 45: 880 { sb.append( yytext() ); } 881 case 121: break; 882 case 40: 883 { sb.append( yytext() ); } 884 case 122: break; 885 case 59: 886 { return long_lit(chop(), 10); } 887 case 123: break; 888 case 84: 889 { eq.enqueue(ErrorInfo.LEXICAL_ERROR, 890 "Illegal escape character \"" + 891 yytext() + "\"", pos()); } 892 case 124: break; 893 case 6: 894 case 7: 895 { } 896 case 125: break; 897 case 50: 898 { } 899 case 126: break; 900 case 119: 901 { return boolean_lit(false); } 902 case 127: break; 903 case 115: 904 { return boolean_lit(true); } 905 case 128: break; 906 case 27: 907 { return op(sym.COMMA); } 908 case 129: break; 909 case 11: 910 { return op(sym.DOT); } 911 case 130: break; 912 case 20: 913 { return op(sym.LPAREN); } 914 case 131: break; 915 case 21: 916 { return op(sym.RPAREN); } 917 case 132: break; 918 case 22: 919 { return op(sym.LBRACE); } 920 case 133: break; 921 case 23: 922 { return op(sym.RBRACE); } 923 case 134: break; 924 case 24: 925 { return op(sym.LBRACK); } 926 case 135: break; 927 case 25: 928 { return op(sym.RBRACK); } 929 case 136: break; 930 case 26: 931 { return op(sym.SEMICOLON); } 932 case 137: break; 933 case 117: 934 { return null_lit(); } 935 case 138: break; 936 case 56: 937 case 105: 938 { return double_lit(yytext()); } 939 case 139: break; 940 case 103: 941 { return long_lit(chop(), 8); } 942 case 140: break; 943 case 102: 944 { sb.append('\b'); } 945 case 141: break; 946 case 101: 947 { sb.append('\n'); } 948 case 142: break; 949 case 100: 950 { sb.append('\f'); } 951 case 143: break; 952 case 99: 953 { sb.append('\r'); } 954 case 144: break; 955 case 98: 956 { sb.append('\t'); } 957 case 145: break; 958 case 97: 959 { sb.append('\"'); } 960 case 146: break; 961 case 96: 962 { sb.append('\''); } 963 case 147: break; 964 case 95: 965 { sb.append('\\'); } 966 case 148: break; 967 case 104: 968 { return int_lit(chop(2,0), 16); } 969 case 149: break; 970 case 5: 971 case 43: 972 case 48: 973 { eq.enqueue(ErrorInfo.LEXICAL_ERROR, 974 "Illegal character \"" + 975 yytext() + "\"", pos()); } 976 case 150: break; 977 case 58: 978 { return float_lit(chop()); } 979 case 151: break; 980 case 60: 981 { return double_lit(chop()); } 982 case 152: break; 983 case 63: 984 { yybegin(END_OF_LINE_COMMENT); } 985 case 153: break; 986 case 51: 987 case 52: 988 { yybegin(YYINITIAL); } 989 case 154: break; 990 case 64: 991 { yybegin(TRADITIONAL_COMMENT); } 992 case 155: break; 993 case 8: 994 case 17: 995 case 18: 996 case 19: 997 case 67: 998 case 68: 999 case 69: 1000 case 107: 1001 case 108: 1002 case 109: 1003 case 116: 1004 { Integer i = (Integer ) keywords.get(yytext()); 1005 if (i == null) return id(); 1006 else return key(i.intValue()); } 1007 case 156: break; 1008 case 15: 1009 { yybegin(CHARACTER); sb.setLength(0); } 1010 case 157: break; 1011 case 118: 1012 { return op(sym.URSHIFTEQ); } 1013 case 158: break; 1014 case 112: 1015 { return op(sym.LSHIFTEQ); } 1016 case 159: break; 1017 case 111: 1018 { return op(sym.URSHIFT); } 1019 case 160: break; 1020 case 110: 1021 { return op(sym.RSHIFTEQ); } 1022 case 161: break; 1023 case 39: 1024 { return op(sym.MOD); } 1025 case 162: break; 1026 case 38: 1027 { return op(sym.XOR); } 1028 case 163: break; 1029 case 37: 1030 { return op(sym.PLUS); } 1031 case 164: break; 1032 case 36: 1033 { return op(sym.OR); } 1034 case 165: break; 1035 case 35: 1036 { return op(sym.AND); } 1037 case 166: break; 1038 case 34: 1039 { return op(sym.COLON); } 1040 case 167: break; 1041 case 33: 1042 { return op(sym.QUESTION); } 1043 case 168: break; 1044 case 32: 1045 { return op(sym.COMP); } 1046 case 169: break; 1047 case 31: 1048 { return op(sym.NOT); } 1049 case 170: break; 1050 case 30: 1051 { return op(sym.LT); } 1052 case 171: break; 1053 case 29: 1054 { return op(sym.GT); } 1055 case 172: break; 1056 case 28: 1057 { return op(sym.EQ); } 1058 case 173: break; 1059 case 14: 1060 { return op(sym.MULT); } 1061 case 174: break; 1062 case 13: 1063 { return op(sym.DIV); } 1064 case 175: break; 1065 case 12: 1066 { return op(sym.MINUS); } 1067 case 176: break; 1068 case 61: 1069 { return op(sym.MINUSMINUS); } 1070 case 177: break; 1071 case 62: 1072 { return op(sym.MINUSEQ); } 1073 case 178: break; 1074 case 65: 1075 { return op(sym.DIVEQ); } 1076 case 179: break; 1077 case 66: 1078 { return op(sym.MULTEQ); } 1079 case 180: break; 1080 case 70: 1081 { return op(sym.EQEQ); } 1082 case 181: break; 1083 case 71: 1084 { return op(sym.GTEQ); } 1085 case 182: break; 1086 case 72: 1087 { return op(sym.RSHIFT); } 1088 case 183: break; 1089 case 73: 1090 { return op(sym.LTEQ); } 1091 case 184: break; 1092 case 74: 1093 { return op(sym.LSHIFT); } 1094 case 185: break; 1095 case 75: 1096 { return op(sym.NOTEQ); } 1097 case 186: break; 1098 case 76: 1099 { return op(sym.ANDEQ); } 1100 case 187: break; 1101 case 77: 1102 { return op(sym.ANDAND); } 1103 case 188: break; 1104 case 78: 1105 { return op(sym.OREQ); } 1106 case 189: break; 1107 case 79: 1108 { return op(sym.OROR); } 1109 case 190: break; 1110 case 80: 1111 { return op(sym.PLUSEQ); } 1112 case 191: break; 1113 case 81: 1114 { return op(sym.PLUSPLUS); } 1115 case 192: break; 1116 case 82: 1117 { return op(sym.XOREQ); } 1118 case 193: break; 1119 case 83: 1120 { return op(sym.MODEQ); } 1121 case 194: break; 1122 case 114: 1123 { return long_lit(chop(2,1), 16); } 1124 case 195: break; 1125 case 94: 1126 { sb.append( '\b' ); } 1127 case 196: break; 1128 case 93: 1129 { sb.append( '\n' ); } 1130 case 197: break; 1131 case 9: 1132 case 10: 1133 { return int_lit(yytext(), 10); } 1134 case 198: break; 1135 case 53: 1136 { return int_lit(yytext(), 8); } 1137 case 199: break; 1138 case 87: 1139 { sb.append( '\\' ); } 1140 case 200: break; 1141 case 88: 1142 { sb.append( '\'' ); } 1143 case 201: break; 1144 case 89: 1145 { sb.append( '\"' ); } 1146 case 202: break; 1147 case 90: 1148 { sb.append( '\t' ); } 1149 case 203: break; 1150 case 91: 1151 { sb.append( '\r' ); } 1152 case 204: break; 1153 case 92: 1154 { sb.append( '\f' ); } 1155 case 205: break; 1156 case 46: 1157 case 47: 1158 { yybegin(YYINITIAL); 1159 eq.enqueue(ErrorInfo.LEXICAL_ERROR, 1160 "Unclosed character literal", 1161 pos(sb.length())); } 1162 case 206: break; 1163 case 44: 1164 { yybegin(YYINITIAL); 1165 return string_lit(); } 1166 case 207: break; 1167 case 41: 1168 case 42: 1169 { yybegin(YYINITIAL); 1170 eq.enqueue(ErrorInfo.LEXICAL_ERROR, 1171 "Unclosed string literal", 1172 pos(sb.length())); } 1173 case 208: break; 1174 case 16: 1175 { yybegin(STRING); sb.setLength(0); } 1176 case 209: break; 1177 case 49: 1178 { yybegin(YYINITIAL); 1179 return char_lit(sb.toString()); } 1180 case 210: break; 1181 case 85: 1182 case 86: 1183 case 113: 1184 { try { 1185 int x = Integer.parseInt(chop(1,0), 8); 1186 sb.append((char) x); 1187 } 1188 catch (NumberFormatException e) { 1189 eq.enqueue(ErrorInfo.LEXICAL_ERROR, 1190 "Illegal octal escape \"" 1191 + yytext() + "\"", pos()); 1192 } 1193 } 1194 case 211: break; 1195 default: 1196 if (yy_input == YYEOF && yy_startRead == yy_currentPos) { 1197 yy_atEOF = true; 1198 { return new EOF(pos(), sym.EOF); 1199 } 1200 } 1201 else { 1202 yy_ScanError(YY_NO_MATCH); 1203 } 1204 } 1205 } 1206 } 1207 1208 1209} 1210 | Popular Tags |