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 Declarator,
26 IfStatement,
28 WhileStatement,
30 ForStatement,
32 ReturnStatement,
34 Error,
36}
37
38impl From<CTokenType> for CElementType {
39 fn from(token: CTokenType) -> Self {
40 Self::Token(token)
41 }
42}
43
44impl ElementType for CElementType {
45 type Role = UniversalElementRole;
46
47 fn is_root(&self) -> bool {
48 matches!(self, Self::Root)
49 }
50
51 fn is_error(&self) -> bool {
52 matches!(self, Self::Error)
53 }
54
55 fn role(&self) -> Self::Role {
56 match self {
57 Self::Root => UniversalElementRole::Root,
58 Self::FunctionDefinition => UniversalElementRole::Definition,
59 Self::CompoundStatement | Self::ExpressionStatement | Self::DeclarationStatement | Self::IfStatement | Self::WhileStatement | Self::ForStatement | Self::ReturnStatement => UniversalElementRole::Statement,
60 Self::Error => UniversalElementRole::Error,
61 _ => UniversalElementRole::None,
62 }
63 }
64}