@@ -42,6 +42,42 @@ macro_rules! reserved_word_pattern {
42
42
) ;
43
43
}
44
44
45
+ static SINGLE_TOKEN_LOOKUP : [ Option < Token > ; 127 ] = const {
46
+ let mut table = [ const { None } ; 127 ] ;
47
+ table[ b'^' as usize ] = Some ( Token :: Caret ) ;
48
+ table[ b'$' as usize ] = Some ( Token :: Dollar ) ;
49
+ table[ b'%' as usize ] = Some ( Token :: Percent ) ;
50
+ table[ b'<' as usize ] = Some ( Token :: AngleLeft ) ;
51
+ table[ b'>' as usize ] = Some ( Token :: AngleRight ) ;
52
+ table[ b'*' as usize ] = Some ( Token :: Star ) ;
53
+ table[ b'+' as usize ] = Some ( Token :: Plus ) ;
54
+ table[ b'?' as usize ] = Some ( Token :: QuestionMark ) ;
55
+ table[ b'|' as usize ] = Some ( Token :: Pipe ) ;
56
+ table[ b'&' as usize ] = Some ( Token :: Ampersand ) ;
57
+ table[ b':' as usize ] = Some ( Token :: Colon ) ;
58
+ table[ b')' as usize ] = Some ( Token :: CloseParen ) ;
59
+ table[ b'{' as usize ] = Some ( Token :: OpenBrace ) ;
60
+ table[ b'}' as usize ] = Some ( Token :: CloseBrace ) ;
61
+ table[ b',' as usize ] = Some ( Token :: Comma ) ;
62
+ table[ b'!' as usize ] = Some ( Token :: Not ) ;
63
+ table[ b'[' as usize ] = Some ( Token :: OpenBracket ) ;
64
+ table[ b']' as usize ] = Some ( Token :: CloseBracket ) ;
65
+ table[ b'-' as usize ] = Some ( Token :: Dash ) ;
66
+ table[ b'.' as usize ] = Some ( Token :: Dot ) ;
67
+ table[ b';' as usize ] = Some ( Token :: Semicolon ) ;
68
+ table[ b'=' as usize ] = Some ( Token :: Equals ) ;
69
+ table
70
+ } ;
71
+
72
+ fn lookup_single ( c : char ) -> Option < Token > {
73
+ let c = c as u32 ;
74
+ if c < 128 {
75
+ SINGLE_TOKEN_LOOKUP [ c as usize ]
76
+ } else {
77
+ None
78
+ }
79
+ }
80
+
45
81
pub ( crate ) fn tokenize ( mut input : & str ) -> Vec < ( Token , Span ) > {
46
82
let mut result = vec ! [ ] ;
47
83
let mut offset = 0 ;
@@ -64,28 +100,7 @@ pub(crate) fn tokenize(mut input: &str) -> Vec<(Token, Span)> {
64
100
if input. starts_with( "<<" ) => ( 2 , Token :: LookBehind ) ;
65
101
if input. starts_with( "::" ) => ( 2 , Token :: DoubleColon ) ;
66
102
67
- if c == '^' => ( 1 , Token :: Caret ) ;
68
- if c == '$' => ( 1 , Token :: Dollar ) ;
69
- if c == '<' => ( 1 , Token :: AngleLeft ) ;
70
- if c == '>' => ( 1 , Token :: AngleRight ) ;
71
- if c == '%' => ( 1 , Token :: BWord ) ;
72
- if c == '*' => ( 1 , Token :: Star ) ;
73
- if c == '+' => ( 1 , Token :: Plus ) ;
74
- if c == '?' => ( 1 , Token :: QuestionMark ) ;
75
- if c == '|' => ( 1 , Token :: Pipe ) ;
76
- if c == '&' => ( 1 , Token :: Ampersand ) ;
77
- if c == ':' => ( 1 , Token :: Colon ) ;
78
- if c == ')' => ( 1 , Token :: CloseParen ) ;
79
- if c == '{' => ( 1 , Token :: OpenBrace ) ;
80
- if c == '}' => ( 1 , Token :: CloseBrace ) ;
81
- if c == ',' => ( 1 , Token :: Comma ) ;
82
- if c == '!' => ( 1 , Token :: Not ) ;
83
- if c == '[' => ( 1 , Token :: OpenBracket ) ;
84
- if c == '-' => ( 1 , Token :: Dash ) ;
85
- if c == ']' => ( 1 , Token :: CloseBracket ) ;
86
- if c == '.' => ( 1 , Token :: Dot ) ;
87
- if c == ';' => ( 1 , Token :: Semicolon ) ;
88
- if c == '=' => ( 1 , Token :: Equals ) ;
103
+ if let Some ( token) = lookup_single( c) => ( 1 , token) ;
89
104
90
105
if c == '\'' => match input[ 1 ..] . find( '\'' ) {
91
106
Some ( len_inner) => ( len_inner + 2 , Token :: String ) ,
0 commit comments