diff --git a/src/json.hpp b/src/json.hpp index dfd78e58..5e417dff 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -2412,10 +2412,12 @@ class basic_json /// constructor for strings inline parser(const std::string& s) : buffer(s) { + buffer += " "; + // set buffer for RE2C buffer_re2c = reinterpret_cast(buffer.c_str()); // set a pointer past the end of the buffer - buffer_re2c_limit = buffer_re2c + buffer.size(); + buffer_re2c_limit = buffer_re2c + buffer.size() - 5; // read first token get_token(); } @@ -2429,11 +2431,13 @@ class basic_json std::getline(_is, input_line); buffer += input_line; } + + buffer += " "; // set buffer for RE2C buffer_re2c = reinterpret_cast(buffer.c_str()); // set a pointer past the end of the buffer - buffer_re2c_limit = buffer_re2c + buffer.size(); + buffer_re2c_limit = buffer_re2c + buffer.size() - 5; // read first token get_token(); } @@ -2601,704 +2605,359 @@ class basic_json const lexer_char_t* marker; // set up RE2C - + for (;;) { // set current to the begin of the buffer current_re2c = buffer_re2c; + +{ + lexer_char_t yych; + unsigned int yyaccept = 0; + static const unsigned char yybm[] = { + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 192, 192, 64, 64, 192, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 192, 64, 0, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 0, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + }; - { - lexer_char_t yych; - unsigned int yyaccept = 0; - static const unsigned char yybm[] = - { - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 192, 192, 64, 64, 192, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 192, 64, 0, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 0, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - }; - - yych = *buffer_re2c; - if (yych <= ':') - { - if (yych <= '!') - { - if (yych <= '\f') - { - if (yych <= 0x08) - { - goto json_parser_3; - } - if (yych <= '\n') - { - goto json_parser_5; - } - goto json_parser_3; - } - else - { - if (yych <= '\r') - { - goto json_parser_5; - } - if (yych == ' ') - { - goto json_parser_5; - } - goto json_parser_3; - } - } - else - { - if (yych <= '-') - { - if (yych <= '"') - { - goto json_parser_6; - } - if (yych <= '+') - { - goto json_parser_3; - } - if (yych <= ',') - { - goto json_parser_7; - } - goto json_parser_9; - } - else - { - if (yych <= '/') - { - goto json_parser_3; - } - if (yych <= '0') - { - goto json_parser_10; - } - if (yych <= '9') - { - goto json_parser_12; - } - goto json_parser_13; - } - } - } - else - { - if (yych <= 'm') - { - if (yych <= '\\') - { - if (yych == '[') - { - goto json_parser_15; - } - goto json_parser_3; - } - else - { - if (yych <= ']') - { - goto json_parser_17; - } - if (yych == 'f') - { - goto json_parser_19; - } - goto json_parser_3; - } - } - else - { - if (yych <= 'z') - { - if (yych <= 'n') - { - goto json_parser_20; - } - if (yych == 't') - { - goto json_parser_21; - } - goto json_parser_3; - } - else - { - if (yych <= '{') - { - goto json_parser_22; - } - if (yych == '}') - { - goto json_parser_24; - } - goto json_parser_3; - } - } - } + yych = *buffer_re2c; + if (yych <= ':') { + if (yych <= '!') { + if (yych <= '\f') { + if (yych <= 0x08) goto json_parser_3; + if (yych <= '\n') goto json_parser_5; + goto json_parser_3; + } else { + if (yych <= '\r') goto json_parser_5; + if (yych == ' ') goto json_parser_5; + goto json_parser_3; + } + } else { + if (yych <= '-') { + if (yych <= '"') goto json_parser_6; + if (yych <= '+') goto json_parser_3; + if (yych <= ',') goto json_parser_7; + goto json_parser_9; + } else { + if (yych <= '/') goto json_parser_3; + if (yych <= '0') goto json_parser_10; + if (yych <= '9') goto json_parser_12; + goto json_parser_13; + } + } + } else { + if (yych <= 'm') { + if (yych <= '\\') { + if (yych == '[') goto json_parser_15; + goto json_parser_3; + } else { + if (yych <= ']') goto json_parser_17; + if (yych == 'f') goto json_parser_19; + goto json_parser_3; + } + } else { + if (yych <= 'z') { + if (yych <= 'n') goto json_parser_20; + if (yych == 't') goto json_parser_21; + goto json_parser_3; + } else { + if (yych <= '{') goto json_parser_22; + if (yych == '}') goto json_parser_24; + goto json_parser_3; + } + } + } json_parser_2: - { - continue; - } + { continue; } json_parser_3: - ++buffer_re2c; + ++buffer_re2c; json_parser_4: - { - return last_token = token_type::parse_error; - } + { return last_token = token_type::parse_error; } json_parser_5: - yych = *++buffer_re2c; - goto json_parser_60; + yych = *++buffer_re2c; + goto json_parser_60; json_parser_6: - yyaccept = 0; - yych = *(marker = ++buffer_re2c); - goto json_parser_51; + yyaccept = 0; + yych = *(marker = ++buffer_re2c); + goto json_parser_51; json_parser_7: - ++buffer_re2c; - { - return last_token = token_type::value_separator; - } + ++buffer_re2c; + { return last_token = token_type::value_separator; } json_parser_9: - yych = *++buffer_re2c; - if (yych <= '/') - { - goto json_parser_4; - } - if (yych <= '0') - { - goto json_parser_49; - } - if (yych <= '9') - { - goto json_parser_40; - } - goto json_parser_4; + yych = *++buffer_re2c; + if (yych <= '/') goto json_parser_4; + if (yych <= '0') goto json_parser_49; + if (yych <= '9') goto json_parser_40; + goto json_parser_4; json_parser_10: - yyaccept = 1; - yych = *(marker = ++buffer_re2c); - if (yych <= 'D') - { - if (yych == '.') - { - goto json_parser_42; - } - } - else - { - if (yych <= 'E') - { - goto json_parser_43; - } - if (yych == 'e') - { - goto json_parser_43; - } - } + yyaccept = 1; + yych = *(marker = ++buffer_re2c); + if (yych <= 'D') { + if (yych == '.') goto json_parser_42; + } else { + if (yych <= 'E') goto json_parser_43; + if (yych == 'e') goto json_parser_43; + } json_parser_11: - { - return last_token = token_type::value_number; - } + { return last_token = token_type::value_number; } json_parser_12: - yyaccept = 1; - yych = *(marker = ++buffer_re2c); - goto json_parser_41; + yyaccept = 1; + yych = *(marker = ++buffer_re2c); + goto json_parser_41; json_parser_13: - ++buffer_re2c; - { - return last_token = token_type::name_separator; - } + ++buffer_re2c; + { return last_token = token_type::name_separator; } json_parser_15: - ++buffer_re2c; - { - return last_token = token_type::begin_array; - } + ++buffer_re2c; + { return last_token = token_type::begin_array; } json_parser_17: - ++buffer_re2c; - { - return last_token = token_type::end_array; - } + ++buffer_re2c; + { return last_token = token_type::end_array; } json_parser_19: - yyaccept = 0; - yych = *(marker = ++buffer_re2c); - if (yych == 'a') - { - goto json_parser_35; - } - goto json_parser_4; + yyaccept = 0; + yych = *(marker = ++buffer_re2c); + if (yych == 'a') goto json_parser_35; + goto json_parser_4; json_parser_20: - yyaccept = 0; - yych = *(marker = ++buffer_re2c); - if (yych == 'u') - { - goto json_parser_31; - } - goto json_parser_4; + yyaccept = 0; + yych = *(marker = ++buffer_re2c); + if (yych == 'u') goto json_parser_31; + goto json_parser_4; json_parser_21: - yyaccept = 0; - yych = *(marker = ++buffer_re2c); - if (yych == 'r') - { - goto json_parser_26; - } - goto json_parser_4; + yyaccept = 0; + yych = *(marker = ++buffer_re2c); + if (yych == 'r') goto json_parser_26; + goto json_parser_4; json_parser_22: - ++buffer_re2c; - { - return last_token = token_type::begin_object; - } + ++buffer_re2c; + { return last_token = token_type::begin_object; } json_parser_24: - ++buffer_re2c; - { - return last_token = token_type::end_object; - } + ++buffer_re2c; + { return last_token = token_type::end_object; } json_parser_26: - yych = *++buffer_re2c; - if (yych == 'u') - { - goto json_parser_28; - } + yych = *++buffer_re2c; + if (yych == 'u') goto json_parser_28; json_parser_27: - buffer_re2c = marker; - if (yyaccept == 0) - { - goto json_parser_4; - } - else - { - goto json_parser_11; - } + buffer_re2c = marker; + if (yyaccept == 0) { + goto json_parser_4; + } else { + goto json_parser_11; + } json_parser_28: - yych = *++buffer_re2c; - if (yych != 'e') - { - goto json_parser_27; - } - ++buffer_re2c; - { - return last_token = token_type::literal_true; - } + yych = *++buffer_re2c; + if (yych != 'e') goto json_parser_27; + ++buffer_re2c; + { return last_token = token_type::literal_true; } json_parser_31: - yych = *++buffer_re2c; - if (yych != 'l') - { - goto json_parser_27; - } - yych = *++buffer_re2c; - if (yych != 'l') - { - goto json_parser_27; - } - ++buffer_re2c; - { - return last_token = token_type::literal_null; - } + yych = *++buffer_re2c; + if (yych != 'l') goto json_parser_27; + yych = *++buffer_re2c; + if (yych != 'l') goto json_parser_27; + ++buffer_re2c; + { return last_token = token_type::literal_null; } json_parser_35: - yych = *++buffer_re2c; - if (yych != 'l') - { - goto json_parser_27; - } - yych = *++buffer_re2c; - if (yych != 's') - { - goto json_parser_27; - } - yych = *++buffer_re2c; - if (yych != 'e') - { - goto json_parser_27; - } - ++buffer_re2c; - { - return last_token = token_type::literal_false; - } + yych = *++buffer_re2c; + if (yych != 'l') goto json_parser_27; + yych = *++buffer_re2c; + if (yych != 's') goto json_parser_27; + yych = *++buffer_re2c; + if (yych != 'e') goto json_parser_27; + ++buffer_re2c; + { return last_token = token_type::literal_false; } json_parser_40: - yyaccept = 1; - marker = ++buffer_re2c; - yych = *buffer_re2c; + yyaccept = 1; + marker = ++buffer_re2c; + yych = *buffer_re2c; json_parser_41: - if (yybm[0 + yych] & 32) - { - goto json_parser_40; - } - if (yych <= 'D') - { - if (yych != '.') - { - goto json_parser_11; - } - } - else - { - if (yych <= 'E') - { - goto json_parser_43; - } - if (yych == 'e') - { - goto json_parser_43; - } - goto json_parser_11; - } + if (yybm[0+yych] & 32) { + goto json_parser_40; + } + if (yych <= 'D') { + if (yych != '.') goto json_parser_11; + } else { + if (yych <= 'E') goto json_parser_43; + if (yych == 'e') goto json_parser_43; + goto json_parser_11; + } json_parser_42: - yych = *++buffer_re2c; - if (yych <= '/') - { - goto json_parser_27; - } - if (yych <= '9') - { - goto json_parser_47; - } - goto json_parser_27; + yych = *++buffer_re2c; + if (yych <= '/') goto json_parser_27; + if (yych <= '9') goto json_parser_47; + goto json_parser_27; json_parser_43: - yych = *++buffer_re2c; - if (yych <= ',') - { - if (yych != '+') - { - goto json_parser_27; - } - } - else - { - if (yych <= '-') - { - goto json_parser_44; - } - if (yych <= '/') - { - goto json_parser_27; - } - if (yych <= '9') - { - goto json_parser_45; - } - goto json_parser_27; - } + yych = *++buffer_re2c; + if (yych <= ',') { + if (yych != '+') goto json_parser_27; + } else { + if (yych <= '-') goto json_parser_44; + if (yych <= '/') goto json_parser_27; + if (yych <= '9') goto json_parser_45; + goto json_parser_27; + } json_parser_44: - yych = *++buffer_re2c; - if (yych <= '/') - { - goto json_parser_27; - } - if (yych >= ':') - { - goto json_parser_27; - } + yych = *++buffer_re2c; + if (yych <= '/') goto json_parser_27; + if (yych >= ':') goto json_parser_27; json_parser_45: - ++buffer_re2c; - yych = *buffer_re2c; - if (yych <= '/') - { - goto json_parser_11; - } - if (yych <= '9') - { - goto json_parser_45; - } - goto json_parser_11; + ++buffer_re2c; + yych = *buffer_re2c; + if (yych <= '/') goto json_parser_11; + if (yych <= '9') goto json_parser_45; + goto json_parser_11; json_parser_47: - yyaccept = 1; - marker = ++buffer_re2c; - yych = *buffer_re2c; - if (yych <= 'D') - { - if (yych <= '/') - { - goto json_parser_11; - } - if (yych <= '9') - { - goto json_parser_47; - } - goto json_parser_11; - } - else - { - if (yych <= 'E') - { - goto json_parser_43; - } - if (yych == 'e') - { - goto json_parser_43; - } - goto json_parser_11; - } + yyaccept = 1; + marker = ++buffer_re2c; + yych = *buffer_re2c; + if (yych <= 'D') { + if (yych <= '/') goto json_parser_11; + if (yych <= '9') goto json_parser_47; + goto json_parser_11; + } else { + if (yych <= 'E') goto json_parser_43; + if (yych == 'e') goto json_parser_43; + goto json_parser_11; + } json_parser_49: - yyaccept = 1; - yych = *(marker = ++buffer_re2c); - if (yych <= 'D') - { - if (yych == '.') - { - goto json_parser_42; - } - goto json_parser_11; - } - else - { - if (yych <= 'E') - { - goto json_parser_43; - } - if (yych == 'e') - { - goto json_parser_43; - } - goto json_parser_11; - } + yyaccept = 1; + yych = *(marker = ++buffer_re2c); + if (yych <= 'D') { + if (yych == '.') goto json_parser_42; + goto json_parser_11; + } else { + if (yych <= 'E') goto json_parser_43; + if (yych == 'e') goto json_parser_43; + goto json_parser_11; + } json_parser_50: - ++buffer_re2c; - yych = *buffer_re2c; + ++buffer_re2c; + yych = *buffer_re2c; json_parser_51: - if (yybm[0 + yych] & 64) - { - goto json_parser_50; - } - if (yych <= '"') - { - goto json_parser_53; - } - ++buffer_re2c; - yych = *buffer_re2c; - if (yych <= 'e') - { - if (yych <= '/') - { - if (yych == '"') - { - goto json_parser_50; - } - if (yych <= '.') - { - goto json_parser_27; - } - goto json_parser_50; - } - else - { - if (yych <= '\\') - { - if (yych <= '[') - { - goto json_parser_27; - } - goto json_parser_50; - } - else - { - if (yych == 'b') - { - goto json_parser_50; - } - goto json_parser_27; - } - } - } - else - { - if (yych <= 'q') - { - if (yych <= 'f') - { - goto json_parser_50; - } - if (yych == 'n') - { - goto json_parser_50; - } - goto json_parser_27; - } - else - { - if (yych <= 's') - { - if (yych <= 'r') - { - goto json_parser_50; - } - goto json_parser_27; - } - else - { - if (yych <= 't') - { - goto json_parser_50; - } - if (yych <= 'u') - { - goto json_parser_55; - } - goto json_parser_27; - } - } - } + if (yybm[0+yych] & 64) { + goto json_parser_50; + } + if (yych <= '"') goto json_parser_53; + ++buffer_re2c; + yych = *buffer_re2c; + if (yych <= 'e') { + if (yych <= '/') { + if (yych == '"') goto json_parser_50; + if (yych <= '.') goto json_parser_27; + goto json_parser_50; + } else { + if (yych <= '\\') { + if (yych <= '[') goto json_parser_27; + goto json_parser_50; + } else { + if (yych == 'b') goto json_parser_50; + goto json_parser_27; + } + } + } else { + if (yych <= 'q') { + if (yych <= 'f') goto json_parser_50; + if (yych == 'n') goto json_parser_50; + goto json_parser_27; + } else { + if (yych <= 's') { + if (yych <= 'r') goto json_parser_50; + goto json_parser_27; + } else { + if (yych <= 't') goto json_parser_50; + if (yych <= 'u') goto json_parser_55; + goto json_parser_27; + } + } + } json_parser_53: - ++buffer_re2c; - { - return last_token = token_type::value_string; - } + ++buffer_re2c; + { return last_token = token_type::value_string; } json_parser_55: - ++buffer_re2c; - yych = *buffer_re2c; - if (yych <= '@') - { - if (yych <= '/') - { - goto json_parser_27; - } - if (yych >= ':') - { - goto json_parser_27; - } - } - else - { - if (yych <= 'F') - { - goto json_parser_56; - } - if (yych <= '`') - { - goto json_parser_27; - } - if (yych >= 'g') - { - goto json_parser_27; - } - } + ++buffer_re2c; + yych = *buffer_re2c; + if (yych <= '@') { + if (yych <= '/') goto json_parser_27; + if (yych >= ':') goto json_parser_27; + } else { + if (yych <= 'F') goto json_parser_56; + if (yych <= '`') goto json_parser_27; + if (yych >= 'g') goto json_parser_27; + } json_parser_56: - ++buffer_re2c; - yych = *buffer_re2c; - if (yych <= '@') - { - if (yych <= '/') - { - goto json_parser_27; - } - if (yych >= ':') - { - goto json_parser_27; - } - } - else - { - if (yych <= 'F') - { - goto json_parser_57; - } - if (yych <= '`') - { - goto json_parser_27; - } - if (yych >= 'g') - { - goto json_parser_27; - } - } + ++buffer_re2c; + yych = *buffer_re2c; + if (yych <= '@') { + if (yych <= '/') goto json_parser_27; + if (yych >= ':') goto json_parser_27; + } else { + if (yych <= 'F') goto json_parser_57; + if (yych <= '`') goto json_parser_27; + if (yych >= 'g') goto json_parser_27; + } json_parser_57: - ++buffer_re2c; - yych = *buffer_re2c; - if (yych <= '@') - { - if (yych <= '/') - { - goto json_parser_27; - } - if (yych >= ':') - { - goto json_parser_27; - } - } - else - { - if (yych <= 'F') - { - goto json_parser_58; - } - if (yych <= '`') - { - goto json_parser_27; - } - if (yych >= 'g') - { - goto json_parser_27; - } - } + ++buffer_re2c; + yych = *buffer_re2c; + if (yych <= '@') { + if (yych <= '/') goto json_parser_27; + if (yych >= ':') goto json_parser_27; + } else { + if (yych <= 'F') goto json_parser_58; + if (yych <= '`') goto json_parser_27; + if (yych >= 'g') goto json_parser_27; + } json_parser_58: - ++buffer_re2c; - yych = *buffer_re2c; - if (yych <= '@') - { - if (yych <= '/') - { - goto json_parser_27; - } - if (yych <= '9') - { - goto json_parser_50; - } - goto json_parser_27; - } - else - { - if (yych <= 'F') - { - goto json_parser_50; - } - if (yych <= '`') - { - goto json_parser_27; - } - if (yych <= 'f') - { - goto json_parser_50; - } - goto json_parser_27; - } + ++buffer_re2c; + yych = *buffer_re2c; + if (yych <= '@') { + if (yych <= '/') goto json_parser_27; + if (yych <= '9') goto json_parser_50; + goto json_parser_27; + } else { + if (yych <= 'F') goto json_parser_50; + if (yych <= '`') goto json_parser_27; + if (yych <= 'f') goto json_parser_50; + goto json_parser_27; + } json_parser_59: - ++buffer_re2c; - yych = *buffer_re2c; + ++buffer_re2c; + yych = *buffer_re2c; json_parser_60: - if (yybm[0 + yych] & 128) - { - goto json_parser_59; - } - goto json_parser_2; - } + if (yybm[0+yych] & 128) { + goto json_parser_59; + } + goto json_parser_2; +} } } diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index d76cd09a..74fe6519 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -2412,10 +2412,12 @@ class basic_json /// constructor for strings inline parser(const std::string& s) : buffer(s) { + buffer += " "; + // set buffer for RE2C buffer_re2c = reinterpret_cast(buffer.c_str()); // set a pointer past the end of the buffer - buffer_re2c_limit = buffer_re2c + buffer.size(); + buffer_re2c_limit = buffer_re2c + buffer.size() - 5; // read first token get_token(); } @@ -2429,11 +2431,13 @@ class basic_json std::getline(_is, input_line); buffer += input_line; } + + buffer += " "; // set buffer for RE2C buffer_re2c = reinterpret_cast(buffer.c_str()); // set a pointer past the end of the buffer - buffer_re2c_limit = buffer_re2c + buffer.size(); + buffer_re2c_limit = buffer_re2c + buffer.size() - 5; // read first token get_token(); }