From d609790fffa2a706feb5b6c0f43d9beec8ec93e7 Mon Sep 17 00:00:00 2001 From: Niels Date: Wed, 11 Feb 2015 09:51:24 +0100 Subject: [PATCH] added whitespace handling --- src/json.hpp | 444 ++++++++++++++++++++++++---------------------- src/json.hpp.re2c | 9 +- 2 files changed, 242 insertions(+), 211 deletions(-) diff --git a/src/json.hpp b/src/json.hpp index 8bed20b9d..445409339 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -2434,13 +2434,14 @@ class basic_json { char yych; + unsigned int yyaccept = 0; static const unsigned char yybm[] = { 128, 128, 128, 128, 128, 128, 128, 128, + 128, 160, 160, 128, 128, 160, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 0, 128, 128, 128, 128, 128, + 160, 128, 0, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 128, 128, 128, 128, 128, @@ -2470,7 +2471,11 @@ class basic_json 128, 128, 128, 128, 128, 128, 128, 128, }; - yych = *m_cursor; + yych = *(m_marker = m_cursor); + if (yybm[0 + yych] & 32) + { + goto json_parser_3; + } if (yych <= '[') { if (yych <= '-') @@ -2479,11 +2484,11 @@ class basic_json { if (yych <= 0x00) { - goto json_parser_25; + goto json_parser_28; } if (yych >= '"') { - goto json_parser_23; + goto json_parser_26; } } else @@ -2494,9 +2499,9 @@ class basic_json } if (yych <= ',') { - goto json_parser_11; + goto json_parser_13; } - goto json_parser_18; + goto json_parser_21; } } else @@ -2509,19 +2514,19 @@ class basic_json } if (yych <= '0') { - goto json_parser_19; + goto json_parser_22; } - goto json_parser_21; + goto json_parser_24; } else { if (yych <= ':') { - goto json_parser_13; + goto json_parser_15; } if (yych >= '[') { - goto json_parser_3; + goto json_parser_5; } } } @@ -2534,18 +2539,18 @@ class basic_json { if (yych == ']') { - goto json_parser_5; + goto json_parser_7; } } else { if (yych <= 'f') { - goto json_parser_17; + goto json_parser_20; } if (yych >= 'n') { - goto json_parser_15; + goto json_parser_17; } } } @@ -2555,160 +2560,180 @@ class basic_json { if (yych == 't') { - goto json_parser_16; + goto json_parser_19; } } else { if (yych <= '{') { - goto json_parser_7; + goto json_parser_9; } if (yych == '}') { - goto json_parser_9; + goto json_parser_11; } } } } json_parser_2: - m_cursor = m_marker; - goto json_parser_20; + { + return scan(); + } json_parser_3: + ++m_cursor; + yych = *m_cursor; + if (yybm[0 + yych] & 32) + { + goto json_parser_3; + } + goto json_parser_2; +json_parser_5: ++m_cursor; { return token_type::begin_array; } -json_parser_5: +json_parser_7: ++m_cursor; { return token_type::end_array; } -json_parser_7: +json_parser_9: ++m_cursor; { return token_type::begin_object; } -json_parser_9: +json_parser_11: ++m_cursor; { return token_type::end_object; } -json_parser_11: +json_parser_13: ++m_cursor; { return token_type::value_separator; } -json_parser_13: +json_parser_15: ++m_cursor; { return token_type::name_separator; } -json_parser_15: +json_parser_17: yych = *++m_cursor; if (yych == 'u') { - goto json_parser_50; + goto json_parser_53; } - goto json_parser_2; -json_parser_16: - yych = *++m_cursor; - if (yych == 'r') - { - goto json_parser_46; - } - goto json_parser_2; -json_parser_17: - yych = *++m_cursor; - if (yych == 'a') - { - goto json_parser_41; - } - goto json_parser_2; json_parser_18: - yych = *++m_cursor; - if (yych <= '/') + m_cursor = m_marker; + if (yyaccept == 0) { goto json_parser_2; } + else + { + goto json_parser_23; + } +json_parser_19: + yych = *++m_cursor; + if (yych == 'r') + { + goto json_parser_49; + } + goto json_parser_18; +json_parser_20: + yych = *++m_cursor; + if (yych == 'a') + { + goto json_parser_44; + } + goto json_parser_18; +json_parser_21: + yych = *++m_cursor; + if (yych <= '/') + { + goto json_parser_18; + } if (yych <= '0') { - goto json_parser_19; + goto json_parser_22; } if (yych <= '9') { - goto json_parser_21; + goto json_parser_24; } - goto json_parser_2; -json_parser_19: + goto json_parser_18; +json_parser_22: + yyaccept = 1; yych = *(m_marker = ++m_cursor); if (yych <= 'D') { if (yych == '.') { - goto json_parser_34; + goto json_parser_37; } } else { if (yych <= 'E') { - goto json_parser_35; + goto json_parser_38; } if (yych == 'e') { - goto json_parser_35; + goto json_parser_38; } } -json_parser_20: +json_parser_23: { return token_type::value_number; } -json_parser_21: +json_parser_24: + yyaccept = 1; m_marker = ++m_cursor; yych = *m_cursor; if (yybm[0 + yych] & 64) { - goto json_parser_21; + goto json_parser_24; } if (yych <= 'D') { if (yych == '.') { - goto json_parser_34; + goto json_parser_37; } - goto json_parser_20; + goto json_parser_23; } else { if (yych <= 'E') { - goto json_parser_35; + goto json_parser_38; } if (yych == 'e') { - goto json_parser_35; + goto json_parser_38; } - goto json_parser_20; + goto json_parser_23; } -json_parser_23: +json_parser_26: ++m_cursor; yych = *m_cursor; if (yybm[0 + yych] & 128) { - goto json_parser_23; + goto json_parser_26; } if (yych <= '"') { - goto json_parser_28; + goto json_parser_31; } - goto json_parser_27; -json_parser_25: + goto json_parser_30; +json_parser_28: ++m_cursor; { return token_type::end_of_input; } -json_parser_27: +json_parser_30: ++m_cursor; yych = *m_cursor; if (yych <= 'e') @@ -2717,13 +2742,13 @@ json_parser_27: { if (yych == '"') { - goto json_parser_23; + goto json_parser_26; } if (yych <= '.') { - goto json_parser_2; + goto json_parser_18; } - goto json_parser_23; + goto json_parser_26; } else { @@ -2731,17 +2756,17 @@ json_parser_27: { if (yych <= '[') { - goto json_parser_2; + goto json_parser_18; } - goto json_parser_23; + goto json_parser_26; } else { if (yych == 'b') { - goto json_parser_23; + goto json_parser_26; } - goto json_parser_2; + goto json_parser_18; } } } @@ -2751,13 +2776,13 @@ json_parser_27: { if (yych <= 'f') { - goto json_parser_23; + goto json_parser_26; } if (yych == 'n') { - goto json_parser_23; + goto json_parser_26; } - goto json_parser_2; + goto json_parser_18; } else { @@ -2765,115 +2790,28 @@ json_parser_27: { if (yych <= 'r') { - goto json_parser_23; + goto json_parser_26; } - goto json_parser_2; + goto json_parser_18; } else { if (yych <= 't') { - goto json_parser_23; + goto json_parser_26; } if (yych <= 'u') { - goto json_parser_30; + goto json_parser_33; } - goto json_parser_2; + goto json_parser_18; } } } -json_parser_28: - ++m_cursor; - { - return token_type::value_string; - } -json_parser_30: - ++m_cursor; - yych = *m_cursor; - if (yych <= '@') - { - if (yych <= '/') - { - goto json_parser_2; - } - if (yych >= ':') - { - goto json_parser_2; - } - } - else - { - if (yych <= 'F') - { - goto json_parser_31; - } - if (yych <= '`') - { - goto json_parser_2; - } - if (yych >= 'g') - { - goto json_parser_2; - } - } json_parser_31: ++m_cursor; - yych = *m_cursor; - if (yych <= '@') { - if (yych <= '/') - { - goto json_parser_2; - } - if (yych >= ':') - { - goto json_parser_2; - } - } - else - { - if (yych <= 'F') - { - goto json_parser_32; - } - if (yych <= '`') - { - goto json_parser_2; - } - if (yych >= 'g') - { - goto json_parser_2; - } - } -json_parser_32: - ++m_cursor; - yych = *m_cursor; - if (yych <= '@') - { - if (yych <= '/') - { - goto json_parser_2; - } - if (yych >= ':') - { - goto json_parser_2; - } - } - else - { - if (yych <= 'F') - { - goto json_parser_33; - } - if (yych <= '`') - { - goto json_parser_2; - } - if (yych >= 'g') - { - goto json_parser_2; - } + return token_type::value_string; } json_parser_33: ++m_cursor; @@ -2882,160 +2820,248 @@ json_parser_33: { if (yych <= '/') { - goto json_parser_2; + goto json_parser_18; } - if (yych <= '9') + if (yych >= ':') { - goto json_parser_23; + goto json_parser_18; } - goto json_parser_2; } else { if (yych <= 'F') { - goto json_parser_23; + goto json_parser_34; } if (yych <= '`') { - goto json_parser_2; + goto json_parser_18; + } + if (yych >= 'g') + { + goto json_parser_18; + } + } +json_parser_34: + ++m_cursor; + yych = *m_cursor; + if (yych <= '@') + { + if (yych <= '/') + { + goto json_parser_18; + } + if (yych >= ':') + { + goto json_parser_18; + } + } + else + { + if (yych <= 'F') + { + goto json_parser_35; + } + if (yych <= '`') + { + goto json_parser_18; + } + if (yych >= 'g') + { + goto json_parser_18; + } + } +json_parser_35: + ++m_cursor; + yych = *m_cursor; + if (yych <= '@') + { + if (yych <= '/') + { + goto json_parser_18; + } + if (yych >= ':') + { + goto json_parser_18; + } + } + else + { + if (yych <= 'F') + { + goto json_parser_36; + } + if (yych <= '`') + { + goto json_parser_18; + } + if (yych >= 'g') + { + goto json_parser_18; + } + } +json_parser_36: + ++m_cursor; + yych = *m_cursor; + if (yych <= '@') + { + if (yych <= '/') + { + goto json_parser_18; + } + if (yych <= '9') + { + goto json_parser_26; + } + goto json_parser_18; + } + else + { + if (yych <= 'F') + { + goto json_parser_26; + } + if (yych <= '`') + { + goto json_parser_18; } if (yych <= 'f') { - goto json_parser_23; + goto json_parser_26; } - goto json_parser_2; + goto json_parser_18; } -json_parser_34: +json_parser_37: yych = *++m_cursor; if (yych <= '/') { - goto json_parser_2; + goto json_parser_18; } if (yych <= '9') { - goto json_parser_39; + goto json_parser_42; } - goto json_parser_2; -json_parser_35: + goto json_parser_18; +json_parser_38: yych = *++m_cursor; if (yych <= ',') { if (yych != '+') { - goto json_parser_2; + goto json_parser_18; } } else { if (yych <= '-') { - goto json_parser_36; + goto json_parser_39; } if (yych <= '/') { - goto json_parser_2; + goto json_parser_18; } if (yych <= '9') { - goto json_parser_37; + goto json_parser_40; } - goto json_parser_2; + goto json_parser_18; } -json_parser_36: +json_parser_39: yych = *++m_cursor; if (yych <= '/') { - goto json_parser_2; + goto json_parser_18; } if (yych >= ':') { - goto json_parser_2; + goto json_parser_18; } -json_parser_37: +json_parser_40: ++m_cursor; yych = *m_cursor; if (yych <= '/') { - goto json_parser_20; + goto json_parser_23; } if (yych <= '9') { - goto json_parser_37; + goto json_parser_40; } - goto json_parser_20; -json_parser_39: + goto json_parser_23; +json_parser_42: + yyaccept = 1; m_marker = ++m_cursor; yych = *m_cursor; if (yych <= 'D') { if (yych <= '/') { - goto json_parser_20; + goto json_parser_23; } if (yych <= '9') { - goto json_parser_39; + goto json_parser_42; } - goto json_parser_20; + goto json_parser_23; } else { if (yych <= 'E') { - goto json_parser_35; + goto json_parser_38; } if (yych == 'e') { - goto json_parser_35; + goto json_parser_38; } - goto json_parser_20; + goto json_parser_23; } -json_parser_41: +json_parser_44: yych = *++m_cursor; if (yych != 'l') { - goto json_parser_2; + goto json_parser_18; } yych = *++m_cursor; if (yych != 's') { - goto json_parser_2; + goto json_parser_18; } yych = *++m_cursor; if (yych != 'e') { - goto json_parser_2; + goto json_parser_18; } ++m_cursor; { return token_type::literal_false; } -json_parser_46: +json_parser_49: yych = *++m_cursor; if (yych != 'u') { - goto json_parser_2; + goto json_parser_18; } yych = *++m_cursor; if (yych != 'e') { - goto json_parser_2; + goto json_parser_18; } ++m_cursor; { return token_type::literal_true; } -json_parser_50: +json_parser_53: yych = *++m_cursor; if (yych != 'l') { - goto json_parser_2; + goto json_parser_18; } yych = *++m_cursor; if (yych != 'l') { - goto json_parser_2; + goto json_parser_18; } ++m_cursor; { diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index 8bdac9785..818954433 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -2432,13 +2432,18 @@ class basic_json m_start = m_cursor; /*!re2c + re2c:define:YYCTYPE = char; re2c:define:YYCURSOR = m_cursor; re2c:define:YYLIMIT = m_limit; - re2c:define:YYCTYPE = char; re2c:define:YYMARKER = m_marker; + re2c:indent:string = " "; re2c:indent:top = 1; - re2c:yyfill:enable = 0; re2c:labelprefix = "json_parser_"; + re2c:yyfill:enable = 0; + + // whitespace + ws = [ \t\n\r]*; + ws { return scan(); } // structural characters "[" { return token_type::begin_array; }