Skip to main content

oak_scheme/lexer/
token_type.rs

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