mirror of https://github.com/odrling/Aegisub
Clean up the json parser a little
This commit is contained in:
parent
d9016cc8ea
commit
a22dd0f9ca
|
@ -20,12 +20,6 @@ TODO:
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace json {
|
namespace json {
|
||||||
|
|
||||||
std::istream& operator >> (std::istream& istr, UnknownElement& elementRoot) {
|
|
||||||
Reader::Read(elementRoot, istr);
|
|
||||||
return istr;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Wrapper around istream to keep track of document/line offsets
|
/// Wrapper around istream to keep track of document/line offsets
|
||||||
class Reader::InputStream {
|
class Reader::InputStream {
|
||||||
std::istream& m_iStr;
|
std::istream& m_iStr;
|
||||||
|
@ -104,44 +98,41 @@ void Reader::Scan(Tokens& tokens, InputStream& inputStream) {
|
||||||
Token token;
|
Token token;
|
||||||
token.locBegin = inputStream.GetLocation();
|
token.locBegin = inputStream.GetLocation();
|
||||||
|
|
||||||
// gives us null-terminated string
|
char c = inputStream.Peek();
|
||||||
std::string sChar;
|
switch (c) {
|
||||||
sChar.push_back(inputStream.Peek());
|
|
||||||
|
|
||||||
switch (sChar[0]) {
|
|
||||||
case '{':
|
case '{':
|
||||||
token.sValue = sChar[0];
|
token.sValue = c;
|
||||||
MatchExpectedString(sChar, inputStream);
|
inputStream.Get();
|
||||||
token.nType = Token::TOKEN_OBJECT_BEGIN;
|
token.nType = Token::TOKEN_OBJECT_BEGIN;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '}':
|
case '}':
|
||||||
token.sValue = sChar[0];
|
token.sValue = c;
|
||||||
MatchExpectedString(sChar, inputStream);
|
inputStream.Get();
|
||||||
token.nType = Token::TOKEN_OBJECT_END;
|
token.nType = Token::TOKEN_OBJECT_END;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '[':
|
case '[':
|
||||||
token.sValue = sChar[0];
|
token.sValue = c;
|
||||||
MatchExpectedString(sChar, inputStream);
|
inputStream.Get();
|
||||||
token.nType = Token::TOKEN_ARRAY_BEGIN;
|
token.nType = Token::TOKEN_ARRAY_BEGIN;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ']':
|
case ']':
|
||||||
token.sValue = sChar[0];
|
token.sValue = c;
|
||||||
MatchExpectedString(sChar, inputStream);
|
inputStream.Get();
|
||||||
token.nType = Token::TOKEN_ARRAY_END;
|
token.nType = Token::TOKEN_ARRAY_END;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ',':
|
case ',':
|
||||||
token.sValue = sChar[0];
|
token.sValue = c;
|
||||||
MatchExpectedString(sChar, inputStream);
|
inputStream.Get();
|
||||||
token.nType = Token::TOKEN_NEXT_ELEMENT;
|
token.nType = Token::TOKEN_NEXT_ELEMENT;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ':':
|
case ':':
|
||||||
token.sValue = sChar[0];
|
token.sValue = c;
|
||||||
MatchExpectedString(sChar, inputStream);
|
inputStream.Get();
|
||||||
token.nType = Token::TOKEN_MEMBER_ASSIGN;
|
token.nType = Token::TOKEN_MEMBER_ASSIGN;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -183,8 +174,11 @@ void Reader::Scan(Tokens& tokens, InputStream& inputStream) {
|
||||||
token.nType = Token::TOKEN_NULL;
|
token.nType = Token::TOKEN_NULL;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 0:
|
||||||
|
return;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
throw ScanException("Unexpected character in stream: " + sChar, inputStream.GetLocation());
|
throw ScanException(std::string("Unexpected character in stream: ") + c, inputStream.GetLocation());
|
||||||
}
|
}
|
||||||
|
|
||||||
token.locEnd = inputStream.GetLocation();
|
token.locEnd = inputStream.GetLocation();
|
||||||
|
@ -198,15 +192,11 @@ void Reader::EatWhiteSpace(InputStream& inputStream) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Reader::MatchExpectedString(std::string const& sExpected, InputStream& inputStream) {
|
void Reader::MatchExpectedString(std::string const& sExpected, InputStream& inputStream) {
|
||||||
std::string::const_iterator it(sExpected.begin()), itEnd(sExpected.end());
|
for (char c : sExpected) {
|
||||||
for ( ; it != itEnd; ++it) {
|
if (inputStream.EOS() || inputStream.Get() != c)
|
||||||
if (inputStream.EOS() || // did we reach the end before finding what we're looking for...
|
|
||||||
inputStream.Get() != *it) // ...or did we find something different?
|
|
||||||
{
|
|
||||||
throw ScanException("Expected string: " + sExpected, inputStream.GetLocation());
|
throw ScanException("Expected string: " + sExpected, inputStream.GetLocation());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void Reader::MatchString(std::string& string, InputStream& inputStream) {
|
void Reader::MatchString(std::string& string, InputStream& inputStream) {
|
||||||
MatchExpectedString("\"", inputStream);
|
MatchExpectedString("\"", inputStream);
|
||||||
|
|
Loading…
Reference in New Issue