Skip to main content

oak_scheme/kind/
mod.rs

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