@@ -10,7 +10,6 @@ use num_traits::identities::Zero;
10
10
use num_traits:: Num ;
11
11
use std:: char;
12
12
use std:: cmp:: Ordering ;
13
- use std:: collections:: HashMap ;
14
13
use std:: str:: FromStr ;
15
14
use unic_emoji_char:: is_emoji_presentation;
16
15
use unic_ucd_ident:: { is_xid_continue, is_xid_start} ;
@@ -66,52 +65,48 @@ pub struct Lexer<T: Iterator<Item = char>> {
66
65
chr1 : Option < char > ,
67
66
chr2 : Option < char > ,
68
67
location : Location ,
69
- keywords : HashMap < String , Tok > ,
70
68
}
71
69
72
- pub fn get_keywords ( ) -> HashMap < String , Tok > {
73
- let mut keywords: HashMap < String , Tok > = HashMap :: new ( ) ;
74
-
70
+ pub static KEYWORDS : phf:: Map < & ' static str , Tok > = phf:: phf_map! {
75
71
// Alphabetical keywords:
76
- keywords. insert ( String :: from ( "..." ) , Tok :: Ellipsis ) ;
77
- keywords. insert ( String :: from ( "False" ) , Tok :: False ) ;
78
- keywords. insert ( String :: from ( "None" ) , Tok :: None ) ;
79
- keywords. insert ( String :: from ( "True" ) , Tok :: True ) ;
80
-
81
- keywords. insert ( String :: from ( "and" ) , Tok :: And ) ;
82
- keywords. insert ( String :: from ( "as" ) , Tok :: As ) ;
83
- keywords. insert ( String :: from ( "assert" ) , Tok :: Assert ) ;
84
- keywords. insert ( String :: from ( "async" ) , Tok :: Async ) ;
85
- keywords. insert ( String :: from ( "await" ) , Tok :: Await ) ;
86
- keywords. insert ( String :: from ( "break" ) , Tok :: Break ) ;
87
- keywords. insert ( String :: from ( "class" ) , Tok :: Class ) ;
88
- keywords. insert ( String :: from ( "continue" ) , Tok :: Continue ) ;
89
- keywords. insert ( String :: from ( "def" ) , Tok :: Def ) ;
90
- keywords. insert ( String :: from ( "del" ) , Tok :: Del ) ;
91
- keywords. insert ( String :: from ( "elif" ) , Tok :: Elif ) ;
92
- keywords. insert ( String :: from ( "else" ) , Tok :: Else ) ;
93
- keywords. insert ( String :: from ( "except" ) , Tok :: Except ) ;
94
- keywords. insert ( String :: from ( "finally" ) , Tok :: Finally ) ;
95
- keywords. insert ( String :: from ( "for" ) , Tok :: For ) ;
96
- keywords. insert ( String :: from ( "from" ) , Tok :: From ) ;
97
- keywords. insert ( String :: from ( "global" ) , Tok :: Global ) ;
98
- keywords. insert ( String :: from ( "if" ) , Tok :: If ) ;
99
- keywords. insert ( String :: from ( "import" ) , Tok :: Import ) ;
100
- keywords. insert ( String :: from ( "in" ) , Tok :: In ) ;
101
- keywords. insert ( String :: from ( "is" ) , Tok :: Is ) ;
102
- keywords. insert ( String :: from ( "lambda" ) , Tok :: Lambda ) ;
103
- keywords. insert ( String :: from ( "nonlocal" ) , Tok :: Nonlocal ) ;
104
- keywords. insert ( String :: from ( "not" ) , Tok :: Not ) ;
105
- keywords. insert ( String :: from ( "or" ) , Tok :: Or ) ;
106
- keywords. insert ( String :: from ( "pass" ) , Tok :: Pass ) ;
107
- keywords. insert ( String :: from ( "raise" ) , Tok :: Raise ) ;
108
- keywords. insert ( String :: from ( "return" ) , Tok :: Return ) ;
109
- keywords. insert ( String :: from ( "try" ) , Tok :: Try ) ;
110
- keywords. insert ( String :: from ( "while" ) , Tok :: While ) ;
111
- keywords. insert ( String :: from ( "with" ) , Tok :: With ) ;
112
- keywords. insert ( String :: from ( "yield" ) , Tok :: Yield ) ;
113
- keywords
114
- }
72
+ "..." => Tok :: Ellipsis ,
73
+ "False" => Tok :: False ,
74
+ "None" => Tok :: None ,
75
+ "True" => Tok :: True ,
76
+
77
+ "and" => Tok :: And ,
78
+ "as" => Tok :: As ,
79
+ "assert" => Tok :: Assert ,
80
+ "async" => Tok :: Async ,
81
+ "await" => Tok :: Await ,
82
+ "break" => Tok :: Break ,
83
+ "class" => Tok :: Class ,
84
+ "continue" => Tok :: Continue ,
85
+ "def" => Tok :: Def ,
86
+ "del" => Tok :: Del ,
87
+ "elif" => Tok :: Elif ,
88
+ "else" => Tok :: Else ,
89
+ "except" => Tok :: Except ,
90
+ "finally" => Tok :: Finally ,
91
+ "for" => Tok :: For ,
92
+ "from" => Tok :: From ,
93
+ "global" => Tok :: Global ,
94
+ "if" => Tok :: If ,
95
+ "import" => Tok :: Import ,
96
+ "in" => Tok :: In ,
97
+ "is" => Tok :: Is ,
98
+ "lambda" => Tok :: Lambda ,
99
+ "nonlocal" => Tok :: Nonlocal ,
100
+ "not" => Tok :: Not ,
101
+ "or" => Tok :: Or ,
102
+ "pass" => Tok :: Pass ,
103
+ "raise" => Tok :: Raise ,
104
+ "return" => Tok :: Return ,
105
+ "try" => Tok :: Try ,
106
+ "while" => Tok :: While ,
107
+ "with" => Tok :: With ,
108
+ "yield" => Tok :: Yield ,
109
+ } ;
115
110
116
111
pub type Spanned = ( Location , Tok , Location ) ;
117
112
pub type LexResult = Result < Spanned , LexicalError > ;
@@ -193,7 +188,6 @@ where
193
188
location : Location :: new ( 0 , 0 ) ,
194
189
chr1 : None ,
195
190
chr2 : None ,
196
- keywords : get_keywords ( ) ,
197
191
} ;
198
192
lxr. next_char ( ) ;
199
193
lxr. next_char ( ) ;
@@ -245,8 +239,8 @@ where
245
239
}
246
240
let end_pos = self . get_pos ( ) ;
247
241
248
- if self . keywords . contains_key ( & name) {
249
- Ok ( ( start_pos, self . keywords [ & name ] . clone ( ) , end_pos) )
242
+ if let Some ( tok ) = KEYWORDS . get ( name. as_str ( ) ) {
243
+ Ok ( ( start_pos, tok . clone ( ) , end_pos) )
250
244
} else {
251
245
Ok ( ( start_pos, Tok :: Name { name } , end_pos) )
252
246
}
0 commit comments