Skip to main content

oak_wolfram/parser/
element_type.rs

1use oak_core::{ElementType, UniversalElementRole};
2use std::fmt;
3
4/// Element types for the Wolfram language.
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
6#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
7pub enum WolframElementType {
8    /// Root node of the tree.
9    Root,
10    // Expressions
11    /// A general expression.
12    Expression,
13    // Function call f[x]
14    /// A function call, e.g., `f[x]`.
15    Call,
16    // Argument list [x, y]
17    /// A list of arguments, e.g., `[x, y]`.
18    Arguments,
19    // List {a, b}
20    /// A list, e.g., `{a, b}`.
21    List,
22    // Symbol/Identifier
23    /// A symbol or identifier.
24    Symbol,
25    // Literals
26    /// A literal value.
27    Literal,
28    // Binary expression x + y
29    /// A binary expression, e.g., `x + y`.
30    BinaryExpr,
31    // Prefix expression !x
32    /// A prefix expression, e.g., `!x`.
33    PrefixExpr,
34    // Postfix expression x!
35    /// A postfix expression, e.g., `x!`.
36    PostfixExpr,
37    // Errors
38    /// An error element.
39    Error,
40}
41
42impl fmt::Display for WolframElementType {
43    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
44        write!(f, "{:?}", self)
45    }
46}
47
48impl ElementType for WolframElementType {
49    type Role = UniversalElementRole;
50
51    fn role(&self) -> Self::Role {
52        match self {
53            _ => UniversalElementRole::None,
54        }
55    }
56}
57
58impl From<crate::lexer::token_type::WolframTokenType> for WolframElementType {
59    fn from(token: crate::lexer::token_type::WolframTokenType) -> Self {
60        match token {
61            crate::lexer::token_type::WolframTokenType::Root => Self::Root,
62            crate::lexer::token_type::WolframTokenType::Identifier => Self::Symbol,
63            crate::lexer::token_type::WolframTokenType::Integer | crate::lexer::token_type::WolframTokenType::Real | crate::lexer::token_type::WolframTokenType::String => Self::Literal,
64            _ => Self::Error,
65        }
66    }
67}