Skip to main content

oak_scheme/lexer/
token_type.rs

1/// Token type definitions for Scheme lexer.
2use oak_core::{Source, Token, TokenType, UniversalElementRole, UniversalTokenRole};
3
4pub type SchemeToken = Token<SchemeTokenType>;
5
6impl TokenType for SchemeTokenType {
7    type Role = UniversalTokenRole;
8    const END_OF_STREAM: Self = Self::Eof;
9
10    fn is_ignored(&self) -> bool {
11        matches!(self, Self::Whitespace | Self::Newline | Self::Comment | Self::LineComment)
12    }
13
14    fn role(&self) -> Self::Role {
15        match self {
16            Self::Whitespace | Self::Newline => UniversalTokenRole::Whitespace,
17            Self::Comment | Self::LineComment => UniversalTokenRole::Comment,
18            Self::Error => UniversalTokenRole::Error,
19            Self::Eof => UniversalTokenRole::Eof,
20            _ => UniversalTokenRole::None,
21        }
22    }
23}
24
25/// Token types for the Scheme language.
26#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
27#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
28pub enum SchemeTokenType {
29    /// Whitespace.
30    Whitespace,
31    /// A newline.
32    Newline,
33    /// A comment.
34    Comment,
35    /// A line comment.
36    LineComment,
37    /// A numeric literal.
38    NumberLiteral,
39    /// A string literal.
40    StringLiteral,
41    /// A character literal.
42    CharacterLiteral,
43    /// A boolean literal.
44    BooleanLiteral,
45    /// An identifier.
46    Identifier,
47    /// A symbol.
48    Symbol,
49    /// A keyword.
50    Keyword,
51    /// `define` keyword.
52    Define,
53    /// `lambda` keyword.
54    Lambda,
55    /// `if` keyword.
56    If,
57    /// `cond` keyword.
58    Cond,
59    /// `case` keyword.
60    Case,
61    /// `let` keyword.
62    Let,
63    /// `let*` keyword.
64    LetStar,
65    /// `letrec` keyword.
66    Letrec,
67    /// `begin` keyword.
68    Begin,
69    /// `do` keyword.
70    Do,
71    /// `quote` keyword.
72    Quote,
73    /// `quasiquote` keyword.
74    Quasiquote,
75    /// `unquote` keyword.
76    Unquote,
77    /// `unquote-splicing` keyword.
78    UnquoteSplicing,
79    /// `and` keyword.
80    And,
81    /// `or` keyword.
82    Or,
83    /// `not` keyword.
84    Not,
85    /// `set!` keyword.
86    Set,
87    /// `(`.
88    LeftParen,
89    /// `)`.
90    RightParen,
91    /// `[`.
92    LeftBracket,
93    /// `]`.
94    RightBracket,
95    /// `{`.
96    LeftBrace,
97    /// `}`.
98    RightBrace,
99    /// `.`.
100    Dot,
101    /// `#`.
102    Hash,
103    /// `'`.
104    Quote_,
105    /// `` ` ``.
106    Quasiquote_,
107    /// `,`.
108    Unquote_,
109    /// `,@`.
110    UnquoteSplicing_,
111    /// An error token.
112    Error,
113    /// End of stream.
114    Eof,
115    /// A source file.
116    SourceFile,
117}