@@ -815,40 +815,71 @@ struct JsonParserPriv final {
815
815
void parse_object () {
816
816
assert (states.top () >= VALUE_OBJECT && states.top () <= OBJECT_VALUE);
817
817
818
- values.push (map<string, Json>());
818
+ switch (states.top ()) {
819
+ case VALUE_OBJECT:
820
+ values.push (map<string, Json>());
821
+ set_state (OBJECT_KEY_OR_END);
822
+ break ;
819
823
820
- set_state (OBJECT_KEY_OR_END);
821
- char ch = get_next_token ();
822
- if (ch == ' }' ) {
823
- pop_state ();
824
- return ;
825
- }
824
+ case OBJECT_KEY_OR_END: {
825
+ char ch = get_next_token ();
826
826
827
- while (1 ) {
828
827
if (need_data)
829
- return ;
828
+ break ;
829
+
830
+ if (ch == ' }' )
831
+ return pop_state ();
830
832
831
833
if (ch != ' "' ) {
832
834
values.pop ();
833
- return fail (" expected '\" ' in object, got " + esc (ch));
835
+ fail (" expected '\" ' in object, got " + esc (ch));
836
+ return ;
834
837
}
835
838
836
- set_state (OBJECT_KEY );
839
+ set_state (OBJECT_COLON );
837
840
push_state (VALUE_STRING);
838
- parse_string ();
841
+
842
+ break ;
843
+ }
844
+ case OBJECT_COMMA_OR_END: {
845
+ char ch = get_next_token ();
846
+
839
847
if (need_data)
848
+ break ;
849
+
850
+ if (ch == ' }' ) {
851
+ pop_state ();
840
852
return ;
853
+ }
841
854
842
- string key = values.top ().string_value ();
843
- values.pop ();
855
+ if (ch != ' ,' ) {
856
+ values.pop ();
857
+ fail (" expected ',' or '}' in object, got " + esc (ch));
858
+ return ;
859
+ }
860
+
861
+ set_state (OBJECT_KEY);
844
862
845
- if (failed) {
863
+ break ;
864
+ }
865
+ case OBJECT_KEY: {
866
+ char ch = get_next_token ();
867
+
868
+ if (need_data)
869
+ break ;
870
+
871
+ if (ch != ' "' ) {
846
872
values.pop ();
847
- return values. push ( Json ( ));
873
+ return fail ( " expected ' \" ' in object, got " + esc (ch ));
848
874
}
849
875
850
876
set_state (OBJECT_COLON);
851
- ch = get_next_token ();
877
+ push_state (VALUE_STRING);
878
+
879
+ break ;
880
+ }
881
+ case OBJECT_COLON: {
882
+ char ch = get_next_token ();
852
883
if (need_data)
853
884
return ;
854
885
@@ -859,38 +890,23 @@ struct JsonParserPriv final {
859
890
860
891
set_state (OBJECT_VALUE);
861
892
push_state (EXPECT_VALUE);
862
- parse_json ();
863
- if (need_data)
864
- return ;
865
-
893
+ break ;
894
+ }
895
+ case OBJECT_VALUE: {
866
896
Json value = values.top ();
867
897
values.pop ();
868
-
869
- if (failed) {
870
- values.pop ();
871
- return values.push (Json ());
872
- }
873
-
898
+ string key = values.top ().string_value ();
899
+ values.pop ();
874
900
map<string, Json> data = values.top ().object_items ();
875
901
data[std::move (key)] = value;
876
902
values.pop ();
877
903
values.push (data);
878
904
879
905
set_state (OBJECT_COMMA_OR_END);
880
- ch = get_next_token ();
881
- if (need_data)
882
- return ;
883
-
884
- if (ch == ' }' ) {
885
- pop_state ();
886
- break ;
887
- }
888
-
889
- if (ch != ' ,' ) {
890
- values.pop ();
891
- return fail (" expected ',' in object, got " + esc (ch));
892
- }
893
- ch = get_next_token ();
906
+ break ;
907
+ }
908
+ default :
909
+ assert (false );
894
910
}
895
911
}
896
912
@@ -901,59 +917,62 @@ struct JsonParserPriv final {
901
917
void parse_array () {
902
918
assert (states.top () >= VALUE_ARRAY && states.top () <= ARRAY_VALUE);
903
919
904
- values.push (vector<Json>());
920
+ switch (states.top ()) {
921
+ case VALUE_ARRAY:
922
+ values.push (vector<Json>());
923
+ set_state (ARRAY_VALUE_OR_END);
924
+ break ;
905
925
906
- set_state ( ARRAY_VALUE_OR_END);
907
- char ch = get_next_token ();
926
+ case ARRAY_VALUE_OR_END: {
927
+ char ch = get_next_token ();
908
928
909
- if (ch == ' ]' ) {
910
- pop_state ();
911
- return ;
912
- }
913
-
914
- while (1 ) {
915
929
if (need_data)
916
930
return ;
917
931
932
+ if (ch == ' ]' )
933
+ return pop_state ();
934
+
918
935
i--;
919
936
920
937
set_state (ARRAY_VALUE);
921
938
push_state (EXPECT_VALUE);
922
939
923
- parse_json ();
940
+ break ;
941
+ }
942
+ case ARRAY_COMMA_OR_END: {
943
+ char ch = get_next_token ();
924
944
if (need_data)
925
945
return ;
926
946
927
- Json value = values.top ();
928
- values.pop ();
929
-
930
- if (failed) {
947
+ if (ch == ' ]' ) {
948
+ pop_state ();
949
+ return ;
950
+ }
951
+ if (ch != ' ,' ) {
931
952
values.pop ();
932
- return values.push (Json ());
953
+ fail (" expected ',' in list, got " + esc (ch));
954
+ return ;
933
955
}
934
956
957
+ set_state (ARRAY_VALUE_OR_END);
958
+
959
+ break ;
960
+ }
961
+ case ARRAY_VALUE: {
962
+ Json value = values.top ();
963
+ values.pop ();
964
+
935
965
vector<Json> data = values.top ().array_items ();
936
966
data.push_back (value);
937
967
values.pop ();
938
968
values.push (data);
939
969
940
970
set_state (ARRAY_COMMA_OR_END);
941
- ch = get_next_token ();
942
- if (need_data)
943
- return ;
944
-
945
- if (ch == ' ]' ) {
946
- pop_state ();
947
- break ;
948
- }
949
-
950
- if (ch != ' ,' ) {
951
- values.pop ();
952
- return fail (" expected ',' in list, got " + esc (ch));
953
- }
954
971
955
- ch = get_next_token ();
956
- (void )ch;
972
+ break ;
973
+ }
974
+ default :
975
+ assert (false );
957
976
}
958
977
}
959
978
@@ -974,42 +993,79 @@ struct JsonParserPriv final {
974
993
975
994
if (ch == ' -' || (ch >= ' 0' && ch <= ' 9' )) {
976
995
i--;
977
- set_state (VALUE_NUMBER);
978
- return parse_number ();
996
+ return set_state (VALUE_NUMBER);
979
997
}
980
998
981
- if (ch == ' t' ) {
982
- set_state (VALUE_TRUE);
983
- return parse_true ();
984
- }
999
+ if (ch == ' t' )
1000
+ return set_state (VALUE_TRUE);
985
1001
986
- if (ch == ' f' ) {
987
- set_state (VALUE_FALSE);
988
- return parse_false ();
989
- }
1002
+ if (ch == ' f' )
1003
+ return set_state (VALUE_FALSE);
990
1004
991
- if (ch == ' n' ) {
992
- set_state (VALUE_NULL);
993
- return parse_null ();
994
- }
1005
+ if (ch == ' n' )
1006
+ return set_state (VALUE_NULL);
995
1007
996
- if (ch == ' "' ) {
997
- set_state (VALUE_STRING);
998
- return parse_string ();
999
- }
1008
+ if (ch == ' "' )
1009
+ return set_state (VALUE_STRING);
1000
1010
1001
- if (ch == ' {' ) {
1002
- set_state (VALUE_OBJECT);
1003
- return parse_object ();
1004
- }
1011
+ if (ch == ' {' )
1012
+ return set_state (VALUE_OBJECT);
1005
1013
1006
- if (ch == ' [' ) {
1007
- set_state (VALUE_ARRAY);
1008
- return parse_array ();
1009
- }
1014
+ if (ch == ' [' )
1015
+ return set_state (VALUE_ARRAY);
1010
1016
1011
1017
return fail (" expected value, got " + esc (ch));
1012
1018
}
1019
+
1020
+ void consume (const std::string &in = std::string()) {
1021
+ need_data = false ;
1022
+ str += in;
1023
+
1024
+ /* try to parse as much as possible */
1025
+ while (!states.empty ()) {
1026
+ switch (states.top ()) {
1027
+ case EXPECT_VALUE:
1028
+ parse_json ();
1029
+ break ;
1030
+ case VALUE_OBJECT:
1031
+ case OBJECT_KEY_OR_END:
1032
+ case OBJECT_COMMA_OR_END:
1033
+ case OBJECT_KEY:
1034
+ case OBJECT_COLON:
1035
+ case OBJECT_VALUE:
1036
+ parse_object ();
1037
+ break ;
1038
+ case VALUE_ARRAY:
1039
+ case ARRAY_VALUE_OR_END:
1040
+ case ARRAY_COMMA_OR_END:
1041
+ case ARRAY_VALUE:
1042
+ parse_array ();
1043
+ break ;
1044
+ case VALUE_STRING:
1045
+ parse_string ();
1046
+ break ;
1047
+ case VALUE_NUMBER:
1048
+ parse_number ();
1049
+ break ;
1050
+ case VALUE_TRUE:
1051
+ parse_true ();
1052
+ break ;
1053
+ case VALUE_FALSE:
1054
+ parse_false ();
1055
+ break ;
1056
+ case VALUE_NULL:
1057
+ parse_null ();
1058
+ break ;
1059
+ case VALUE_COMMENT:
1060
+ consume_comment ();
1061
+ break ;
1062
+ }
1063
+
1064
+ if (failed || need_data)
1065
+ break ;
1066
+ }
1067
+ }
1068
+
1013
1069
};
1014
1070
1015
1071
JsonParser::JsonParser ():
@@ -1024,21 +1080,20 @@ JsonParser::~JsonParser() {
1024
1080
}
1025
1081
1026
1082
void JsonParser::consume (const std::string &in) {
1027
- parser->str = in;
1028
- parser->eof = true ;
1029
- parser->parse_json ();
1083
+ parser->consume (in);
1030
1084
}
1031
1085
1032
1086
Json JsonParser::json () const {
1087
+ parser->eof = true ;
1088
+ parser->consume ();
1033
1089
return parser->values .top ();
1034
1090
}
1035
1091
1036
1092
Json Json::parse (const string &in, string &err, JsonParse strategy) {
1037
1093
JsonParserPriv parser { in, err, strategy };
1038
1094
assert (parser.states .size () == 1 );
1039
-
1040
1095
parser.eof = true ;
1041
- parser.parse_json ();
1096
+ parser.consume ();
1042
1097
1043
1098
// Check for any trailing garbage
1044
1099
parser.consume_garbage ();
@@ -1047,12 +1102,6 @@ Json Json::parse(const string &in, string &err, JsonParse strategy) {
1047
1102
return Json ();
1048
1103
}
1049
1104
1050
- if (parser.need_data ) {
1051
- /* when doing full parsing, this is an error */
1052
- parser.failed = true ;
1053
- parser.values .push (Json ());
1054
- }
1055
-
1056
1105
#ifndef NDEBUG
1057
1106
if (!parser.failed ) {
1058
1107
assert (parser.values .size () == 1 );
@@ -1072,11 +1121,7 @@ vector<Json> Json::parse_multi(const string &in,
1072
1121
parser_stop_pos = 0 ;
1073
1122
vector<Json> json_vec;
1074
1123
while (parser.i != in.size () && !parser.failed && !parser.need_data ) {
1075
- parser.parse_json ();
1076
- if (parser.need_data ) {
1077
- parser.failed = true ;
1078
- parser.values .push (Json ());
1079
- }
1124
+ parser.consume ();
1080
1125
#ifndef NDEBUG
1081
1126
if (!parser.failed )
1082
1127
assert (parser.values .size () == 1 );
0 commit comments