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