oak_scheme/kind/
mod.rs

1use oak_core::{ElementType, TokenType, UniversalElementRole, UniversalTokenRole};
2
3#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
4pub enum SchemeSyntaxKind {
5    // 空白字符和换行
6    Whitespace,
7    Newline,
8    Comment,
9
10    // 注释
11    LineComment,
12
13    // 字面量
14    NumberLiteral,
15    StringLiteral,
16    CharacterLiteral,
17    BooleanLiteral,
18
19    // 标识符和符号
20    Identifier,
21    Symbol,
22
23    // 关键字
24    Keyword,
25    Define,
26    Lambda,
27    If,
28    Cond,
29    Case,
30    Let,
31    LetStar,
32    Letrec,
33    Begin,
34    Do,
35    Quote,
36    Quasiquote,
37    Unquote,
38    UnquoteSplicing,
39    And,
40    Or,
41    Not,
42    Set,
43
44    // 分隔符
45    LeftParen,
46    RightParen,
47    LeftBracket,
48    RightBracket,
49    LeftBrace,
50    RightBrace,
51    Dot,
52
53    // 特殊符号
54    Hash,
55    Quote_,
56    Quasiquote_,
57    Unquote_,
58    UnquoteSplicing_,
59
60    // 错误和结束
61    Error,
62    Eof,
63
64    // 根节点
65    SourceFile,
66}
67
68impl TokenType for SchemeSyntaxKind {
69    const END_OF_STREAM: Self = Self::Eof;
70    type Role = UniversalTokenRole;
71
72    fn role(&self) -> Self::Role {
73        match self {
74            Self::Whitespace | Self::Newline => UniversalTokenRole::Whitespace,
75            Self::LineComment => UniversalTokenRole::Comment,
76            Self::Eof => UniversalTokenRole::Eof,
77            _ => UniversalTokenRole::None,
78        }
79    }
80}
81
82impl ElementType for SchemeSyntaxKind {
83    type Role = UniversalElementRole;
84
85    fn role(&self) -> Self::Role {
86        match self {
87            Self::Error => UniversalElementRole::Error,
88            _ => UniversalElementRole::None,
89        }
90    }
91}