oak_matlab/parser/element_type.rs
1use oak_core::{ElementType, UniversalElementRole};
2
3/// Element types for the Matlab language.
4#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
5#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
6#[repr(u8)]
7pub enum MatlabElementType {
8 // Basic tokens (consistent with MatlabTokenType)
9 /// Whitespace.
10 Whitespace,
11 /// Newline.
12 Newline,
13 /// Line comment.
14 Comment,
15 /// Block comment.
16 BlockComment,
17
18 // Identifiers and literals
19 /// Identifier.
20 Identifier,
21 /// Number literal.
22 Number,
23 /// String literal.
24 String,
25 /// Character literal.
26 Character,
27
28 // Keywords
29 /// `function` keyword.
30 Function,
31 /// `end` keyword.
32 End,
33 /// `if` keyword.
34 If,
35 /// `else` keyword.
36 Else,
37 /// `elseif` keyword.
38 Elseif,
39 /// `while` keyword.
40 While,
41 /// `for` keyword.
42 For,
43 /// `break` keyword.
44 Break,
45 /// `continue` keyword.
46 Continue,
47 /// `return` keyword.
48 Return,
49 /// `switch` keyword.
50 Switch,
51 /// `case` keyword.
52 Case,
53 /// `otherwise` keyword.
54 Otherwise,
55 /// `try` keyword.
56 Try,
57 /// `catch` keyword.
58 Catch,
59 /// `global` keyword.
60 Global,
61 /// `persistent` keyword.
62 Persistent,
63 /// `classdef` keyword.
64 Classdef,
65 /// `properties` keyword.
66 Properties,
67 /// `methods` keyword.
68 Methods,
69 /// `events` keyword.
70 Events,
71
72 // Operators
73 /// `+` operator.
74 Plus, // +
75 /// `-` operator.
76 Minus, // -
77 /// `*` operator.
78 Times, // *
79 /// `/` operator.
80 Divide, // /
81 /// `^` operator.
82 Power, // ^
83 /// `\` operator.
84 LeftDivide, // \
85 /// `.*` operator.
86 DotTimes, // .*
87 /// `./` operator.
88 DotDivide, // ./
89 /// `.^` operator.
90 DotPower, // .^
91 /// `.\` operator.
92 DotLeftDivide, // .\
93
94 // Comparison operators
95 /// `==` operator.
96 Equal, // ==
97 /// `~=` operator.
98 NotEqual, // ~=
99 /// `<` operator.
100 Less, // <
101 /// `>` operator.
102 Greater, // >
103 /// `<=` operator.
104 LessEqual, // <=
105 /// `>=` operator.
106 GreaterEqual, // >=
107
108 // Logical operators
109 /// `&` operator.
110 And, // &
111 /// `|` operator.
112 Or, // |
113 /// `~` operator.
114 Not, // ~
115 /// `&&` operator.
116 AndAnd, // &&
117 /// `||` operator.
118 OrOr, // ||
119
120 // Assignment operators
121 /// `=` operator.
122 Assign, // =
123
124 // Delimiters
125 /// `(` delimiter.
126 LeftParen, // (
127 /// `)` delimiter.
128 RightParen, // )
129 /// `[` delimiter.
130 LeftBracket, // [
131 /// `]` delimiter.
132 RightBracket, // ]
133 /// `{` delimiter.
134 LeftBrace, // {
135 /// `}` delimiter.
136 RightBrace, // }
137 /// `;` delimiter.
138 Semicolon, // ;
139 /// `,` delimiter.
140 Comma, // ,
141 /// `.` delimiter.
142 Dot, // .
143 /// `:` delimiter.
144 Colon, // :
145 /// `?` delimiter.
146 Question, // ?
147 /// `@` delimiter.
148 At, // @
149
150 // Special operators
151 /// `'` operator.
152 Transpose, // '
153 /// `.'` operator.
154 DotTranspose, // .'
155
156 // Generalized types
157 /// General operator.
158 Operator,
159 /// General delimiter.
160 Delimiter,
161
162 // Error handling
163 /// Error element.
164 Error,
165
166 // Document structure (Element)
167 /// Script element.
168 Script,
169 /// Function definition element.
170 FunctionDef,
171 /// Class definition element.
172 ClassDef,
173 /// Block element.
174 Block,
175 /// Expression element.
176 Expression,
177 /// Statement element.
178 Statement,
179
180 // EOF
181 /// End of stream.
182 Eof,
183}
184
185impl MatlabElementType {
186 /// Returns true if the element type is a token.
187 pub fn is_token(&self) -> bool {
188 (*self as u8) <= (Self::Eof as u8) && !self.is_element()
189 }
190
191 /// Returns true if the element type is an element.
192 pub fn is_element(&self) -> bool {
193 matches!(self, Self::Script | Self::FunctionDef | Self::ClassDef | Self::Block | Self::Expression | Self::Statement)
194 }
195}
196
197impl ElementType for MatlabElementType {
198 type Role = UniversalElementRole;
199
200 fn role(&self) -> Self::Role {
201 match self {
202 _ => UniversalElementRole::None,
203 }
204 }
205}
206
207impl From<crate::lexer::token_type::MatlabTokenType> for MatlabElementType {
208 fn from(token: crate::lexer::token_type::MatlabTokenType) -> Self {
209 unsafe { std::mem::transmute(token) }
210 }
211}