@@ -10,7 +10,6 @@ use num_traits::identities::Zero;
1010use num_traits:: Num ;
1111use std:: char;
1212use std:: cmp:: Ordering ;
13- use std:: collections:: HashMap ;
1413use std:: str:: FromStr ;
1514use unic_emoji_char:: is_emoji_presentation;
1615use unic_ucd_ident:: { is_xid_continue, is_xid_start} ;
@@ -66,52 +65,48 @@ pub struct Lexer<T: Iterator<Item = char>> {
6665 chr1 : Option < char > ,
6766 chr2 : Option < char > ,
6867 location : Location ,
69- keywords : HashMap < String , Tok > ,
7068}
7169
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! {
7571 // 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+ } ;
115110
116111pub type Spanned = ( Location , Tok , Location ) ;
117112pub type LexResult = Result < Spanned , LexicalError > ;
@@ -193,7 +188,6 @@ where
193188 location : Location :: new ( 0 , 0 ) ,
194189 chr1 : None ,
195190 chr2 : None ,
196- keywords : get_keywords ( ) ,
197191 } ;
198192 lxr. next_char ( ) ;
199193 lxr. next_char ( ) ;
@@ -245,8 +239,8 @@ where
245239 }
246240 let end_pos = self . get_pos ( ) ;
247241
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) )
250244 } else {
251245 Ok ( ( start_pos, Tok :: Name { name } , end_pos) )
252246 }
0 commit comments