Парсинг экранированных символов в строке

This commit is contained in:
Victor 2016-02-18 22:02:37 +02:00
parent 6c093e50b5
commit e947ae01d5
2 changed files with 28 additions and 3 deletions

View File

@ -238,4 +238,6 @@ println `extended word variable`
// Operator overloading
def `::`(v1, v2) = string(v1) + string(v2)
println 1 :: 2 :: 3
println 1 :: 2 :: 3
println "\u042a"

View File

@ -150,7 +150,7 @@ public final class Lexer {
private void tokenizeHexNumber() {
clearBuffer();
char current = peek(0);
while (Character.isDigit(current) || isHexNumber(current)) {
while (isHexNumber(current)) {
buffer.append(current);
current = next();
}
@ -158,7 +158,9 @@ public final class Lexer {
}
private static boolean isHexNumber(char current) {
return "abcdef".indexOf(Character.toLowerCase(current)) != -1;
return Character.isDigit(current)
|| ('a' <= current && current <= 'f')
|| ('A' <= current && current <= 'F');
}
private void tokenizeOperator() {
@ -236,7 +238,28 @@ public final class Lexer {
case 'b': current = next(); buffer.append('\b'); continue;
case 'f': current = next(); buffer.append('\f'); continue;
case 'n': current = next(); buffer.append('\n'); continue;
case 'r': current = next(); buffer.append('\r'); continue;
case 't': current = next(); buffer.append('\t'); continue;
case 'u': // http://docs.oracle.com/javase/specs/jls/se8/html/jls-3.html#jls-3.3
int rollbackPosition = pos;
while (current == 'u') current = next();
int escapedValue = 0;
for (int i = 12; i >= 0 && escapedValue != -1; i -= 4) {
if (isHexNumber(current)) {
escapedValue |= (Character.digit(current, 16) << i);
} else {
escapedValue = -1;
}
current = next();
}
if (escapedValue >= 0) {
buffer.append((char) escapedValue);
} else {
// rollback
buffer.append("\\u");
pos = rollbackPosition;
}
continue;
}
buffer.append('\\');
continue;