346 /** Read an identifier. |
346 /** Read an identifier. |
347 */ |
347 */ |
348 private void scanIdent() { |
348 private void scanIdent() { |
349 boolean isJavaIdentifierPart; |
349 boolean isJavaIdentifierPart; |
350 char high; |
350 char high; |
|
351 reader.putChar(true); |
351 do { |
352 do { |
352 reader.putChar(true); |
|
353 switch (reader.ch) { |
353 switch (reader.ch) { |
354 case 'A': case 'B': case 'C': case 'D': case 'E': |
354 case 'A': case 'B': case 'C': case 'D': case 'E': |
355 case 'F': case 'G': case 'H': case 'I': case 'J': |
355 case 'F': case 'G': case 'H': case 'I': case 'J': |
356 case 'K': case 'L': case 'M': case 'N': case 'O': |
356 case 'K': case 'L': case 'M': case 'N': case 'O': |
357 case 'P': case 'Q': case 'R': case 'S': case 'T': |
357 case 'P': case 'Q': case 'R': case 'S': case 'T': |
364 case 'u': case 'v': case 'w': case 'x': case 'y': |
364 case 'u': case 'v': case 'w': case 'x': case 'y': |
365 case 'z': |
365 case 'z': |
366 case '$': case '_': |
366 case '$': case '_': |
367 case '0': case '1': case '2': case '3': case '4': |
367 case '0': case '1': case '2': case '3': case '4': |
368 case '5': case '6': case '7': case '8': case '9': |
368 case '5': case '6': case '7': case '8': case '9': |
|
369 break; |
369 case '\u0000': case '\u0001': case '\u0002': case '\u0003': |
370 case '\u0000': case '\u0001': case '\u0002': case '\u0003': |
370 case '\u0004': case '\u0005': case '\u0006': case '\u0007': |
371 case '\u0004': case '\u0005': case '\u0006': case '\u0007': |
371 case '\u0008': case '\u000E': case '\u000F': case '\u0010': |
372 case '\u0008': case '\u000E': case '\u000F': case '\u0010': |
372 case '\u0011': case '\u0012': case '\u0013': case '\u0014': |
373 case '\u0011': case '\u0012': case '\u0013': case '\u0014': |
373 case '\u0015': case '\u0016': case '\u0017': |
374 case '\u0015': case '\u0016': case '\u0017': |
374 case '\u0018': case '\u0019': case '\u001B': |
375 case '\u0018': case '\u0019': case '\u001B': |
375 case '\u007F': |
376 case '\u007F': |
376 break; |
377 reader.scanChar(); |
|
378 continue; |
377 case '\u001A': // EOI is also a legal identifier part |
379 case '\u001A': // EOI is also a legal identifier part |
378 if (reader.bp >= reader.buflen) { |
380 if (reader.bp >= reader.buflen) { |
379 name = reader.name(); |
381 name = reader.name(); |
380 tk = tokens.lookupKind(name); |
382 tk = tokens.lookupKind(name); |
381 return; |
383 return; |
382 } |
384 } |
383 break; |
385 reader.scanChar(); |
|
386 continue; |
384 default: |
387 default: |
385 if (reader.ch < '\u0080') { |
388 if (reader.ch < '\u0080') { |
386 // all ASCII range chars already handled, above |
389 // all ASCII range chars already handled, above |
387 isJavaIdentifierPart = false; |
390 isJavaIdentifierPart = false; |
388 } else { |
391 } else { |
389 high = reader.scanSurrogates(); |
392 if (Character.isIdentifierIgnorable(reader.ch)) { |
390 if (high != 0) { |
393 reader.scanChar(); |
391 reader.putChar(high); |
394 continue; |
392 isJavaIdentifierPart = Character.isJavaIdentifierPart( |
|
393 Character.toCodePoint(high, reader.ch)); |
|
394 } else { |
395 } else { |
395 isJavaIdentifierPart = Character.isJavaIdentifierPart(reader.ch); |
396 high = reader.scanSurrogates(); |
|
397 if (high != 0) { |
|
398 reader.putChar(high); |
|
399 isJavaIdentifierPart = Character.isJavaIdentifierPart( |
|
400 Character.toCodePoint(high, reader.ch)); |
|
401 } else { |
|
402 isJavaIdentifierPart = Character.isJavaIdentifierPart(reader.ch); |
|
403 } |
396 } |
404 } |
397 } |
405 } |
398 if (!isJavaIdentifierPart) { |
406 if (!isJavaIdentifierPart) { |
399 name = reader.name(); |
407 name = reader.name(); |
400 tk = tokens.lookupKind(name); |
408 tk = tokens.lookupKind(name); |
401 return; |
409 return; |
402 } |
410 } |
403 } |
411 } |
|
412 reader.putChar(true); |
404 } while (true); |
413 } while (true); |
405 } |
414 } |
406 |
415 |
407 /** Return true if reader.ch can be part of an operator. |
416 /** Return true if reader.ch can be part of an operator. |
408 */ |
417 */ |