in oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/json/JsopTokenizer.java [165:288]
private int readToken() {
currentEscaped = false;
char ch;
while (true) {
if (pos >= length) {
return END;
}
ch = jsop.charAt(pos);
if (ch > ' ') {
break;
}
pos++;
}
int start = pos++;
switch (ch) {
case '\"': {
while (true) {
ch = jsop.charAt(pos++);
if (ch == '\"') {
break;
} else if (ch == '\\') {
currentEscaped = true;
pos++;
}
}
currentToken = jsop.substring(start + 1, pos - 1);
return STRING;
}
case '{':
case '}':
case '[':
case ']':
case '+':
case ':':
case ',':
case '>':
case '^':
case '*':
case '=':
case ';':
return ch;
case '/': {
ch = jsop.charAt(pos);
if (ch != '*') {
return '/';
}
pos++;
while (true) {
ch = jsop.charAt(pos++);
if (ch == '*' && jsop.charAt(pos) == '/') {
break;
}
}
currentToken = jsop.substring(start + 2, pos - 1);
pos += 2;
return COMMENT;
}
case '-':
ch = jsop.charAt(pos);
if (ch < '0' || ch > '9') {
// lookahead
return '-';
}
// else fall though
default:
if (ch >= '0' && ch <= '9') {
while (pos < length) {
ch = jsop.charAt(pos);
if (ch < '0' || ch > '9') {
break;
}
pos++;
}
if (ch == '.') {
pos++;
while (pos < length) {
ch = jsop.charAt(pos);
if (ch < '0' || ch > '9') {
break;
}
pos++;
}
}
if (ch == 'e' || ch == 'E') {
ch = jsop.charAt(++pos);
if (ch == '+' || ch == '-') {
ch = jsop.charAt(++pos);
}
while (pos < length) {
ch = jsop.charAt(pos);
if (ch < '0' || ch > '9') {
break;
}
pos++;
}
}
currentToken = jsop.substring(start, pos);
return NUMBER;
} else if (ch >= 'a' && ch <= 'z') {
while (pos < length) {
ch = jsop.charAt(pos);
if ((ch < 'a' || ch > 'z') && ch != '_' && (ch < '0' || ch > '9')) {
break;
}
pos++;
}
String s = jsop.substring(start, pos);
if ("null".equals(s)) {
currentToken = null;
return NULL;
} else if ("true".equals(s)) {
currentToken = s;
return TRUE;
} else if ("false".equals(s)) {
currentToken = s;
return FALSE;
} else {
currentToken = s;
return IDENTIFIER;
}
}
throw getFormatException(jsop, pos);
}
}