@@ -150,15 +150,17 @@ private void tokenizeNumber() {
150
150
private void tokenizeHexNumber () {
151
151
clearBuffer ();
152
152
char current = peek (0 );
153
- while (Character . isDigit ( current ) || isHexNumber (current )) {
153
+ while (isHexNumber (current )) {
154
154
buffer .append (current );
155
155
current = next ();
156
156
}
157
157
addToken (TokenType .HEX_NUMBER , buffer .toString ());
158
158
}
159
159
160
160
private static boolean isHexNumber (char current ) {
161
- return "abcdef" .indexOf (Character .toLowerCase (current )) != -1 ;
161
+ return Character .isDigit (current )
162
+ || ('a' <= current && current <= 'f' )
163
+ || ('A' <= current && current <= 'F' );
162
164
}
163
165
164
166
private void tokenizeOperator () {
@@ -236,7 +238,28 @@ private void tokenizeText() {
236
238
case 'b' : current = next (); buffer .append ('\b' ); continue ;
237
239
case 'f' : current = next (); buffer .append ('\f' ); continue ;
238
240
case 'n' : current = next (); buffer .append ('\n' ); continue ;
241
+ case 'r' : current = next (); buffer .append ('\r' ); continue ;
239
242
case 't' : current = next (); buffer .append ('\t' ); continue ;
243
+ case 'u' : // http://docs.oracle.com/javase/specs/jls/se8/html/jls-3.html#jls-3.3
244
+ int rollbackPosition = pos ;
245
+ while (current == 'u' ) current = next ();
246
+ int escapedValue = 0 ;
247
+ for (int i = 12 ; i >= 0 && escapedValue != -1 ; i -= 4 ) {
248
+ if (isHexNumber (current )) {
249
+ escapedValue |= (Character .digit (current , 16 ) << i );
250
+ } else {
251
+ escapedValue = -1 ;
252
+ }
253
+ current = next ();
254
+ }
255
+ if (escapedValue >= 0 ) {
256
+ buffer .append ((char ) escapedValue );
257
+ } else {
258
+ // rollback
259
+ buffer .append ("\\ u" );
260
+ pos = rollbackPosition ;
261
+ }
262
+ continue ;
240
263
}
241
264
buffer .append ('\\' );
242
265
continue ;
0 commit comments