aiken_lang/parser/
token.rs

1use std::fmt;
2
3#[derive(
4    Clone, Debug, PartialEq, PartialOrd, Ord, Hash, Eq, Copy, serde::Serialize, serde::Deserialize,
5)]
6pub enum Base {
7    Decimal { numeric_underscore: bool },
8    Hexadecimal,
9}
10
11#[derive(Clone, Debug, PartialEq, PartialOrd, Ord, Hash, Eq)]
12pub enum Token {
13    Error(char),
14    Name { name: String },
15    Ordinal { index: u32 },
16    UpName { name: String },
17    DiscardName { name: String },
18    Int { value: String, base: Base },
19    ByteString { value: String },
20    String { value: String },
21    // Groupings
22    NewLineLeftParen, // ↳(
23    LeftParen,        // (
24    RightParen,       // )
25    LeftSquare,       // [
26    RightSquare,      // }
27    LeftBrace,        // {
28    RightBrace,       // }
29    // Int Operators
30    Plus,
31    Minus,
32    NewLineMinus,
33    Star,
34    Slash,
35    Less,
36    Greater,
37    LessEqual,
38    GreaterEqual,
39    Percent,
40    // ByteString Operators
41    PlusDot,         // '+.'
42    MinusDot,        // '-.'
43    StarDot,         // '*.'
44    SlashDot,        // '/.'
45    LessDot,         // '<.'
46    GreaterDot,      // '>.'
47    LessEqualDot,    // '<=.'
48    GreaterEqualDot, // '>=.'
49    // Other Punctuation
50    Colon,
51    Comma,
52    Hash,     // '#'
53    Bang,     // '!'
54    Question, // '?'
55    At,       // '@'
56    Equal,
57    EqualEqual,  // '=='
58    NotEqual,    // '!='
59    Vbar,        // '|'
60    VbarVbar,    // '||'
61    AmperAmper,  // '&&'
62    And,         // and
63    Or,          // or
64    NewLinePipe, // '↳|>'
65    Pipe,        // '|>'
66    Dot,         // '.'
67    RArrow,      // '->'
68    LArrow,      // '<-'
69    DotDot,      // '..'
70    EndOfFile,
71    // Docs/Extra
72    Comment,
73    DocComment,
74    ModuleComment,
75    ExpectComment(String),
76    EmptyLine,
77    NewLine,
78    // Keywords (alphabetically):
79    As,
80    Benchmark,
81    Const,
82    Fn,
83    If,
84    Else,
85    Fail,
86    Once,
87    Expect,
88    Is,
89    Let,
90    Opaque,
91    Pub,
92    Use,
93    Test,
94    Todo,
95    Type,
96    When,
97    Trace,
98    Validator,
99    Via,
100}
101
102impl fmt::Display for Token {
103    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
104        let index_str;
105        let s = match self {
106            Token::Error(c) => {
107                write!(f, "\"{c}\"")?;
108                return Ok(());
109            }
110            Token::ExpectComment(comment) => {
111                return write!(f, "/// {comment}");
112            }
113            Token::Name { name } => name,
114            Token::Ordinal { index } => {
115                index_str = index.to_string();
116                &index_str[..]
117            }
118            Token::UpName { name } => name,
119            Token::DiscardName { name } => name,
120            Token::Int { value, .. } => value,
121            Token::String { value } => value,
122            Token::ByteString { value } => value,
123            Token::NewLineLeftParen => "↳(",
124            Token::LeftParen => "(",
125            Token::RightParen => ")",
126            Token::LeftSquare => "[",
127            Token::RightSquare => "]",
128            Token::LeftBrace => "{",
129            Token::RightBrace => "}",
130            Token::Plus => "+",
131            Token::Minus => "-",
132            Token::NewLineMinus => "↳-",
133            Token::Star => "*",
134            Token::Slash => "/",
135            Token::Less => "<",
136            Token::Greater => ">",
137            Token::LessEqual => "<=",
138            Token::GreaterEqual => ">=",
139            Token::Percent => "%",
140            Token::PlusDot => "+.",
141            Token::MinusDot => "-.",
142            Token::StarDot => "*.",
143            Token::SlashDot => "/.",
144            Token::LessDot => "<.",
145            Token::GreaterDot => ">.",
146            Token::LessEqualDot => "<=.",
147            Token::GreaterEqualDot => ">=.",
148            Token::Colon => ":",
149            Token::Comma => ",",
150            Token::Hash => "#",
151            Token::Bang => "!",
152            Token::Equal => "=",
153            Token::Question => "?",
154            Token::At => "@",
155            Token::EqualEqual => "==",
156            Token::NotEqual => "!=",
157            Token::Vbar => "|",
158            Token::VbarVbar => "||",
159            Token::AmperAmper => "&&",
160            Token::And => "and",
161            Token::Or => "or",
162            Token::NewLinePipe => "↳|>",
163            Token::Pipe => "|>",
164            Token::Dot => ".",
165            Token::RArrow => "->",
166            Token::LArrow => "<-",
167            Token::DotDot => "..",
168            Token::EndOfFile => "EOF",
169            Token::Comment => "//",
170            Token::DocComment => "///",
171            Token::ModuleComment => "////",
172            Token::EmptyLine => "EMPTYLINE",
173            Token::NewLine => "NEWLINE",
174            Token::As => "as",
175            Token::Expect => "expect",
176            Token::When => "when",
177            Token::Is => "is",
178            Token::Const => "const",
179            Token::Fn => "fn",
180            Token::If => "if",
181            Token::Else => "else",
182            Token::Use => "use",
183            Token::Let => "let",
184            Token::Opaque => "opaque",
185            Token::Pub => "pub",
186            Token::Todo => "todo",
187            Token::Trace => "trace",
188            Token::Type => "type",
189            Token::Test => "test",
190            Token::Fail => "fail",
191            Token::Once => "once",
192            Token::Validator => "validator",
193            Token::Via => "via",
194            Token::Benchmark => "bench",
195        };
196        write!(f, "{s}")
197    }
198}