oak_j/parser/
element_type.rs1use crate::lexer::JTokenType;
2use oak_core::{ElementType, GreenNode, UniversalElementRole};
3use std::sync::Arc;
4
5pub type JElement<'a> = Arc<GreenNode<'a, JElementType>>;
7
8#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
10#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
11pub enum JElementType {
12 Root,
14 CompilationUnit,
16
17 Sentence,
19
20 Assignment,
22
23 Expression,
25
26 Verb,
28
29 Noun,
31
32 Adverb,
34
35 Conjunction,
37
38 Group,
40}
41
42impl From<JTokenType> for JElementType {
43 fn from(token: JTokenType) -> Self {
44 match token {
45 JTokenType::Identifier => Self::Noun,
46 JTokenType::NumberLiteral => Self::Noun,
47 JTokenType::StringLiteral => Self::Noun,
48 JTokenType::IsGlobal | JTokenType::IsLocal => Self::Assignment,
49 _ => Self::Expression,
50 }
51 }
52}
53
54impl ElementType for JElementType {
55 type Role = UniversalElementRole;
56
57 fn role(&self) -> Self::Role {
58 match self {
59 Self::Root | Self::CompilationUnit => UniversalElementRole::Root,
60 Self::Sentence => UniversalElementRole::Statement,
61 Self::Assignment => UniversalElementRole::Binding,
62 Self::Expression => UniversalElementRole::Expression,
63 _ => UniversalElementRole::None,
64 }
65 }
66}