Skip to main content

oak_wolfram/lexer/
token_type.rs

1use oak_core::{Token, TokenType, UniversalTokenRole};
2use std::fmt;
3
4/// A token in the Wolfram language.
5pub type WolframToken = Token<WolframTokenType>;
6
7impl fmt::Display for WolframTokenType {
8    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
9        write!(f, "{:?}", self)
10    }
11}
12
13impl TokenType for WolframTokenType {
14    type Role = UniversalTokenRole;
15    const END_OF_STREAM: Self = Self::Eof;
16
17    fn is_ignored(&self) -> bool {
18        false
19    }
20
21    fn role(&self) -> Self::Role {
22        self.role()
23    }
24}
25
26/// Token types for the Wolfram language.
27#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
28#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
29pub enum WolframTokenType {
30    /// The root token.
31    Root,
32
33    // Base tokens
34    /// Whitespace.
35    Whitespace,
36    /// A newline character.
37    Newline,
38
39    // Identifiers and literals
40    /// An identifier.
41    Identifier,
42    /// An integer literal.
43    Integer,
44    /// A real number literal.
45    Real,
46    /// A string literal.
47    String,
48
49    // Keywords
50    /// `If` keyword.
51    If,
52    /// `Then` keyword.
53    Then,
54    /// `Else` keyword.
55    Else,
56    /// `While` keyword.
57    While,
58    /// `For` keyword.
59    For,
60    /// `Do` keyword.
61    Do,
62    /// `Function` keyword.
63    Function,
64    /// `Module` keyword.
65    Module,
66    /// `Block` keyword.
67    Block,
68    /// `With` keyword.
69    With,
70    /// `Table` keyword.
71    Table,
72    /// `Map` keyword.
73    Map,
74    /// `Apply` keyword.
75    Apply,
76    /// `Select` keyword.
77    Select,
78    /// `Cases` keyword.
79    Cases,
80    /// `Rule` keyword.
81    Rule,
82    /// `RuleDelayed` keyword.
83    RuleDelayed,
84    /// `Set` keyword.
85    Set,
86    /// `SetDelayed` keyword.
87    SetDelayed,
88    /// `Unset` keyword.
89    Unset,
90    /// `Clear` keyword.
91    Clear,
92    /// `ClearAll` keyword.
93    ClearAll,
94    /// `Return` keyword.
95    Return,
96    /// `Break` keyword.
97    Break,
98    /// `Continue` keyword.
99    Continue,
100    /// `True` keyword.
101    True,
102    /// `False` keyword.
103    False,
104    /// `Null` keyword.
105    Null,
106    /// `Export` keyword.
107    Export,
108    /// `Import` keyword.
109    Import,
110
111    // Operators
112    /// `+`.
113    Plus,
114    /// `-`.
115    Minus,
116    /// `*`.
117    Times,
118    /// `/`.
119    Divide,
120    /// `^`.
121    Power,
122    /// `==`.
123    Equal,
124    /// `!=`.
125    NotEqual,
126    /// `<`.
127    Less,
128    /// `>`.
129    Greater,
130    /// `<=`.
131    LessEqual,
132    /// `>=`.
133    GreaterEqual,
134    /// `&&`.
135    And,
136    /// `||`.
137    Or,
138    /// `!`.
139    Not,
140
141    // Functional operators
142    /// `@`.
143    At,
144    /// `//`.
145    SlashSlash,
146    /// `/@`.
147    MapOperator,
148    /// `@@`.
149    ApplyOperator,
150    /// `@@@`.
151    ApplyLevelOperator,
152    /// `//@`.
153    MapAllOperator,
154    /// `&`.
155    Ampersand,
156    /// `@*`.
157    AtStar,
158    /// `/*`.
159    StarSlash,
160    /// `<>`.
161    StringJoin,
162    /// `:>`.
163    RuleDelayedOp,
164
165    // Assignment operators
166    /// `=`.
167    Assign,
168    /// `+=`.
169    AddTo,
170    /// `-=`.
171    SubtractFrom,
172    /// `*=`.
173    TimesBy,
174    /// `/=`.
175    DivideBy,
176
177    // Delimiters
178    /// `(`.
179    LeftParen,
180    /// `)`.
181    RightParen,
182    /// `[`.
183    LeftBracket,
184    /// `]`.
185    RightBracket,
186    /// `{`.
187    LeftBrace,
188    /// `}`.
189    RightBrace,
190    /// `,`.
191    Comma,
192    /// `;`.
193    Semicolon,
194    /// `:`.
195    Colon,
196    /// `.`.
197    Dot,
198
199    // Special symbols
200    /// `->`.
201    Arrow,
202    /// `=>`.
203    DoubleArrow,
204    /// `?`.
205    Question,
206    /// `_`.
207    Underscore,
208    /// `__`.
209    DoubleUnderscore,
210    /// `___`.
211    TripleUnderscore,
212    /// `#`.
213    Slot,
214    /// `##`.
215    SlotSequence,
216    /// `!`.
217    Factorial,
218
219    // Comments
220    /// A comment.
221    Comment,
222
223    // Text
224    /// Plain text.
225    Text,
226
227    /// An error token.
228    Error,
229    /// End of stream.
230    Eof,
231}
232
233impl WolframTokenType {
234    /// Returns the universal token role for this token type.
235    pub fn role(&self) -> UniversalTokenRole {
236        match self {
237            Self::Whitespace | Self::Newline => UniversalTokenRole::Whitespace,
238            Self::Comment => UniversalTokenRole::Comment,
239            Self::Identifier => UniversalTokenRole::Name,
240            Self::Integer | Self::Real => UniversalTokenRole::Literal,
241            Self::String => UniversalTokenRole::Literal,
242            Self::LeftParen | Self::LeftBracket | Self::LeftBrace => UniversalTokenRole::Punctuation,
243            Self::RightParen | Self::RightBracket | Self::RightBrace => UniversalTokenRole::Punctuation,
244            Self::Comma | Self::Semicolon | Self::Colon | Self::Dot => UniversalTokenRole::Punctuation,
245            Self::Plus
246            | Self::Minus
247            | Self::Times
248            | Self::Divide
249            | Self::Power
250            | Self::Equal
251            | Self::NotEqual
252            | Self::Less
253            | Self::Greater
254            | Self::LessEqual
255            | Self::GreaterEqual
256            | Self::And
257            | Self::Or
258            | Self::Not
259            | Self::At
260            | Self::SlashSlash
261            | Self::MapOperator
262            | Self::ApplyOperator
263            | Self::ApplyLevelOperator
264            | Self::MapAllOperator
265            | Self::Ampersand
266            | Self::AtStar
267            | Self::StarSlash
268            | Self::StringJoin
269            | Self::RuleDelayedOp
270            | Self::Assign
271            | Self::AddTo
272            | Self::SubtractFrom
273            | Self::TimesBy
274            | Self::DivideBy
275            | Self::Arrow
276            | Self::DoubleArrow
277            | Self::Question
278            | Self::Underscore
279            | Self::DoubleUnderscore
280            | Self::TripleUnderscore
281            | Self::Slot
282            | Self::SlotSequence
283            | Self::Factorial => UniversalTokenRole::Operator,
284            Self::If
285            | Self::Then
286            | Self::Else
287            | Self::While
288            | Self::For
289            | Self::Do
290            | Self::Function
291            | Self::Module
292            | Self::Block
293            | Self::With
294            | Self::Table
295            | Self::Map
296            | Self::Apply
297            | Self::Select
298            | Self::Cases
299            | Self::Rule
300            | Self::RuleDelayed
301            | Self::Set
302            | Self::SetDelayed
303            | Self::Unset
304            | Self::Clear
305            | Self::ClearAll
306            | Self::Return
307            | Self::Break
308            | Self::Continue
309            | Self::True
310            | Self::False
311            | Self::Null
312            | Self::Export
313            | Self::Import => UniversalTokenRole::Keyword,
314            Self::Eof => UniversalTokenRole::Eof,
315            Self::Error => UniversalTokenRole::Error,
316            _ => UniversalTokenRole::None,
317        }
318    }
319}