private int readToken()

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);
        }
    }