Skip to main content

oak_wolfram/parser/
element_type.rs

1use oak_core::{ElementType, UniversalElementRole};
2#[cfg(feature = "serde")]
3use serde::{Deserialize, Serialize};
4use std::fmt;
5
6#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
7#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
8pub enum WolframElementType {
9    Root,
10    // 表达式
11    Expression,
12    // 函数调用 f[x]
13    Call,
14    // 参数列表 [x, y]
15    Arguments,
16    // 列表 {a, b}
17    List,
18    // 符号/标识符
19    Symbol,
20    // 字面量
21    Literal,
22    // 二元表达式 x + y
23    BinaryExpr,
24    // 前缀表达式 !x
25    PrefixExpr,
26    // 后缀表达式 x!
27    PostfixExpr,
28    // 错误
29    Error,
30}
31
32impl fmt::Display for WolframElementType {
33    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
34        write!(f, "{:?}", self)
35    }
36}
37
38impl ElementType for WolframElementType {
39    type Role = UniversalElementRole;
40
41    fn role(&self) -> Self::Role {
42        match self {
43            _ => UniversalElementRole::None,
44        }
45    }
46}
47
48impl From<crate::lexer::token_type::WolframTokenType> for WolframElementType {
49    fn from(token: crate::lexer::token_type::WolframTokenType) -> Self {
50        match token {
51            crate::lexer::token_type::WolframTokenType::Root => Self::Root,
52            crate::lexer::token_type::WolframTokenType::Identifier => Self::Symbol,
53            crate::lexer::token_type::WolframTokenType::Integer | crate::lexer::token_type::WolframTokenType::Real | crate::lexer::token_type::WolframTokenType::String => Self::Literal,
54            _ => Self::Error,
55        }
56    }
57}