Simplify index calculation
This commit is contained in:
198
src/test.cpp
198
src/test.cpp
@@ -516,12 +516,7 @@ private:
|
|||||||
self->nextToken();
|
self->nextToken();
|
||||||
MUSTTAIL return keepGoing(self);
|
MUSTTAIL return keepGoing(self);
|
||||||
}
|
}
|
||||||
// If the top of the stack is a terminal that doesn't match, reject
|
MUSTTAIL return table[self->stack.back()][self->currentToken](self);
|
||||||
if (self->stack.back() < T_PAST_END) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
MUSTTAIL return table[self->stack.back() - T_PAST_END][self->currentToken](
|
|
||||||
self);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
PRESERVE_NONE static bool reject(Parser2 *) { return false; }
|
PRESERVE_NONE static bool reject(Parser2 *) { return false; }
|
||||||
@@ -602,7 +597,137 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// table[nonterminal][terminal]
|
// table[nonterminal][terminal]
|
||||||
static constexpr continuation table[N_PAST_END - T_PAST_END][T_PAST_END] = {
|
static constexpr continuation table[N_PAST_END][T_PAST_END] = {
|
||||||
|
/*T_INVALID*/
|
||||||
|
{
|
||||||
|
/*T_INVALID*/ reject,
|
||||||
|
/*T_EOF*/ reject,
|
||||||
|
/*T_LBRACE*/ reject,
|
||||||
|
/*T_RBRACE*/ reject,
|
||||||
|
/*T_COMMA*/ reject,
|
||||||
|
/*T_ATOM*/ reject,
|
||||||
|
/*T_STRING*/ reject,
|
||||||
|
/*T_LBRACKET*/ reject,
|
||||||
|
/*T_RBRACKET*/ reject,
|
||||||
|
/*T_COLON*/ reject,
|
||||||
|
},
|
||||||
|
/*T_EOF*/
|
||||||
|
{
|
||||||
|
/*T_INVALID*/ reject,
|
||||||
|
/*T_EOF*/ reject,
|
||||||
|
/*T_LBRACE*/ reject,
|
||||||
|
/*T_RBRACE*/ reject,
|
||||||
|
/*T_COMMA*/ reject,
|
||||||
|
/*T_ATOM*/ reject,
|
||||||
|
/*T_STRING*/ reject,
|
||||||
|
/*T_LBRACKET*/ reject,
|
||||||
|
/*T_RBRACKET*/ reject,
|
||||||
|
/*T_COLON*/ reject,
|
||||||
|
},
|
||||||
|
/*T_LBRACE*/
|
||||||
|
{
|
||||||
|
/*T_INVALID*/ reject,
|
||||||
|
/*T_EOF*/ reject,
|
||||||
|
/*T_LBRACE*/ reject,
|
||||||
|
/*T_RBRACE*/ reject,
|
||||||
|
/*T_COMMA*/ reject,
|
||||||
|
/*T_ATOM*/ reject,
|
||||||
|
/*T_STRING*/ reject,
|
||||||
|
/*T_LBRACKET*/ reject,
|
||||||
|
/*T_RBRACKET*/ reject,
|
||||||
|
/*T_COLON*/ reject,
|
||||||
|
},
|
||||||
|
/*T_RBRACE*/
|
||||||
|
{
|
||||||
|
/*T_INVALID*/ reject,
|
||||||
|
/*T_EOF*/ reject,
|
||||||
|
/*T_LBRACE*/ reject,
|
||||||
|
/*T_RBRACE*/ reject,
|
||||||
|
/*T_COMMA*/ reject,
|
||||||
|
/*T_ATOM*/ reject,
|
||||||
|
/*T_STRING*/ reject,
|
||||||
|
/*T_LBRACKET*/ reject,
|
||||||
|
/*T_RBRACKET*/ reject,
|
||||||
|
/*T_COLON*/ reject,
|
||||||
|
},
|
||||||
|
/*T_COMMA*/
|
||||||
|
{
|
||||||
|
/*T_INVALID*/ reject,
|
||||||
|
/*T_EOF*/ reject,
|
||||||
|
/*T_LBRACE*/ reject,
|
||||||
|
/*T_RBRACE*/ reject,
|
||||||
|
/*T_COMMA*/ reject,
|
||||||
|
/*T_ATOM*/ reject,
|
||||||
|
/*T_STRING*/ reject,
|
||||||
|
/*T_LBRACKET*/ reject,
|
||||||
|
/*T_RBRACKET*/ reject,
|
||||||
|
/*T_COLON*/ reject,
|
||||||
|
},
|
||||||
|
/*T_ATOM*/
|
||||||
|
{
|
||||||
|
/*T_INVALID*/ reject,
|
||||||
|
/*T_EOF*/ reject,
|
||||||
|
/*T_LBRACE*/ reject,
|
||||||
|
/*T_RBRACE*/ reject,
|
||||||
|
/*T_COMMA*/ reject,
|
||||||
|
/*T_ATOM*/ reject,
|
||||||
|
/*T_STRING*/ reject,
|
||||||
|
/*T_LBRACKET*/ reject,
|
||||||
|
/*T_RBRACKET*/ reject,
|
||||||
|
/*T_COLON*/ reject,
|
||||||
|
},
|
||||||
|
/*T_STRING*/
|
||||||
|
{
|
||||||
|
/*T_INVALID*/ reject,
|
||||||
|
/*T_EOF*/ reject,
|
||||||
|
/*T_LBRACE*/ reject,
|
||||||
|
/*T_RBRACE*/ reject,
|
||||||
|
/*T_COMMA*/ reject,
|
||||||
|
/*T_ATOM*/ reject,
|
||||||
|
/*T_STRING*/ reject,
|
||||||
|
/*T_LBRACKET*/ reject,
|
||||||
|
/*T_RBRACKET*/ reject,
|
||||||
|
/*T_COLON*/ reject,
|
||||||
|
},
|
||||||
|
/*T_LBRACKET*/
|
||||||
|
{
|
||||||
|
/*T_INVALID*/ reject,
|
||||||
|
/*T_EOF*/ reject,
|
||||||
|
/*T_LBRACE*/ reject,
|
||||||
|
/*T_RBRACE*/ reject,
|
||||||
|
/*T_COMMA*/ reject,
|
||||||
|
/*T_ATOM*/ reject,
|
||||||
|
/*T_STRING*/ reject,
|
||||||
|
/*T_LBRACKET*/ reject,
|
||||||
|
/*T_RBRACKET*/ reject,
|
||||||
|
/*T_COLON*/ reject,
|
||||||
|
},
|
||||||
|
/*T_RBRACKET*/
|
||||||
|
{
|
||||||
|
/*T_INVALID*/ reject,
|
||||||
|
/*T_EOF*/ reject,
|
||||||
|
/*T_LBRACE*/ reject,
|
||||||
|
/*T_RBRACE*/ reject,
|
||||||
|
/*T_COMMA*/ reject,
|
||||||
|
/*T_ATOM*/ reject,
|
||||||
|
/*T_STRING*/ reject,
|
||||||
|
/*T_LBRACKET*/ reject,
|
||||||
|
/*T_RBRACKET*/ reject,
|
||||||
|
/*T_COLON*/ reject,
|
||||||
|
},
|
||||||
|
/*T_COLON*/
|
||||||
|
{
|
||||||
|
/*T_INVALID*/ reject,
|
||||||
|
/*T_EOF*/ reject,
|
||||||
|
/*T_LBRACE*/ reject,
|
||||||
|
/*T_RBRACE*/ reject,
|
||||||
|
/*T_COMMA*/ reject,
|
||||||
|
/*T_ATOM*/ reject,
|
||||||
|
/*T_STRING*/ reject,
|
||||||
|
/*T_LBRACKET*/ reject,
|
||||||
|
/*T_RBRACKET*/ reject,
|
||||||
|
/*T_COLON*/ reject,
|
||||||
|
},
|
||||||
/*N_VALUE*/
|
/*N_VALUE*/
|
||||||
{
|
{
|
||||||
/*T_INVALID*/ reject,
|
/*T_INVALID*/ reject,
|
||||||
@@ -659,54 +784,69 @@ private:
|
|||||||
|
|
||||||
Symbol currentToken;
|
Symbol currentToken;
|
||||||
const char *bufBefore;
|
const char *bufBefore;
|
||||||
Symbol nextToken() {
|
void nextToken() {
|
||||||
maybeSkipWs();
|
maybeSkipWs();
|
||||||
bufBefore = buf;
|
bufBefore = buf;
|
||||||
if (len == 0) {
|
if (len == 0) {
|
||||||
return currentToken = T_EOF;
|
currentToken = T_EOF;
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
if (*buf == '{') {
|
if (*buf == '{') {
|
||||||
parseLiteral("{");
|
parseLiteral("{");
|
||||||
return currentToken = T_LBRACE;
|
currentToken = T_LBRACE;
|
||||||
|
return;
|
||||||
} else if (*buf == '[') {
|
} else if (*buf == '[') {
|
||||||
parseLiteral("[");
|
parseLiteral("[");
|
||||||
return currentToken = T_LBRACKET;
|
currentToken = T_LBRACKET;
|
||||||
|
return;
|
||||||
} else if (*buf == '}') {
|
} else if (*buf == '}') {
|
||||||
parseLiteral("}");
|
parseLiteral("}");
|
||||||
return currentToken = T_RBRACE;
|
currentToken = T_RBRACE;
|
||||||
|
return;
|
||||||
} else if (*buf == ']') {
|
} else if (*buf == ']') {
|
||||||
parseLiteral("]");
|
parseLiteral("]");
|
||||||
return currentToken = T_RBRACKET;
|
currentToken = T_RBRACKET;
|
||||||
|
return;
|
||||||
} else if (*buf == ':') {
|
} else if (*buf == ':') {
|
||||||
parseLiteral(":");
|
parseLiteral(":");
|
||||||
return currentToken = T_COLON;
|
currentToken = T_COLON;
|
||||||
|
return;
|
||||||
} else if (*buf == ',') {
|
} else if (*buf == ',') {
|
||||||
parseLiteral(",");
|
parseLiteral(",");
|
||||||
return currentToken = T_COMMA;
|
currentToken = T_COMMA;
|
||||||
|
return;
|
||||||
} else if (*buf == '"') {
|
} else if (*buf == '"') {
|
||||||
if (!parse_string()) {
|
if (!parse_string()) {
|
||||||
return currentToken = T_INVALID;
|
currentToken = T_INVALID;
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
return currentToken = T_STRING;
|
currentToken = T_STRING;
|
||||||
|
return;
|
||||||
} else if (*buf == 't') {
|
} else if (*buf == 't') {
|
||||||
if (!parseLiteral("true")) {
|
if (!parseLiteral("true")) {
|
||||||
return currentToken = T_INVALID;
|
currentToken = T_INVALID;
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
return currentToken = T_ATOM;
|
currentToken = T_ATOM;
|
||||||
|
return;
|
||||||
} else if (*buf == 'f') {
|
} else if (*buf == 'f') {
|
||||||
if (!parseLiteral("false")) {
|
if (!parseLiteral("false")) {
|
||||||
return currentToken = T_INVALID;
|
currentToken = T_INVALID;
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
} else if (*buf == 'n') {
|
} else if (*buf == 'n') {
|
||||||
if (!parseLiteral("null")) {
|
if (!parseLiteral("null")) {
|
||||||
return currentToken = T_INVALID;
|
currentToken = T_INVALID;
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (!parse_number()) {
|
if (!parse_number()) {
|
||||||
return currentToken = T_INVALID;
|
currentToken = T_INVALID;
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return currentToken = T_ATOM;
|
currentToken = T_ATOM;
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *buf;
|
char *buf;
|
||||||
@@ -798,3 +938,15 @@ TEST_CASE("bench") {
|
|||||||
bench.doNotOptimizeAway(parser.parse());
|
bench.doNotOptimizeAway(parser.parse());
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_CASE("bench2") {
|
||||||
|
auto c = Callbacks{};
|
||||||
|
ankerl::nanobench::Bench bench;
|
||||||
|
bench.batch(json.size());
|
||||||
|
bench.unit("byte");
|
||||||
|
bench.run("parser2", [&]() {
|
||||||
|
auto copy = json;
|
||||||
|
Parser2 parser(copy.data(), copy.length(), &c, nullptr);
|
||||||
|
bench.doNotOptimizeAway(parser.parse());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user