Skip to main content

oak_scheme/parser/
element_type.rs

1use oak_core::{ElementType, UniversalElementRole};
2#[cfg(feature = "serde")]
3use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
6#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
7pub enum SchemeElementType {
8    SourceFile,
9    Whitespace,
10    Newline,
11    Comment,
12    LineComment,
13    NumberLiteral,
14    StringLiteral,
15    CharacterLiteral,
16    BooleanLiteral,
17    Identifier,
18    Symbol,
19    Keyword,
20    Define,
21    Lambda,
22    If,
23    Cond,
24    Case,
25    Let,
26    LetStar,
27    Letrec,
28    Begin,
29    Do,
30    Quote,
31    Quasiquote,
32    Unquote,
33    UnquoteSplicing,
34    And,
35    Or,
36    Not,
37    Set,
38    LeftParen,
39    RightParen,
40    LeftBracket,
41    RightBracket,
42    LeftBrace,
43    RightBrace,
44    Dot,
45    Hash,
46    Quote_,
47    Quasiquote_,
48    Unquote_,
49    UnquoteSplicing_,
50    Error,
51    Eof,
52}
53
54impl ElementType for SchemeElementType {
55    type Role = UniversalElementRole;
56
57    fn role(&self) -> Self::Role {
58        match self {
59            Self::SourceFile => UniversalElementRole::Root,
60            Self::Error => UniversalElementRole::Error,
61            _ => UniversalElementRole::None,
62        }
63    }
64}
65
66impl From<crate::lexer::token_type::SchemeTokenType> for SchemeElementType {
67    fn from(token: crate::lexer::token_type::SchemeTokenType) -> Self {
68        use crate::lexer::token_type::SchemeTokenType as T;
69        match token {
70            T::SourceFile => SchemeElementType::SourceFile,
71            T::Whitespace => SchemeElementType::Whitespace,
72            T::Newline => SchemeElementType::Newline,
73            T::Comment => SchemeElementType::Comment,
74            T::LineComment => SchemeElementType::LineComment,
75            T::NumberLiteral => SchemeElementType::NumberLiteral,
76            T::StringLiteral => SchemeElementType::StringLiteral,
77            T::CharacterLiteral => SchemeElementType::CharacterLiteral,
78            T::BooleanLiteral => SchemeElementType::BooleanLiteral,
79            T::Identifier => SchemeElementType::Identifier,
80            T::Symbol => SchemeElementType::Symbol,
81            T::Keyword => SchemeElementType::Keyword,
82            T::Define => SchemeElementType::Define,
83            T::Lambda => SchemeElementType::Lambda,
84            T::If => SchemeElementType::If,
85            T::Cond => SchemeElementType::Cond,
86            T::Case => SchemeElementType::Case,
87            T::Let => SchemeElementType::Let,
88            T::LetStar => SchemeElementType::LetStar,
89            T::Letrec => SchemeElementType::Letrec,
90            T::Begin => SchemeElementType::Begin,
91            T::Do => SchemeElementType::Do,
92            T::Quote => SchemeElementType::Quote,
93            T::Quasiquote => SchemeElementType::Quasiquote,
94            T::Unquote => SchemeElementType::Unquote,
95            T::UnquoteSplicing => SchemeElementType::UnquoteSplicing,
96            T::And => SchemeElementType::And,
97            T::Or => SchemeElementType::Or,
98            T::Not => SchemeElementType::Not,
99            T::Set => SchemeElementType::Set,
100            T::LeftParen => SchemeElementType::LeftParen,
101            T::RightParen => SchemeElementType::RightParen,
102            T::LeftBracket => SchemeElementType::LeftBracket,
103            T::RightBracket => SchemeElementType::RightBracket,
104            T::LeftBrace => SchemeElementType::LeftBrace,
105            T::RightBrace => SchemeElementType::RightBrace,
106            T::Dot => SchemeElementType::Dot,
107            T::Hash => SchemeElementType::Hash,
108            T::Quote_ => SchemeElementType::Quote_,
109            T::Quasiquote_ => SchemeElementType::Quasiquote_,
110            T::Unquote_ => SchemeElementType::Unquote_,
111            T::UnquoteSplicing_ => SchemeElementType::UnquoteSplicing_,
112            T::Error => SchemeElementType::Error,
113            T::Eof => SchemeElementType::Eof,
114        }
115    }
116}