cl_token/
token_type.rs

1//! Stores a [Token's](super::Token) lexical information
2use std::{fmt::Display, str::FromStr};
3
4/// Stores a [Token's](super::Token) lexical information
5#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
6pub enum TokenKind {
7    /// Invalid sequence
8    Invalid,
9    /// Any kind of comment
10    Comment,
11    /// Any tokenizable literal (See [TokenData](super::TokenData))
12    Literal,
13    /// A non-keyword identifier
14    Identifier,
15    // A keyword
16    As,       // as
17    Break,    // "break"
18    Cl,       // "cl"
19    Const,    // "const"
20    Continue, // "continue"
21    Else,     // "else"
22    Enum,     // "enum"
23    False,    // "false"
24    Fn,       // "fn"
25    For,      // "for"
26    If,       // "if"
27    Impl,     // "impl"
28    In,       // "in"
29    Let,      // "let"
30    Loop,     // "loop"
31    Match,    // "match"
32    Mod,      // "mod"
33    Mut,      // "mut"
34    Pub,      // "pub"
35    Return,   // "return"
36    SelfTy,   // "Self"
37    Static,   // "static"
38    Struct,   // "struct"
39    Super,    // "super"
40    True,     // "true"
41    Type,     // "type"
42    Use,      // "use"
43    While,    // "while"
44    // Delimiter or punctuation
45    LCurly,     // {
46    RCurly,     // }
47    LBrack,     // [
48    RBrack,     // ]
49    LParen,     // (
50    RParen,     // )
51    Amp,        // &
52    AmpAmp,     // &&
53    AmpEq,      // &=
54    Arrow,      // ->
55    At,         // @
56    Backslash,  // \
57    Bang,       // !
58    BangBang,   // !!
59    BangEq,     // !=
60    Bar,        // |
61    BarBar,     // ||
62    BarEq,      // |=
63    Colon,      // :
64    ColonColon, // ::
65    Comma,      // ,
66    Dot,        // .
67    DotDot,     // ..
68    DotDotEq,   // ..=
69    Eq,         // =
70    EqEq,       // ==
71    FatArrow,   // =>
72    Grave,      // `
73    Gt,         // >
74    GtEq,       // >=
75    GtGt,       // >>
76    GtGtEq,     // >>=
77    Hash,       // #
78    HashBang,   // #!
79    Lt,         // <
80    LtEq,       // <=
81    LtLt,       // <<
82    LtLtEq,     // <<=
83    Minus,      // -
84    MinusEq,    // -=
85    Plus,       // +
86    PlusEq,     // +=
87    Question,   // ?
88    Rem,        // %
89    RemEq,      // %=
90    Semi,       // ;
91    Slash,      // /
92    SlashEq,    // /=
93    Star,       // *
94    StarEq,     // *=
95    Tilde,      // ~
96    Xor,        // ^
97    XorEq,      // ^=
98    XorXor,     // ^^
99}
100
101impl Display for TokenKind {
102    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
103        match self {
104            TokenKind::Invalid => "invalid".fmt(f),
105            TokenKind::Comment => "comment".fmt(f),
106            TokenKind::Literal => "literal".fmt(f),
107            TokenKind::Identifier => "identifier".fmt(f),
108
109            TokenKind::As => "as".fmt(f),
110            TokenKind::Break => "break".fmt(f),
111            TokenKind::Cl => "cl".fmt(f),
112            TokenKind::Const => "const".fmt(f),
113            TokenKind::Continue => "continue".fmt(f),
114            TokenKind::Else => "else".fmt(f),
115            TokenKind::Enum => "enum".fmt(f),
116            TokenKind::False => "false".fmt(f),
117            TokenKind::Fn => "fn".fmt(f),
118            TokenKind::For => "for".fmt(f),
119            TokenKind::If => "if".fmt(f),
120            TokenKind::Impl => "impl".fmt(f),
121            TokenKind::In => "in".fmt(f),
122            TokenKind::Let => "let".fmt(f),
123            TokenKind::Loop => "loop".fmt(f),
124            TokenKind::Match => "match".fmt(f),
125            TokenKind::Mod => "mod".fmt(f),
126            TokenKind::Mut => "mut".fmt(f),
127            TokenKind::Pub => "pub".fmt(f),
128            TokenKind::Return => "return".fmt(f),
129            TokenKind::SelfTy => "Self".fmt(f),
130            TokenKind::Static => "static".fmt(f),
131            TokenKind::Struct => "struct".fmt(f),
132            TokenKind::Super => "super".fmt(f),
133            TokenKind::True => "true".fmt(f),
134            TokenKind::Type => "type".fmt(f),
135            TokenKind::Use => "use".fmt(f),
136            TokenKind::While => "while".fmt(f),
137
138            TokenKind::LCurly => "{".fmt(f),
139            TokenKind::RCurly => "}".fmt(f),
140            TokenKind::LBrack => "[".fmt(f),
141            TokenKind::RBrack => "]".fmt(f),
142            TokenKind::LParen => "(".fmt(f),
143            TokenKind::RParen => ")".fmt(f),
144            TokenKind::Amp => "&".fmt(f),
145            TokenKind::AmpAmp => "&&".fmt(f),
146            TokenKind::AmpEq => "&=".fmt(f),
147            TokenKind::Arrow => "->".fmt(f),
148            TokenKind::At => "@".fmt(f),
149            TokenKind::Backslash => "\\".fmt(f),
150            TokenKind::Bang => "!".fmt(f),
151            TokenKind::BangBang => "!!".fmt(f),
152            TokenKind::BangEq => "!=".fmt(f),
153            TokenKind::Bar => "|".fmt(f),
154            TokenKind::BarBar => "||".fmt(f),
155            TokenKind::BarEq => "|=".fmt(f),
156            TokenKind::Colon => ":".fmt(f),
157            TokenKind::ColonColon => "::".fmt(f),
158            TokenKind::Comma => ",".fmt(f),
159            TokenKind::Dot => ".".fmt(f),
160            TokenKind::DotDot => "..".fmt(f),
161            TokenKind::DotDotEq => "..=".fmt(f),
162            TokenKind::Eq => "=".fmt(f),
163            TokenKind::EqEq => "==".fmt(f),
164            TokenKind::FatArrow => "=>".fmt(f),
165            TokenKind::Grave => "`".fmt(f),
166            TokenKind::Gt => ">".fmt(f),
167            TokenKind::GtEq => ">=".fmt(f),
168            TokenKind::GtGt => ">>".fmt(f),
169            TokenKind::GtGtEq => ">>=".fmt(f),
170            TokenKind::Hash => "#".fmt(f),
171            TokenKind::HashBang => "#!".fmt(f),
172            TokenKind::Lt => "<".fmt(f),
173            TokenKind::LtEq => "<=".fmt(f),
174            TokenKind::LtLt => "<<".fmt(f),
175            TokenKind::LtLtEq => "<<=".fmt(f),
176            TokenKind::Minus => "-".fmt(f),
177            TokenKind::MinusEq => "-=".fmt(f),
178            TokenKind::Plus => "+".fmt(f),
179            TokenKind::PlusEq => "+=".fmt(f),
180            TokenKind::Question => "?".fmt(f),
181            TokenKind::Rem => "%".fmt(f),
182            TokenKind::RemEq => "%=".fmt(f),
183            TokenKind::Semi => ";".fmt(f),
184            TokenKind::Slash => "/".fmt(f),
185            TokenKind::SlashEq => "/=".fmt(f),
186            TokenKind::Star => "*".fmt(f),
187            TokenKind::StarEq => "*=".fmt(f),
188            TokenKind::Tilde => "~".fmt(f),
189            TokenKind::Xor => "^".fmt(f),
190            TokenKind::XorEq => "^=".fmt(f),
191            TokenKind::XorXor => "^^".fmt(f),
192        }
193    }
194}
195impl FromStr for TokenKind {
196    /// [FromStr] can only fail when an identifier isn't a keyword
197    type Err = ();
198    /// Parses a string s to return a Keyword
199    fn from_str(s: &str) -> Result<Self, Self::Err> {
200        Ok(match s {
201            "as" => Self::As,
202            "break" => Self::Break,
203            "cl" => Self::Cl,
204            "const" => Self::Const,
205            "continue" => Self::Continue,
206            "else" => Self::Else,
207            "enum" => Self::Enum,
208            "false" => Self::False,
209            "fn" => Self::Fn,
210            "for" => Self::For,
211            "if" => Self::If,
212            "impl" => Self::Impl,
213            "in" => Self::In,
214            "let" => Self::Let,
215            "loop" => Self::Loop,
216            "match" => Self::Match,
217            "mod" => Self::Mod,
218            "mut" => Self::Mut,
219            "pub" => Self::Pub,
220            "return" => Self::Return,
221            "Self" => Self::SelfTy,
222            "static" => Self::Static,
223            "struct" => Self::Struct,
224            "super" => Self::Super,
225            "true" => Self::True,
226            "type" => Self::Type,
227            "use" => Self::Use,
228            "while" => Self::While,
229            _ => Err(())?,
230        })
231    }
232}