Skip to main content

oak_apl/parser/
element_type.rs

1use crate::lexer::token_type::AplTokenType;
2use oak_core::{ElementType, GreenNode, UniversalElementRole};
3use std::sync::Arc;
4
5/// Type alias for APL syntax tree elements.
6pub type AplElement<'a> = Arc<GreenNode<'a, AplElementType>>;
7
8/// Element types for the APL language.
9#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
10#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
11pub enum AplElementType {
12    /// Root node.
13    Root,
14    /// A statement.
15    Statement,
16    /// An expression.
17    Expression,
18    /// An assignment (←).
19    Assignment,
20    /// A vector or array literal.
21    ArrayLiteral,
22    /// A function (primitive or dfn).
23    Function,
24    /// An operator (primitive or dop).
25    Operator,
26    /// An identifier (variable name).
27    Identifier,
28    /// A number literal.
29    NumberLiteral,
30    /// A string literal.
31    StringLiteral,
32    /// An error node.
33    Error,
34}
35
36impl ElementType for AplElementType {
37    type Role = UniversalElementRole;
38
39    fn is_root(&self) -> bool {
40        matches!(self, Self::Root)
41    }
42
43    fn is_error(&self) -> bool {
44        matches!(self, Self::Error)
45    }
46
47    fn role(&self) -> Self::Role {
48        use UniversalElementRole::*;
49        match self {
50            Self::Root => Root,
51            Self::Statement => Statement,
52            Self::Expression | Self::ArrayLiteral | Self::Assignment => Expression,
53            Self::Function | Self::Operator => Definition,
54            Self::Identifier => Reference,
55            Self::NumberLiteral | Self::StringLiteral => Expression,
56            Self::Error => Error,
57        }
58    }
59}
60
61impl From<AplTokenType> for AplElementType {
62    fn from(token_type: AplTokenType) -> Self {
63        match token_type {
64            AplTokenType::Identifier => Self::Identifier,
65            AplTokenType::StringLiteral => Self::StringLiteral,
66            AplTokenType::NumberLiteral => Self::NumberLiteral,
67            _ => Self::Error,
68        }
69    }
70}