summaryrefslogtreecommitdiff
path: root/src/parser/lexer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/parser/lexer.cpp')
-rw-r--r--src/parser/lexer.cpp48
1 files changed, 18 insertions, 30 deletions
diff --git a/src/parser/lexer.cpp b/src/parser/lexer.cpp
index 48da163e1..ef25b6302 100644
--- a/src/parser/lexer.cpp
+++ b/src/parser/lexer.cpp
@@ -753,37 +753,25 @@ std::optional<LexResult> idchar(std::string_view in) {
return {};
}
uint8_t c = ctx.peek();
- if (('0' <= c && c <= '9') || ('A' <= c && c <= 'Z') ||
- ('a' <= c && c <= 'z')) {
- ctx.take(1);
- } else {
- switch (c) {
- case '!':
- case '#':
- case '$':
- case '%':
- case '&':
- case '\'':
- case '*':
- case '+':
- case '-':
- case '.':
- case '/':
- case ':':
- case '<':
- case '=':
- case '>':
- case '?':
- case '@':
- case '\\':
- case '^':
- case '_':
- case '`':
- case '|':
- case '~':
- ctx.take(1);
- }
+ // All the allowed characters lie in the range '!' to '~', and within that
+ // range the vast majority of characters are allowed, so it is significantly
+ // faster to check for the disallowed characters instead.
+ if (c < '!' || c > '~') {
+ return ctx.lexed();
+ }
+ switch (c) {
+ case '"':
+ case '(':
+ case ')':
+ case ',':
+ case ';':
+ case '[':
+ case ']':
+ case '{':
+ case '}':
+ return ctx.lexed();
}
+ ctx.take(1);
return ctx.lexed();
}