diff --git a/src/parser3.h b/src/parser3.h index 8b19107..2902d3b 100644 --- a/src/parser3.h +++ b/src/parser3.h @@ -16,120 +16,307 @@ namespace parser3 { -class NumDfa { +struct NumDfa { constexpr static uint64_t num_dfa_table[256] = { - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6d80db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6d86d80db6db6ull, 0xd8cdb6336db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb0a9edaa4927aaull, 0xdb0ab0daa492c2aull, 0xdb0ab0daa492c2aull, - 0xdb0ab0daa492c2aull, 0xdb0ab0daa492c2aull, 0xdb0ab0daa492c2aull, - 0xdb0ab0daa492c2aull, 0xdb0ab0daa492c2aull, 0xdb0ab0daa492c2aull, - 0xdb0ab0daa492c2aull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xd98db6636636db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xd98db6636636db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, - 0xdb6db6db6db6db6ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x36000ull, + 0x0ull, + 0x36600ull, + 0x12480000000000ull, + 0x0ull, + 0x780aa47b091ec00ull, + 0x780aa47aa91ea80ull, + 0x780aa47aa91ea80ull, + 0x780aa47aa91ea80ull, + 0x780aa47aa91ea80ull, + 0x780aa47aa91ea80ull, + 0x780aa47aa91ea80ull, + 0x780aa47aa91ea80ull, + 0x780aa47aa91ea80ull, + 0x780aa47aa91ea80ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0xc30c000000000ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0xc30c000000000ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, + 0x0ull, }; - uint8_t state = 36; - -public: // Restore this dfa to its start state - void reset() { state = 36; } + void reset() { state = 6; } // Return true if this dfa is in an accept state. You probably want to call // scan until the match ends first. bool accept() const { - return (state & 63) == 18 || (state & 63) == 42 || (state & 63) == 48 || - (state & 63) == 30; + return (state & 63) == 30 || (state & 63) == 36 || (state & 63) == 48 || + (state & 63) == 42; } // return value either points to the first byte which does not match, or // bufEnd. Leaves the dfa in the last state of the match. const char *scan(const char *buf, const char *bufEnd) { - while (buf != bufEnd) { - uint64_t row = num_dfa_table[uint8_t(*buf)]; - auto next = row >> (state & 63); - if ((next & 63) == 54) { - break; + auto state_ = state; + for (;;) { + constexpr int kStride = 16; + if (bufEnd - buf < kStride) [[unlikely]] { + while (buf != bufEnd) { + uint64_t row = num_dfa_table[uint8_t(*buf)]; + auto next = row >> (state_ & 63); + if ((next & 63) == 0) { + break; + } + state_ = next; + ++buf; + } + state = state_; + return buf; + } + for (int i = 0; i < kStride; ++i) { + uint64_t row = num_dfa_table[uint8_t(*buf)]; + auto next = row >> (state_ & 63); + if ((next & 63) == 0) { + state = state_; + return buf; + } + state_ = next; + ++buf; } - state = next; - ++buf; } - return buf; } + +private: + uint64_t state = 6; }; typedef PRESERVE_NONE WeaselJsonStatus (*Continuation)(struct Parser3 *,