Skip to main content

oak_apl/parser/
element_type.rs

1use crate::lexer::token_type::AplTokenType;
2use oak_core::{ElementType, GreenNode, UniversalElementRole};
3#[cfg(feature = "serde")]
4use serde::{Deserialize, Serialize};
5use std::sync::Arc;
6
7/// APL 语法树元素的类型别名
8pub type AplElement<'a> = Arc<GreenNode<'a, AplElementType>>;
9
10/// APL 语法树中所有可能的元素类型。
11#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
12#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
13pub enum AplElementType {
14    /// Root node
15    Root,
16    /// Statement
17    Statement,
18    /// Expression
19    Expression,
20    /// Assignment (←)
21    Assignment,
22    /// Vector/Array literal
23    ArrayLiteral,
24    /// Function (primitive or dfn)
25    Function,
26    /// Operator (primitive or dop)
27    Operator,
28    /// Identifier (variable name)
29    Identifier,
30    /// Number literal
31    NumberLiteral,
32    /// String literal
33    StringLiteral,
34    /// Error node
35    Error,
36}
37
38impl ElementType for AplElementType {
39    type Role = UniversalElementRole;
40
41    fn is_root(&self) -> bool {
42        matches!(self, Self::Root)
43    }
44
45    fn is_error(&self) -> bool {
46        matches!(self, Self::Error)
47    }
48
49    fn role(&self) -> Self::Role {
50        use UniversalElementRole::*;
51        match self {
52            Self::Root => Root,
53            Self::Statement => Statement,
54            Self::Expression | Self::ArrayLiteral | Self::Assignment => Expression,
55            Self::Function | Self::Operator => Definition,
56            Self::Identifier => Reference,
57            Self::NumberLiteral | Self::StringLiteral => Expression,
58            Self::Error => Error,
59        }
60    }
61}
62
63impl From<AplTokenType> for AplElementType {
64    fn from(token_type: AplTokenType) -> Self {
65        match token_type {
66            AplTokenType::Identifier => Self::Identifier,
67            AplTokenType::StringLiteral => Self::StringLiteral,
68            AplTokenType::NumberLiteral => Self::NumberLiteral,
69            _ => Self::Error,
70        }
71    }
72}