Skip to main content

oak_scheme/parser/
element_type.rs

1use oak_core::{ElementType, UniversalElementRole};
2
3/// Element types for the Scheme language.
4#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
5#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
6pub enum SchemeElementType {
7    /// A source file.
8    SourceFile,
9    /// Whitespace.
10    Whitespace,
11    /// A newline.
12    Newline,
13    /// A comment.
14    Comment,
15    /// A line comment.
16    LineComment,
17    /// A numeric literal.
18    NumberLiteral,
19    /// A string literal.
20    StringLiteral,
21    /// A character literal.
22    CharacterLiteral,
23    /// A boolean literal.
24    BooleanLiteral,
25    /// An identifier.
26    Identifier,
27    /// A symbol.
28    Symbol,
29    /// A keyword.
30    Keyword,
31    /// `define` keyword.
32    Define,
33    /// `lambda` keyword.
34    Lambda,
35    /// `if` keyword.
36    If,
37    /// `cond` keyword.
38    Cond,
39    /// `case` keyword.
40    Case,
41    /// `let` keyword.
42    Let,
43    /// `let*` keyword.
44    LetStar,
45    /// `letrec` keyword.
46    Letrec,
47    /// `begin` keyword.
48    Begin,
49    /// `do` keyword.
50    Do,
51    /// `quote` keyword.
52    Quote,
53    /// `quasiquote` keyword.
54    Quasiquote,
55    /// `unquote` keyword.
56    Unquote,
57    /// `unquote-splicing` keyword.
58    UnquoteSplicing,
59    /// `and` keyword.
60    And,
61    /// `or` keyword.
62    Or,
63    /// `not` keyword.
64    Not,
65    /// `set!` keyword.
66    Set,
67    /// `(`.
68    LeftParen,
69    /// `)`.
70    RightParen,
71    /// `[`.
72    LeftBracket,
73    /// `]`.
74    RightBracket,
75    /// `{`.
76    LeftBrace,
77    /// `}`.
78    RightBrace,
79    /// `.`.
80    Dot,
81    /// `#`.
82    Hash,
83    /// `'`.
84    Quote_,
85    /// `` ` ``.
86    Quasiquote_,
87    /// `,`.
88    Unquote_,
89    /// `,@`.
90    UnquoteSplicing_,
91    /// A list.
92    List,
93    /// A quotation.
94    Quotation,
95    /// An error token.
96    Error,
97    /// End of stream.
98    Eof,
99}
100
101impl ElementType for SchemeElementType {
102    type Role = UniversalElementRole;
103
104    fn role(&self) -> Self::Role {
105        match self {
106            Self::SourceFile => UniversalElementRole::Root,
107            Self::Error => UniversalElementRole::Error,
108            Self::List => UniversalElementRole::Expression,
109            Self::Quotation => UniversalElementRole::Expression,
110            _ => UniversalElementRole::None,
111        }
112    }
113}
114
115impl From<crate::lexer::token_type::SchemeTokenType> for SchemeElementType {
116    fn from(token: crate::lexer::token_type::SchemeTokenType) -> Self {
117        use crate::lexer::token_type::SchemeTokenType as T;
118        match token {
119            T::SourceFile => SchemeElementType::SourceFile,
120            T::Whitespace => SchemeElementType::Whitespace,
121            T::Newline => SchemeElementType::Newline,
122            T::Comment => SchemeElementType::Comment,
123            T::LineComment => SchemeElementType::LineComment,
124            T::NumberLiteral => SchemeElementType::NumberLiteral,
125            T::StringLiteral => SchemeElementType::StringLiteral,
126            T::CharacterLiteral => SchemeElementType::CharacterLiteral,
127            T::BooleanLiteral => SchemeElementType::BooleanLiteral,
128            T::Identifier => SchemeElementType::Identifier,
129            T::Symbol => SchemeElementType::Symbol,
130            T::Keyword => SchemeElementType::Keyword,
131            T::Define => SchemeElementType::Define,
132            T::Lambda => SchemeElementType::Lambda,
133            T::If => SchemeElementType::If,
134            T::Cond => SchemeElementType::Cond,
135            T::Case => SchemeElementType::Case,
136            T::Let => SchemeElementType::Let,
137            T::LetStar => SchemeElementType::LetStar,
138            T::Letrec => SchemeElementType::Letrec,
139            T::Begin => SchemeElementType::Begin,
140            T::Do => SchemeElementType::Do,
141            T::Quote => SchemeElementType::Quote,
142            T::Quasiquote => SchemeElementType::Quasiquote,
143            T::Unquote => SchemeElementType::Unquote,
144            T::UnquoteSplicing => SchemeElementType::UnquoteSplicing,
145            T::And => SchemeElementType::And,
146            T::Or => SchemeElementType::Or,
147            T::Not => SchemeElementType::Not,
148            T::Set => SchemeElementType::Set,
149            T::LeftParen => SchemeElementType::LeftParen,
150            T::RightParen => SchemeElementType::RightParen,
151            T::LeftBracket => SchemeElementType::LeftBracket,
152            T::RightBracket => SchemeElementType::RightBracket,
153            T::LeftBrace => SchemeElementType::LeftBrace,
154            T::RightBrace => SchemeElementType::RightBrace,
155            T::Dot => SchemeElementType::Dot,
156            T::Hash => SchemeElementType::Hash,
157            T::Quote_ => SchemeElementType::Quote_,
158            T::Quasiquote_ => SchemeElementType::Quasiquote_,
159            T::Unquote_ => SchemeElementType::Unquote_,
160            T::UnquoteSplicing_ => SchemeElementType::UnquoteSplicing_,
161            T::Error => SchemeElementType::Error,
162            T::Eof => SchemeElementType::Eof,
163        }
164    }
165}