Skip to main content

oak_c/parser/
element_type.rs

1use crate::lexer::CTokenType;
2use oak_core::{ElementType, UniversalElementRole};
3#[cfg(feature = "serde")]
4use serde::{Deserialize, Serialize};
5
6/// Represents all possible element kinds in the C programming language.
7#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
8#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
9pub enum CElementType {
10    /// A wrapper for tokens
11    Token(CTokenType),
12    /// Root node representing the entire source file
13    Root,
14    /// Function definition
15    FunctionDefinition,
16    /// Parameter list
17    ParameterList,
18    /// Compound statement (block)
19    CompoundStatement,
20    /// Expression statement
21    ExpressionStatement,
22    /// Declaration statement
23    DeclarationStatement,
24    /// If statement
25    IfStatement,
26    /// While statement
27    WhileStatement,
28    /// For statement
29    ForStatement,
30    /// Return statement
31    ReturnStatement,
32    /// Error element
33    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}