1use oak_core::{Token, TokenType, UniversalTokenRole};
2#[cfg(feature = "serde")]
3use serde::{Deserialize, Serialize};
4use std::fmt;
5
6pub type WolframToken = Token<WolframTokenType>;
7
8impl fmt::Display for WolframTokenType {
9 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
10 write!(f, "{:?}", self)
11 }
12}
13
14impl TokenType for WolframTokenType {
15 type Role = UniversalTokenRole;
16 const END_OF_STREAM: Self = Self::Eof;
17
18 fn is_ignored(&self) -> bool {
19 false
20 }
21
22 fn role(&self) -> Self::Role {
23 self.role()
24 }
25}
26
27#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
28#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
29pub enum WolframTokenType {
30 Root,
31
32 Whitespace,
34 Newline,
35
36 Identifier,
38 Integer,
39 Real,
40 String,
41
42 If,
44 Then,
45 Else,
46 While,
47 For,
48 Do,
49 Function,
50 Module,
51 Block,
52 With,
53 Table,
54 Map,
55 Apply,
56 Select,
57 Cases,
58 Rule,
59 RuleDelayed,
60 Set,
61 SetDelayed,
62 Unset,
63 Clear,
64 ClearAll,
65 Return,
66 Break,
67 Continue,
68 True,
69 False,
70 Null,
71 Export,
72 Import,
73
74 Plus, Minus, Times, Divide, Power, Equal, NotEqual, Less, Greater, LessEqual, GreaterEqual, And, Or, Not, At, SlashSlash, MapOperator, ApplyOperator, ApplyLevelOperator, MapAllOperator, Ampersand, AtStar, StarSlash, StringJoin, RuleDelayedOp, Assign, AddTo, SubtractFrom, TimesBy, DivideBy, LeftParen, RightParen, LeftBracket, RightBracket, LeftBrace, RightBrace, Comma, Semicolon, Colon, Dot, Arrow, DoubleArrow, Question, Underscore, DoubleUnderscore, TripleUnderscore, Slot, SlotSequence, Factorial, Comment,
135
136 Text,
138
139 Error,
141
142 Eof,
144}
145
146impl WolframTokenType {
147 pub fn role(&self) -> UniversalTokenRole {
148 match self {
149 Self::Whitespace => UniversalTokenRole::Whitespace,
150 Self::Newline => UniversalTokenRole::Whitespace, Self::Comment => UniversalTokenRole::Comment,
152 Self::Identifier => UniversalTokenRole::Name, Self::Integer | Self::Real => UniversalTokenRole::Literal,
154 Self::String => UniversalTokenRole::Literal, Self::LeftParen | Self::LeftBracket | Self::LeftBrace => UniversalTokenRole::Punctuation,
156 Self::RightParen | Self::RightBracket | Self::RightBrace => UniversalTokenRole::Punctuation,
157 Self::Comma | Self::Semicolon | Self::Colon | Self::Dot => UniversalTokenRole::Punctuation,
158 Self::Plus
159 | Self::Minus
160 | Self::Times
161 | Self::Divide
162 | Self::Power
163 | Self::Equal
164 | Self::NotEqual
165 | Self::Less
166 | Self::Greater
167 | Self::LessEqual
168 | Self::GreaterEqual
169 | Self::And
170 | Self::Or
171 | Self::Not
172 | Self::At
173 | Self::SlashSlash
174 | Self::MapOperator
175 | Self::ApplyOperator
176 | Self::ApplyLevelOperator
177 | Self::MapAllOperator
178 | Self::Ampersand
179 | Self::AtStar
180 | Self::StarSlash
181 | Self::StringJoin
182 | Self::RuleDelayedOp
183 | Self::Assign
184 | Self::AddTo
185 | Self::SubtractFrom
186 | Self::TimesBy
187 | Self::DivideBy
188 | Self::Arrow
189 | Self::DoubleArrow
190 | Self::Question
191 | Self::Underscore
192 | Self::DoubleUnderscore
193 | Self::TripleUnderscore
194 | Self::Slot
195 | Self::SlotSequence
196 | Self::Factorial => UniversalTokenRole::Operator,
197 Self::If
198 | Self::Then
199 | Self::Else
200 | Self::While
201 | Self::For
202 | Self::Do
203 | Self::Function
204 | Self::Module
205 | Self::Block
206 | Self::With
207 | Self::Table
208 | Self::Map
209 | Self::Apply
210 | Self::Select
211 | Self::Cases
212 | Self::Rule
213 | Self::RuleDelayed
214 | Self::Set
215 | Self::SetDelayed
216 | Self::Unset
217 | Self::Clear
218 | Self::ClearAll
219 | Self::Return
220 | Self::Break
221 | Self::Continue
222 | Self::True
223 | Self::False
224 | Self::Null
225 | Self::Export
226 | Self::Import => UniversalTokenRole::Keyword,
227 Self::Eof => UniversalTokenRole::Eof,
228 _ => UniversalTokenRole::None,
229 }
230 }
231}