Skip to content

Commit 8a820ff

Browse files
author
Blake Gross
committed
Cleaned up parser code
1 parent f2a57c8 commit 8a820ff

File tree

1 file changed

+62
-71
lines changed

1 file changed

+62
-71
lines changed

Release/src/json/json_parsing.cpp

Lines changed: 62 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ class JSON_Parser
138138
bool signed_number;
139139
};
140140

141-
JsonParseStatus GetNextToken(Token &);
141+
void GetNextToken(Token &, JsonParseStatus &);
142142

143143
web::json::value ParseValue(typename JSON_Parser<CharType>::Token &first, JsonParseStatus& parseStatus)
144144
{
@@ -901,16 +901,14 @@ bool JSON_StringParser<CharType>::finish_parsing_string_with_unescape_char(typen
901901
}
902902

903903
template <typename CharType>
904-
JsonParseStatus JSON_Parser<CharType>::GetNextToken(typename JSON_Parser<CharType>::Token& result)
904+
void JSON_Parser<CharType>::GetNextToken(typename JSON_Parser<CharType>::Token& result, JsonParseStatus& parseStatus)
905905
{
906-
JsonParseStatus parseSucceed;
907-
908906
try_again:
909907
CharType ch = EatWhitespace();
910908

911909
CreateToken(result, Token::TKN_EOF);
912910

913-
if (ch == this->m_eof) return parseSucceed;
911+
if (ch == this->m_eof) return;
914912

915913
switch (ch)
916914
{
@@ -919,8 +917,8 @@ JsonParseStatus JSON_Parser<CharType>::GetNextToken(typename JSON_Parser<CharTyp
919917
{
920918
if(++m_currentParsingDepth > JSON_Parser<CharType>::maxParsingDepth)
921919
{
922-
parseSucceed.didSucceed = false;
923-
parseSucceed.errorMsg = _XPLATSTR("Nesting too deep!");
920+
parseStatus.didSucceed = false;
921+
parseStatus.errorMsg = _XPLATSTR("Nesting too deep!");
924922
break;
925923
}
926924

@@ -933,8 +931,8 @@ JsonParseStatus JSON_Parser<CharType>::GetNextToken(typename JSON_Parser<CharTyp
933931
{
934932
if((signed int)(--m_currentParsingDepth) < 0)
935933
{
936-
parseSucceed.didSucceed = false;
937-
parseSucceed.errorMsg = _XPLATSTR("Mismatched braces!");
934+
parseStatus.didSucceed = false;
935+
parseStatus.errorMsg = _XPLATSTR("Mismatched braces!");
938936
break;
939937
}
940938

@@ -953,38 +951,38 @@ JsonParseStatus JSON_Parser<CharType>::GetNextToken(typename JSON_Parser<CharTyp
953951
case 't':
954952
if (!CompleteKeywordTrue(result))
955953
{
956-
parseSucceed.didSucceed = false;
957-
parseSucceed.errorMsg = _XPLATSTR("Malformed literal");
954+
parseStatus.didSucceed = false;
955+
parseStatus.errorMsg = _XPLATSTR("Malformed literal");
958956
}
959957
break;
960958
case 'f':
961959
if (!CompleteKeywordFalse(result))
962960
{
963-
parseSucceed.didSucceed = false;
964-
parseSucceed.errorMsg = _XPLATSTR("Malformed literal");
961+
parseStatus.didSucceed = false;
962+
parseStatus.errorMsg = _XPLATSTR("Malformed literal");
965963
}
966964
break;
967965
case 'n':
968966
if (!CompleteKeywordNull(result))
969967
{
970-
parseSucceed.didSucceed = false;
971-
parseSucceed.errorMsg = _XPLATSTR("Malformed literal");
968+
parseStatus.didSucceed = false;
969+
parseStatus.errorMsg = _XPLATSTR("Malformed literal");
972970
}
973971
break;
974972
case '/':
975973
if (!CompleteComment(result))
976974
{
977-
parseSucceed.didSucceed = false;
978-
parseSucceed.errorMsg = _XPLATSTR("Malformed comment");
975+
parseStatus.didSucceed = false;
976+
parseStatus.errorMsg = _XPLATSTR("Malformed comment");
979977
break;
980978
}
981979
// For now, we're ignoring comments.
982980
goto try_again;
983981
case '"':
984982
if (!CompleteStringLiteral(result))
985983
{
986-
parseSucceed.didSucceed = false;
987-
parseSucceed.errorMsg = _XPLATSTR("Malformed string literal");
984+
parseStatus.didSucceed = false;
985+
parseStatus.errorMsg = _XPLATSTR("Malformed string literal");
988986
}
989987
break;
990988

@@ -1001,27 +999,22 @@ JsonParseStatus JSON_Parser<CharType>::GetNextToken(typename JSON_Parser<CharTyp
1001999
case '9':
10021000
if (!CompleteNumberLiteral(ch, result))
10031001
{
1004-
parseSucceed.didSucceed = false;
1005-
parseSucceed.errorMsg = _XPLATSTR("Malformed numeric literal");
1002+
parseStatus.didSucceed = false;
1003+
parseStatus.errorMsg = _XPLATSTR("Malformed numeric literal");
10061004
}
10071005
break;
10081006
default:
1009-
parseSucceed.didSucceed = false;
1010-
parseSucceed.errorMsg = _XPLATSTR("Malformed token");
1007+
parseStatus.didSucceed = false;
1008+
parseStatus.errorMsg = _XPLATSTR("Malformed token");
10111009
break;
10121010
}
1013-
1014-
return parseSucceed;
10151011
}
10161012

10171013
template <typename CharType>
10181014
std::unique_ptr<web::json::details::_Object> JSON_Parser<CharType>::_ParseObject(typename JSON_Parser<CharType>::Token &tkn, JsonParseStatus& parseStatus)
10191015
{
1020-
parseStatus = GetNextToken(tkn);
1021-
if (!parseStatus.didSucceed)
1022-
{
1023-
return nullptr;
1024-
}
1016+
GetNextToken(tkn, parseStatus);
1017+
if (!parseStatus.didSucceed) return nullptr;
10251018

10261019
auto obj = utility::details::make_unique<web::json::details::_Object>(g_keep_json_object_unsorted);
10271020
auto& elems = obj->m_object.m_elements;
@@ -1043,20 +1036,21 @@ std::unique_ptr<web::json::details::_Object> JSON_Parser<CharType>::_ParseObject
10431036
goto error;
10441037
}
10451038

1046-
parseStatus = GetNextToken(tkn);
1047-
if (!parseStatus.didSucceed) goto getNextTokenError;
1039+
GetNextToken(tkn, parseStatus);
1040+
if (!parseStatus.didSucceed) return nullptr;
10481041

10491042
// State 2: Looking for a colon.
10501043

10511044
if ( tkn.kind != JSON_Parser<CharType>::Token::TKN_Colon ) goto done;
10521045

1053-
parseStatus = GetNextToken(tkn);
1054-
if (!parseStatus.didSucceed) goto getNextTokenError;
1046+
GetNextToken(tkn, parseStatus);
1047+
if (!parseStatus.didSucceed) return nullptr;
1048+
10551049
// State 3: Looking for an expression.
10561050
#ifdef ENABLE_JSON_VALUE_VISUALIZER
10571051
auto fieldValue = _ParseValue(tkn, parseStatus);
10581052

1059-
if (!parseStatus.didSucceed) goto getNextTokenError;
1053+
if (!parseStatus.didSucceed) return nullptr;
10601054
auto type = fieldValue->type();
10611055

10621056
elems.emplace_back(utility::conversions::to_string_t(std::move(fieldName)), json::value(std::move(fieldValue), type));
@@ -1069,8 +1063,8 @@ std::unique_ptr<web::json::details::_Object> JSON_Parser<CharType>::_ParseObject
10691063
switch (tkn.kind)
10701064
{
10711065
case JSON_Parser<CharType>::Token::TKN_Comma:
1072-
parseStatus = GetNextToken(tkn);
1073-
if (!parseStatus.didSucceed) goto getNextTokenError;
1066+
GetNextToken(tkn, parseStatus);
1067+
if (!parseStatus.didSucceed) return nullptr;
10741068
break;
10751069
case JSON_Parser<CharType>::Token::TKN_CloseBrace:
10761070
goto done;
@@ -1082,8 +1076,8 @@ std::unique_ptr<web::json::details::_Object> JSON_Parser<CharType>::_ParseObject
10821076

10831077
done:
10841078

1085-
GetNextToken(tkn);
1086-
if (!parseStatus.didSucceed) goto getNextTokenError;
1079+
GetNextToken(tkn, parseStatus);
1080+
if (!parseStatus.didSucceed) return nullptr;
10871081

10881082
if (!g_keep_json_object_unsorted) {
10891083
::std::sort(elems.begin(), elems.end(), json::object::compare_pairs);
@@ -1095,15 +1089,12 @@ std::unique_ptr<web::json::details::_Object> JSON_Parser<CharType>::_ParseObject
10951089
parseStatus.didSucceed = false;
10961090
parseStatus.errorMsg = _XPLATSTR("Malformed object literal");
10971091
return nullptr;
1098-
1099-
getNextTokenError:
1100-
return nullptr;
11011092
}
11021093

11031094
template <typename CharType>
11041095
std::unique_ptr<web::json::details::_Array> JSON_Parser<CharType>::_ParseArray(typename JSON_Parser<CharType>::Token &tkn, JsonParseStatus& parseStatus)
11051096
{
1106-
parseStatus = GetNextToken(tkn);
1097+
GetNextToken(tkn, parseStatus);
11071098
if (!parseStatus.didSucceed)
11081099
{
11091100
return nullptr;
@@ -1117,20 +1108,20 @@ std::unique_ptr<web::json::details::_Array> JSON_Parser<CharType>::_ParseArray(t
11171108
{
11181109
// State 1: Looking for an expression.
11191110
auto value = ParseValue(tkn, parseStatus);
1120-
if (!parseStatus.didSucceed) goto getNextTokenError;
1111+
if (!parseStatus.didSucceed) return nullptr;
11211112

11221113
result->m_array.m_elements.emplace_back(value);
11231114

11241115
// State 4: Looking for a comma or a closing bracket
11251116
switch (tkn.kind)
11261117
{
11271118
case JSON_Parser<CharType>::Token::TKN_Comma:
1128-
parseStatus = GetNextToken(tkn);
1129-
if (!parseStatus.didSucceed) goto getNextTokenError;
1119+
GetNextToken(tkn, parseStatus);
1120+
if (!parseStatus.didSucceed) return nullptr;
11301121
break;
11311122
case JSON_Parser<CharType>::Token::TKN_CloseBracket:
1132-
parseStatus = GetNextToken(tkn);
1133-
if (!parseStatus.didSucceed) goto getNextTokenError;
1123+
GetNextToken(tkn, parseStatus);
1124+
if (!parseStatus.didSucceed) return nullptr;
11341125

11351126
return result;
11361127
default:
@@ -1142,13 +1133,10 @@ std::unique_ptr<web::json::details::_Array> JSON_Parser<CharType>::_ParseArray(t
11421133
}
11431134
}
11441135

1145-
parseStatus = GetNextToken(tkn);
1146-
if (!parseStatus.didSucceed) goto getNextTokenError;
1136+
GetNextToken(tkn, parseStatus);
1137+
if (!parseStatus.didSucceed) return nullptr;
11471138

11481139
return result;
1149-
1150-
getNextTokenError:
1151-
return nullptr;
11521140
}
11531141

11541142
template <typename CharType>
@@ -1167,8 +1155,8 @@ std::unique_ptr<web::json::details::_Value> JSON_Parser<CharType>::_ParseValue(t
11671155
case JSON_Parser<CharType>::Token::TKN_StringLiteral:
11681156
{
11691157
auto value = utility::details::make_unique<web::json::details::_String>(std::move(tkn.string_val), tkn.has_unescape_symbol);
1170-
parseStatus = GetNextToken(tkn);
1171-
if (!parseStatus.didSucceed) goto getNextTokenError;
1158+
GetNextToken(tkn, parseStatus);
1159+
if (!parseStatus.didSucceed) return nullptr;
11721160
return std::move(value);
11731161
}
11741162
case JSON_Parser<CharType>::Token::TKN_IntegerLiteral:
@@ -1179,40 +1167,37 @@ std::unique_ptr<web::json::details::_Value> JSON_Parser<CharType>::_ParseValue(t
11791167
else
11801168
value = utility::details::make_unique<web::json::details::_Number>(tkn.uint64_val);
11811169

1182-
parseStatus = GetNextToken(tkn);
1183-
if (!parseStatus.didSucceed) goto getNextTokenError;
1170+
GetNextToken(tkn, parseStatus);
1171+
if (!parseStatus.didSucceed) return nullptr;
11841172
return std::move(value);
11851173
}
11861174
case JSON_Parser<CharType>::Token::TKN_NumberLiteral:
11871175
{
11881176
auto value = utility::details::make_unique<web::json::details::_Number>(tkn.double_val);
1189-
parseStatus = GetNextToken(tkn);
1190-
if (!parseStatus.didSucceed) goto getNextTokenError;
1177+
GetNextToken(tkn, parseStatus);
1178+
if (!parseStatus.didSucceed) return nullptr;
11911179
return std::move(value);
11921180
}
11931181
case JSON_Parser<CharType>::Token::TKN_BooleanLiteral:
11941182
{
11951183
auto value = utility::details::make_unique<web::json::details::_Boolean>(tkn.boolean_val);
1196-
parseStatus = GetNextToken(tkn);
1197-
if (!parseStatus.didSucceed) goto getNextTokenError;
1184+
GetNextToken(tkn, parseStatus);
1185+
if (!parseStatus.didSucceed) return nullptr;
11981186
return std::move(value);
11991187
}
12001188
case JSON_Parser<CharType>::Token::TKN_NullLiteral:
12011189
{
1202-
parseStatus = GetNextToken(tkn);
1203-
if (!parseStatus.didSucceed) goto getNextTokenError;
1190+
GetNextToken(tkn, parseStatus);
1191+
if (!parseStatus.didSucceed) return nullptr;
12041192
return utility::details::make_unique<web::json::details::_Null>();
12051193
}
12061194
default:
12071195
{
12081196
parseStatus.didSucceed = false;
12091197
parseStatus.errorMsg = _XPLATSTR("Unexpected token");
1210-
goto getNextTokenError;
1198+
return nullptr;
12111199
}
12121200
}
1213-
1214-
getNextTokenError:
1215-
return nullptr;
12161201
}
12171202

12181203
}}}
@@ -1222,7 +1207,8 @@ static web::json::value _parse_stream(utility::istream_t &stream)
12221207
web::json::details::JSON_StreamParser<utility::char_t> parser(stream);
12231208

12241209
web::json::details::JSON_Parser<utility::char_t>::Token tkn;
1225-
auto parseStatus = parser.GetNextToken(tkn);
1210+
web::json::details::JsonParseStatus parseStatus;
1211+
parser.GetNextToken(tkn, parseStatus);
12261212

12271213
if (!parseStatus.didSucceed)
12281214
{
@@ -1249,7 +1235,9 @@ static web::json::value _parse_narrow_stream(std::istream &stream)
12491235
web::json::details::JSON_StreamParser<char> parser(stream);
12501236

12511237
web::json::details::JSON_StreamParser<char>::Token tkn;
1252-
auto parseStatus = parser.GetNextToken(tkn);
1238+
1239+
web::json::details::JsonParseStatus parseStatus;
1240+
parser.GetNextToken(tkn, parseStatus);
12531241

12541242
if (!parseStatus.didSucceed)
12551243
{
@@ -1276,7 +1264,8 @@ web::json::value web::json::value::parse(const utility::string_t& str)
12761264
web::json::details::JSON_StringParser<utility::char_t> parser(str);
12771265

12781266
web::json::details::JSON_Parser<utility::char_t>::Token tkn;
1279-
auto parseStatus = parser.GetNextToken(tkn);
1267+
web::json::details::JsonParseStatus parseStatus;
1268+
parser.GetNextToken(tkn, parseStatus);
12801269

12811270
if (!parseStatus.didSucceed)
12821271
{
@@ -1302,7 +1291,9 @@ web::json::value web::json::value::parse(const utility::string_t& str, std::erro
13021291
web::json::details::JSON_StringParser<utility::char_t> parser(str);
13031292

13041293
web::json::details::JSON_Parser<utility::char_t>::Token tkn;
1305-
auto parseStatus = parser.GetNextToken(tkn);
1294+
web::json::details::JsonParseStatus parseStatus;
1295+
parser.GetNextToken(tkn, parseStatus);
1296+
13061297
web::json::value returnObject;
13071298

13081299
if (parseStatus.didSucceed)

0 commit comments

Comments
 (0)