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