1use std::fmt::{Display, Formatter};
2
3use derive_more::From;
4#[cfg(feature = "enum-iter")]
5use enum_iterator::Sequence;
6
7#[derive(Debug, PartialEq, Clone, Copy)]
8pub enum Ignore<'t> {
9 Comment(&'t str),
10 MultilineComment(&'t str),
11 Newline,
12 Whitespace,
13}
14
15#[derive(Debug, PartialEq, Clone, Copy)]
16#[cfg_attr(feature = "enum-iter", derive(Sequence))]
17pub enum Keyword {
18 Fun,
19 Val,
20 Var,
21 If,
22 Elif,
23 Else,
24 Match,
25 While,
26 Module,
27 Extend,
28 Lambda,
29 Abstract,
30 Trait,
31 Struct,
32 Class,
33 Enum,
34 Foreign,
35 TypeAlias,
36 With,
37 Return,
38}
39
40#[derive(Debug, PartialEq, Clone, Copy)]
41#[cfg_attr(feature = "enum-iter", derive(Sequence))]
42pub enum Symbol {
43 Comma,
44 Semicolon,
45 LBrace,
46 RBrace,
47 LBracket,
48 RBracket,
49 LParen,
50 RParen,
51 TypeGap,
52 DoubleColon,
53 Colon,
54}
55
56#[derive(Debug, PartialEq, Clone, Copy)]
57pub enum Identifier<'t> {
58 Identifier(&'t str),
59 Type(&'t str),
60}
61
62#[derive(Debug, PartialEq, Clone, Copy)]
63pub enum Literal<'t> {
64 Binary(&'t str),
65 Octal(&'t str),
66 Hex(&'t str),
67 Floating(&'t str),
68 Char(&'t str),
69 String(&'t str),
70}
71
72#[derive(Debug, PartialEq, Clone, Copy)]
73#[cfg_attr(feature = "enum-iter", derive(Sequence))]
74pub enum MathOperator {
75 Plus,
76 Sub,
77 Div,
78 Mod,
79 Pow,
80 Times,
81}
82
83#[derive(Debug, PartialEq, Clone, Copy)]
84#[cfg_attr(feature = "enum-iter", derive(Sequence))]
85pub enum ComparisonOperator {
86 Equals,
87 Equiv,
88 NotEquiv,
89 Less,
90 LessEquals,
91 Greater,
92 GreaterEquals,
93 Spaceship,
94}
95
96#[derive(Debug, PartialEq, Clone, Copy)]
97#[cfg_attr(feature = "enum-iter", derive(Sequence))]
98pub enum LogicOperator {
99 OrLogic,
100 AndLogic,
101 NotLogic,
102}
103
104#[derive(Debug, PartialEq, Clone, Copy)]
105#[cfg_attr(feature = "enum-iter", derive(Sequence))]
106pub enum BitOperator {
107 OrBit,
108 AndBit,
109 XorBit,
110 NotBit,
111}
112
113#[derive(Debug, PartialEq, Clone, From, Copy)]
114#[cfg_attr(feature = "enum-iter", derive(Sequence))]
115pub enum Operator {
116 Dot,
117 Flow,
118 Math(MathOperator),
119 Comparison(ComparisonOperator),
120 Logic(LogicOperator),
121 Bit(BitOperator),
122}
123
124#[derive(Debug, PartialEq, Clone, From, Copy)]
125pub enum Token<'t> {
126 Ignore(Ignore<'t>),
127 Keyword(Keyword),
128 Symbol(Symbol),
129 Identifier(Identifier<'t>),
130 Literal(Literal<'t>),
131 Operator(Operator),
132 Unknown,
133}
134
135impl Token<'_> {
136 pub fn is_ignored(&self) -> bool {
137 matches!(self, Token::Ignore(_))
138 }
139}
140
141impl Display for Token<'_> {
142 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
143 match self {
144 Token::Ignore(x) => match x {
145 Ignore::Comment(x) => write!(f, "{x}"),
146 Ignore::MultilineComment(x) => write!(f, "{x}"),
147 Ignore::Newline => write!(f, "<newline>"),
148 Ignore::Whitespace => write!(f, " "),
149 },
150 Token::Unknown => write!(f, "?"),
151 _ => write!(f, "{self:?}"),
152 }
153 }
154}