JsonParser::Token JsonParser::doAdvance()

in lang/c++/impl/json/JsonIO.cc [74:143]


JsonParser::Token JsonParser::doAdvance() {
    char ch = next();
    if (ch == ']') {
        if (curState == stArray0 || curState == stArrayN) {
            curState = stateStack.top();
            stateStack.pop();
            return Token::ArrayEnd;
        } else {
            throw unexpected(ch);
        }
    } else if (ch == '}') {
        if (curState == stObject0 || curState == stObjectN) {
            curState = stateStack.top();
            stateStack.pop();
            return Token::ObjectEnd;
        } else {
            throw unexpected(ch);
        }
    } else if (ch == ',') {
        if (curState != stObjectN && curState != stArrayN) {
            throw unexpected(ch);
        }
        if (curState == stObjectN) {
            curState = stObject0;
        }
        ch = next();
    } else if (ch == ':') {
        if (curState != stKey) {
            throw unexpected(ch);
        }
        curState = stObjectN;
        ch = next();
    }

    if (curState == stObject0) {
        if (ch != '"') {
            throw unexpected(ch);
        }
        curState = stKey;
    } else if (curState == stArray0) {
        curState = stArrayN;
    }

    switch (ch) {
        case '[':
            stateStack.push(curState);
            curState = stArray0;
            return Token::ArrayStart;
        case '{':
            stateStack.push(curState);
            curState = stObject0;
            return Token::ObjectStart;
        case '"':
            return tryString();
        case 't':
            bv = true;
            return tryLiteral("rue", 3, Token::Bool);
        case 'f':
            bv = false;
            return tryLiteral("alse", 4, Token::Bool);
        case 'n':
            return tryLiteral("ull", 3, Token::Null);
        default:
            if (isdigit(ch) || ch == '-') {
                return tryNumber(ch);
            } else {
                throw unexpected(ch);
            }
    }
}