oak_c/parser/
element_type.rs1use crate::lexer::CTokenType;
2use oak_core::{ElementType, UniversalElementRole};
3#[cfg(feature = "serde")]
4use serde::{Deserialize, Serialize};
5
6#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
8#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
9pub enum CElementType {
10 Token(CTokenType),
12 Root,
14 FunctionDefinition,
16 ParameterList,
18 CompoundStatement,
20 ExpressionStatement,
22 DeclarationStatement,
24 IfStatement,
26 WhileStatement,
28 ForStatement,
30 ReturnStatement,
32 Error,
34}
35
36impl From<CTokenType> for CElementType {
37 fn from(token: CTokenType) -> Self {
38 Self::Token(token)
39 }
40}
41
42impl ElementType for CElementType {
43 type Role = UniversalElementRole;
44
45 fn is_root(&self) -> bool {
46 matches!(self, Self::Root)
47 }
48
49 fn is_error(&self) -> bool {
50 matches!(self, Self::Error)
51 }
52
53 fn role(&self) -> Self::Role {
54 match self {
55 Self::Root => UniversalElementRole::Root,
56 Self::FunctionDefinition => UniversalElementRole::Definition,
57 Self::CompoundStatement | Self::ExpressionStatement | Self::DeclarationStatement | Self::IfStatement | Self::WhileStatement | Self::ForStatement | Self::ReturnStatement => UniversalElementRole::Statement,
58 Self::Error => UniversalElementRole::Error,
59 _ => UniversalElementRole::None,
60 }
61 }
62}