Skip to main content

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}