python_syntax/
token.rs

1use std::{
2    collections::HashMap,
3    fmt::{self, Display},
4};
5
6#[derive(Debug, Clone, PartialEq)]
7pub enum Token {
8    Eof,
9    Newline,
10    Indent,
11    Dedent,
12    Name(String),
13    Integer(num_bigint::BigUint),
14    Float(f64),
15    Imaginary(f64),
16    String(String),
17    FormattedString(String),
18    Bytes(Vec<u8>),
19
20    // Symbols
21    //
22    // `(`
23    ParenOpen,
24    // `)`
25    ParenClose,
26    // `[`
27    BracketOpen,
28    // `]`
29    BracketClose,
30    // `{`
31    BraceOpen,
32    // `}`
33    BraceClose,
34    // `:`
35    Colon,
36    // `,`
37    Comma,
38    // `;`
39    Semi,
40    // `+`
41    Plus,
42    // `-`
43    Minus,
44    // `*`
45    Star,
46    // `/`
47    Slash,
48    // `|`
49    Pipe,
50    // `&`
51    Amper,
52    // `<`
53    Less,
54    // `>`
55    Greater,
56    // `=`
57    Equal,
58    // `.`
59    Dot,
60    // `%`
61    Percent,
62    // `==`
63    EqEqual,
64    // `!=`
65    NotEqual,
66    // `<=`
67    LessEqual,
68    // `>=`
69    GreaterEqual,
70    // `~`
71    Tilde,
72    // `^`
73    Caret,
74    // `<<`
75    LeftShift,
76    // `>>`
77    RightShift,
78    // `**`
79    DoubleStar,
80    // `+=`
81    PlusEqual,
82    // `-=`
83    MinEqual,
84    // `*=`
85    StarEqual,
86    // `/=`
87    SlashEqual,
88    // `%=`
89    PercentEqual,
90    // `&=`
91    AmperEqual,
92    // `|=`
93    PipeEqual,
94    // `^=`
95    CaretEqual,
96    // `<<=`
97    LeftShiftEqual,
98    // `>>=`
99    RightShiftEqual,
100    // `**=`
101    DoubleStarEqual,
102    // `//`
103    DoubleSlash,
104    // `//=`
105    DoubleSlashEqual,
106    // `@`
107    At,
108    // `@=`
109    AtEqual,
110    // `->`
111    Rarrow,
112    // `...`
113    Ellipsis,
114
115    // Keywords
116    //
117    // `False`
118    False,
119    // `None`
120    None,
121    // `True`
122    True,
123    // `and`
124    And,
125    // `as`
126    As,
127    // `assert`
128    Assert,
129    // `break`
130    Break,
131    // `class`
132    Class,
133    // `continue`
134    Continue,
135    // `def`
136    Def,
137    // `del`
138    Del,
139    // `elif`
140    Elif,
141    // `else`
142    Else,
143    // `except`
144    Except,
145    // `finally`
146    Finally,
147    // `for`
148    For,
149    // `from`
150    From,
151    // `global`
152    Global,
153    // `if`
154    If,
155    // `import`
156    Import,
157    // `in`
158    In,
159    // `is`
160    Is,
161    // `lambda`
162    Lambda,
163    // `nonlocal`
164    Nonlocal,
165    // `not`
166    Not,
167    // `or`
168    Or,
169    // `pass`
170    Pass,
171    // `raise`
172    Raise,
173    // `return`
174    Return,
175    // `try`
176    Try,
177    // `while`
178    While,
179    // `with`
180    With,
181    // `yield`
182    Yield,
183    // `await`
184    Await,
185    // `async`
186    Async,
187
188    // Used by LALRPOP
189    #[doc(hidden)]
190    Module,
191    #[doc(hidden)]
192    Interactive,
193    #[doc(hidden)]
194    Eval,
195}
196
197impl Display for Token {
198    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
199        use Token::*;
200        match self {
201            Eof => write!(f, "EOF"),
202            Newline => write!(f, "newline"),
203            Indent => write!(f, "indent"),
204            Dedent => write!(f, "dedent"),
205            Name(name) => write!(f, "name {}", name),
206            Integer(n) => write!(f, "integer {}", n),
207            Float(n) => write!(f, "float {}", n),
208            Imaginary(n) => write!(f, "complex {}", n),
209            String(_) => write!(f, "string"),
210            FormattedString(_) => write!(f, "formatted string"),
211            Bytes(_) => write!(f, "bytes"),
212            ParenOpen => write!(f, r#"symbol "(""#),
213            ParenClose => write!(f, r#"symbol ")"#),
214            BracketOpen => write!(f, r#"symbol "[""#),
215            BracketClose => write!(f, r#"symbol "]""#),
216            BraceOpen => write!(f, r#"symbol "{{""#),
217            BraceClose => write!(f, r#"symbol \"}}"#),
218            Colon => write!(f, r#"symbol ":""#),
219            Comma => write!(f, r#"symbol ",""#),
220            Semi => write!(f, r#"symbol ";""#),
221            Plus => write!(f, r#"symbol "+""#),
222            Minus => write!(f, r#"symbol "-""#),
223            Star => write!(f, r#"symbol "*""#),
224            Slash => write!(f, r#"symbol "/""#),
225            Pipe => write!(f, r#"symbol "|""#),
226            Amper => write!(f, r#"symbol "&""#),
227            Less => write!(f, r#"symbol "<""#),
228            Greater => write!(f, r#"symbol ">""#),
229            Equal => write!(f, r#"symbol "=""#),
230            Dot => write!(f, r#"symbol ".""#),
231            Percent => write!(f, r#"symbol "%""#),
232            EqEqual => write!(f, r#"symbol "==""#),
233            NotEqual => write!(f, r#"symbol "!=""#),
234            LessEqual => write!(f, r#"symbol "<=""#),
235            GreaterEqual => write!(f, r#"symbol ">=""#),
236            Tilde => write!(f, r#"symbol "~""#),
237            Caret => write!(f, r#"symbol "^""#),
238            LeftShift => write!(f, r#"symbol "<<""#),
239            RightShift => write!(f, r#"symbol ">>""#),
240            DoubleStar => write!(f, r#"symbol "**""#),
241            PlusEqual => write!(f, r#"symbol "+=""#),
242            MinEqual => write!(f, r#"symbol "-=""#),
243            StarEqual => write!(f, r#"symbol "*=""#),
244            SlashEqual => write!(f, r#"symbol "/=""#),
245            PercentEqual => write!(f, r#"symbol "%=""#),
246            AmperEqual => write!(f, r#"symbol "&=""#),
247            PipeEqual => write!(f, r#"symbol "|=""#),
248            CaretEqual => write!(f, r#"symbol "^=""#),
249            LeftShiftEqual => write!(f, r#"symbol """#),
250            RightShiftEqual => write!(f, r#"symbol ">>=""#),
251            DoubleStarEqual => write!(f, r#"symbol "**=""#),
252            DoubleSlash => write!(f, r#"symbol "//""#),
253            DoubleSlashEqual => write!(f, r#"symbol "//=""#),
254            At => write!(f, r#"symbol "@""#),
255            AtEqual => write!(f, r#"symbol "@=""#),
256            Rarrow => write!(f, r#"symbol "->""#),
257            Ellipsis => write!(f, r#"symbol "...""#),
258            False => write!(f, r#"keyword "False""#),
259            None => write!(f, r#"keyword "None""#),
260            True => write!(f, r#"keyword "True""#),
261            And => write!(f, r#"keyword "and""#),
262            As => write!(f, r#"keyword "as""#),
263            Assert => write!(f, r#"keyword "assert""#),
264            Break => write!(f, r#"keyword "break""#),
265            Class => write!(f, r#"keyword "class""#),
266            Continue => write!(f, r#"keyword "continue""#),
267            Def => write!(f, r#"keyword "def""#),
268            Del => write!(f, r#"keyword "del""#),
269            Elif => write!(f, r#"keyword "elif""#),
270            Else => write!(f, r#"keyword "else""#),
271            Except => write!(f, r#"keyword "except""#),
272            Finally => write!(f, r#"keyword "finally""#),
273            For => write!(f, r#"keyword "for""#),
274            From => write!(f, r#"keyword "from""#),
275            Global => write!(f, r#"keyword "global""#),
276            If => write!(f, r#"keyword "if""#),
277            Import => write!(f, r#"keyword "import""#),
278            In => write!(f, r#"keyword "in""#),
279            Is => write!(f, r#"keyword "is""#),
280            Lambda => write!(f, r#"keyword "lambda""#),
281            Nonlocal => write!(f, r#"keyword "nonlocal""#),
282            Not => write!(f, r#"keyword "not""#),
283            Or => write!(f, r#"keyword "or""#),
284            Pass => write!(f, r#"keyword "pass""#),
285            Raise => write!(f, r#"keyword "raise""#),
286            Return => write!(f, r#"keyword "return""#),
287            Try => write!(f, r#"keyword "try""#),
288            While => write!(f, r#"keyword "while""#),
289            With => write!(f, r#"keyword "with""#),
290            Yield => write!(f, r#"keyword "yield""#),
291            Await => write!(f, r#"keyword "await""#),
292            Async => write!(f, r#"keyword "async""#),
293
294            Module => write!(f, "module"),
295            Interactive => write!(f, "interactive"),
296            Eval => write!(f, "eval"),
297        }
298    }
299}
300
301lazy_static::lazy_static! {
302    pub(crate) static ref SYMBOLS: HashMap<&'static str, Token> = {
303        let mut m = HashMap::new();
304        m.insert("(", Token::ParenOpen);
305        m.insert(")", Token::ParenClose);
306        m.insert("[", Token::BracketOpen);
307        m.insert("]", Token::BracketClose);
308        m.insert("{", Token::BraceOpen);
309        m.insert("}", Token::BraceClose);
310        m.insert(":", Token::Colon);
311        m.insert(",", Token::Comma);
312        m.insert(";", Token::Semi);
313        m.insert("+", Token::Plus);
314        m.insert("-", Token::Minus);
315        m.insert("*", Token::Star);
316        m.insert("/", Token::Slash);
317        m.insert("|", Token::Pipe);
318        m.insert("&", Token::Amper);
319        m.insert("<", Token::Less);
320        m.insert(">", Token::Greater);
321        m.insert("=", Token::Equal);
322        m.insert(".", Token::Dot);
323        m.insert("%", Token::Percent);
324        m.insert("==", Token::EqEqual);
325        m.insert("!=", Token::NotEqual);
326        m.insert("<=", Token::LessEqual);
327        m.insert(">=", Token::GreaterEqual);
328        m.insert("~", Token::Tilde);
329        m.insert("^", Token::Caret);
330        m.insert("<<", Token::LeftShift);
331        m.insert(">>", Token::RightShift);
332        m.insert("**", Token::DoubleStar);
333        m.insert("+=", Token::PlusEqual);
334        m.insert("-=", Token::MinEqual);
335        m.insert("*=", Token::StarEqual);
336        m.insert("/=", Token::SlashEqual);
337        m.insert("%=", Token::PercentEqual);
338        m.insert("&=", Token::AmperEqual);
339        m.insert("|=", Token::PipeEqual);
340        m.insert("^=", Token::CaretEqual);
341        m.insert("<<=", Token::LeftShiftEqual);
342        m.insert(">>=", Token::RightShiftEqual);
343        m.insert("**=", Token::DoubleStarEqual);
344        m.insert("//", Token::DoubleSlash);
345        m.insert("//=", Token::DoubleSlashEqual);
346        m.insert("@", Token::At);
347        m.insert("@=", Token::AtEqual);
348        m.insert("->", Token::Rarrow);
349        m.insert("...", Token::Ellipsis);
350        m
351    };
352    pub(crate) static ref KEYWORDS: HashMap<&'static str, Token> = {
353        let mut m = HashMap::new();
354        m.insert("False", Token::False);
355        m.insert("None", Token::None);
356        m.insert("True", Token::True);
357        m.insert("and", Token::And);
358        m.insert("as", Token::As);
359        m.insert("assert", Token::Assert);
360        m.insert("break", Token::Break);
361        m.insert("class", Token::Class);
362        m.insert("continue", Token::Continue);
363        m.insert("def", Token::Def);
364        m.insert("del", Token::Del);
365        m.insert("elif", Token::Elif);
366        m.insert("else", Token::Else);
367        m.insert("except", Token::Except);
368        m.insert("finally", Token::Finally);
369        m.insert("for", Token::For);
370        m.insert("from", Token::From);
371        m.insert("global", Token::Global);
372        m.insert("if", Token::If);
373        m.insert("import", Token::Import);
374        m.insert("in", Token::In);
375        m.insert("is", Token::Is);
376        m.insert("lambda", Token::Lambda);
377        m.insert("nonlocal", Token::Nonlocal);
378        m.insert("not", Token::Not);
379        m.insert("or", Token::Or);
380        m.insert("pass", Token::Pass);
381        m.insert("raise", Token::Raise);
382        m.insert("return", Token::Return);
383        m.insert("try", Token::Try);
384        m.insert("while", Token::While);
385        m.insert("with", Token::With);
386        m.insert("yield", Token::Yield);
387        m.insert("await", Token::Await);
388        m.insert("async", Token::Async);
389        m
390    };
391}