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/// Type alias for APL syntax tree elements.
8pub type AplElement<'a> = Arc<GreenNode<'a, AplElementType>>;
9
10/// Element types for the APL language.
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    /// A statement.
17    Statement,
18    /// An expression.
19    Expression,
20    /// An assignment (←).
21    Assignment,
22    /// A vector or array literal.
23    ArrayLiteral,
24    /// A function (primitive or dfn).
25    Function,
26    /// An operator (primitive or dop).
27    Operator,
28    /// An identifier (variable name).
29    Identifier,
30    /// A number literal.
31    NumberLiteral,
32    /// A string literal.
33    StringLiteral,
34    /// An 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}