kodept_parse/lexer/
enums.rs

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}