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    EmptyLine,
76    NewLine,
77    // Keywords (alphabetically):
78    As,
79    Benchmark,
80    Const,
81    Fn,
82    If,
83    Else,
84    Fail,
85    Once,
86    Expect,
87    Is,
88    Let,
89    Opaque,
90    Pub,
91    Use,
92    Test,
93    Todo,
94    Type,
95    When,
96    Trace,
97    Validator,
98    Via,
99}
100
101impl fmt::Display for Token {
102    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
103        let index_str;
104        let s = match self {
105            Token::Error(c) => {
106                write!(f, "\"{c}\"")?;
107                return Ok(());
108            }
109            Token::Name { name } => name,
110            Token::Ordinal { index } => {
111                index_str = index.to_string();
112                &index_str[..]
113            }
114            Token::UpName { name } => name,
115            Token::DiscardName { name } => name,
116            Token::Int { value, .. } => value,
117            Token::String { value } => value,
118            Token::ByteString { value } => value,
119            Token::NewLineLeftParen => "↳(",
120            Token::LeftParen => "(",
121            Token::RightParen => ")",
122            Token::LeftSquare => "[",
123            Token::RightSquare => "]",
124            Token::LeftBrace => "{",
125            Token::RightBrace => "}",
126            Token::Plus => "+",
127            Token::Minus => "-",
128            Token::NewLineMinus => "↳-",
129            Token::Star => "*",
130            Token::Slash => "/",
131            Token::Less => "<",
132            Token::Greater => ">",
133            Token::LessEqual => "<=",
134            Token::GreaterEqual => ">=",
135            Token::Percent => "%",
136            Token::PlusDot => "+.",
137            Token::MinusDot => "-.",
138            Token::StarDot => "*.",
139            Token::SlashDot => "/.",
140            Token::LessDot => "<.",
141            Token::GreaterDot => ">.",
142            Token::LessEqualDot => "<=.",
143            Token::GreaterEqualDot => ">=.",
144            Token::Colon => ":",
145            Token::Comma => ",",
146            Token::Hash => "#",
147            Token::Bang => "!",
148            Token::Equal => "=",
149            Token::Question => "?",
150            Token::At => "@",
151            Token::EqualEqual => "==",
152            Token::NotEqual => "!=",
153            Token::Vbar => "|",
154            Token::VbarVbar => "||",
155            Token::AmperAmper => "&&",
156            Token::And => "and",
157            Token::Or => "or",
158            Token::NewLinePipe => "↳|>",
159            Token::Pipe => "|>",
160            Token::Dot => ".",
161            Token::RArrow => "->",
162            Token::LArrow => "<-",
163            Token::DotDot => "..",
164            Token::EndOfFile => "EOF",
165            Token::Comment => "//",
166            Token::DocComment => "///",
167            Token::ModuleComment => "////",
168            Token::EmptyLine => "EMPTYLINE",
169            Token::NewLine => "NEWLINE",
170            Token::As => "as",
171            Token::Expect => "expect",
172            Token::When => "when",
173            Token::Is => "is",
174            Token::Const => "const",
175            Token::Fn => "fn",
176            Token::If => "if",
177            Token::Else => "else",
178            Token::Use => "use",
179            Token::Let => "let",
180            Token::Opaque => "opaque",
181            Token::Pub => "pub",
182            Token::Todo => "todo",
183            Token::Trace => "trace",
184            Token::Type => "type",
185            Token::Test => "test",
186            Token::Fail => "fail",
187            Token::Once => "once",
188            Token::Validator => "validator",
189            Token::Via => "via",
190            Token::Benchmark => "bench",
191        };
192        write!(f, "{s}")
193    }
194}