oak_julia/kind/
mod.rs

1use core::{fmt, range::Range};
2use oak_core::{ElementType, TokenType, UniversalElementRole, UniversalTokenRole};
3use serde::{Deserialize, Serialize};
4
5/// Julia 令牌
6#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
7pub struct JuliaToken {
8    pub kind: JuliaSyntaxKind,
9    #[serde(with = "oak_core::serde_range")]
10    pub span: Range<usize>,
11}
12
13use core::str::FromStr;
14
15/// Julia 令牌种类
16#[derive(Debug, Clone, PartialEq, Eq, Copy, Serialize, Deserialize, Hash)]
17pub enum JuliaSyntaxKind {
18    Root,
19    // 关键字
20    If,
21    ElseIf,
22    Else,
23    For,
24    While,
25    Break,
26    Continue,
27    Function,
28    End,
29    Begin,
30    Module,
31    Using,
32    Import,
33    Export,
34    Const,
35    Local,
36    Global,
37    True,
38    False,
39    Nothing,
40    Return,
41
42    // 操作符
43    Plus,
44    Minus,
45    Star,
46    Slash,
47    Percent,
48    Caret,
49    Equal,
50    NotEqual,
51    LessThan,
52    GreaterThan,
53    LessEqual,
54    GreaterEqual,
55    Assign,
56    PlusAssign,
57    MinusAssign,
58    StarAssign,
59    SlashAssign,
60    PercentAssign,
61    CaretAssign,
62    And,
63    Or,
64    Not,
65    Colon,
66    Dot,
67    Range,
68    Arrow,
69    FatArrow,
70    BitAnd,
71    BitOr,
72    BitXor,
73    BitNot,
74    LeftShift,
75    RightShift,
76
77    // 分隔符
78    LeftParen,
79    RightParen,
80    LeftBracket,
81    RightBracket,
82    LeftBrace,
83    RightBrace,
84    Comma,
85    Semicolon,
86
87    // 字面量
88    IntegerLiteral,
89    FloatLiteral,
90    StringLiteral,
91    CharLiteral,
92    BooleanLiteral,
93    NothingLiteral,
94
95    // 其他
96    Identifier,
97    Comment,
98    Whitespace,
99    Newline,
100    Eof,
101    Error,
102    Invalid,
103}
104
105impl FromStr for JuliaSyntaxKind {
106    type Err = ();
107
108    fn from_str(s: &str) -> Result<Self, Self::Err> {
109        match s {
110            "if" => Ok(JuliaSyntaxKind::If),
111            "elseif" => Ok(JuliaSyntaxKind::ElseIf),
112            "else" => Ok(JuliaSyntaxKind::Else),
113            "for" => Ok(JuliaSyntaxKind::For),
114            "while" => Ok(JuliaSyntaxKind::While),
115            "break" => Ok(JuliaSyntaxKind::Break),
116            "continue" => Ok(JuliaSyntaxKind::Continue),
117            "function" => Ok(JuliaSyntaxKind::Function),
118            "end" => Ok(JuliaSyntaxKind::End),
119            "begin" => Ok(JuliaSyntaxKind::Begin),
120            "module" => Ok(JuliaSyntaxKind::Module),
121            "using" => Ok(JuliaSyntaxKind::Using),
122            "import" => Ok(JuliaSyntaxKind::Import),
123            "export" => Ok(JuliaSyntaxKind::Export),
124            "const" => Ok(JuliaSyntaxKind::Const),
125            "local" => Ok(JuliaSyntaxKind::Local),
126            "global" => Ok(JuliaSyntaxKind::Global),
127            "true" => Ok(JuliaSyntaxKind::True),
128            "false" => Ok(JuliaSyntaxKind::False),
129            "nothing" => Ok(JuliaSyntaxKind::Nothing),
130            "return" => Ok(JuliaSyntaxKind::Return),
131            _ => Err(()),
132        }
133    }
134}
135
136impl JuliaSyntaxKind {
137    pub fn as_str(&self) -> &'static str {
138        match self {
139            JuliaSyntaxKind::Root => "root",
140            JuliaSyntaxKind::If => "if",
141            JuliaSyntaxKind::ElseIf => "elseif",
142            JuliaSyntaxKind::Else => "else",
143            JuliaSyntaxKind::For => "for",
144            JuliaSyntaxKind::While => "while",
145            JuliaSyntaxKind::Break => "break",
146            JuliaSyntaxKind::Continue => "continue",
147            JuliaSyntaxKind::Function => "function",
148            JuliaSyntaxKind::End => "end",
149            JuliaSyntaxKind::Begin => "begin",
150            JuliaSyntaxKind::Module => "module",
151            JuliaSyntaxKind::Using => "using",
152            JuliaSyntaxKind::Import => "import",
153            JuliaSyntaxKind::Export => "export",
154            JuliaSyntaxKind::Const => "const",
155            JuliaSyntaxKind::Local => "local",
156            JuliaSyntaxKind::Global => "global",
157            JuliaSyntaxKind::True => "true",
158            JuliaSyntaxKind::False => "false",
159            JuliaSyntaxKind::Nothing => "nothing",
160            JuliaSyntaxKind::Return => "return",
161            JuliaSyntaxKind::Plus => "+",
162            JuliaSyntaxKind::Minus => "-",
163            JuliaSyntaxKind::Star => "*",
164            JuliaSyntaxKind::Slash => "/",
165            JuliaSyntaxKind::Percent => "%",
166            JuliaSyntaxKind::Caret => "^",
167            JuliaSyntaxKind::Equal => "==",
168            JuliaSyntaxKind::NotEqual => "!=",
169            JuliaSyntaxKind::LessThan => "<",
170            JuliaSyntaxKind::GreaterThan => ">",
171            JuliaSyntaxKind::LessEqual => "<=",
172            JuliaSyntaxKind::GreaterEqual => ">=",
173            JuliaSyntaxKind::Assign => "=",
174            JuliaSyntaxKind::PlusAssign => "+=",
175            JuliaSyntaxKind::MinusAssign => "-=",
176            JuliaSyntaxKind::StarAssign => "*=",
177            JuliaSyntaxKind::SlashAssign => "/=",
178            JuliaSyntaxKind::PercentAssign => "%=",
179            JuliaSyntaxKind::CaretAssign => "^=",
180            JuliaSyntaxKind::And => "&&",
181            JuliaSyntaxKind::Or => "||",
182            JuliaSyntaxKind::Not => "!",
183            JuliaSyntaxKind::Colon => ":",
184            JuliaSyntaxKind::Dot => ".",
185            JuliaSyntaxKind::Range => "..",
186            JuliaSyntaxKind::Arrow => "->",
187            JuliaSyntaxKind::FatArrow => "=>",
188            JuliaSyntaxKind::BitAnd => "&",
189            JuliaSyntaxKind::BitOr => "|",
190            JuliaSyntaxKind::BitXor => "^",
191            JuliaSyntaxKind::BitNot => "~",
192            JuliaSyntaxKind::LeftShift => "<<",
193            JuliaSyntaxKind::RightShift => ">>",
194            JuliaSyntaxKind::LeftParen => "(",
195            JuliaSyntaxKind::RightParen => ")",
196            JuliaSyntaxKind::LeftBracket => "[",
197            JuliaSyntaxKind::RightBracket => "]",
198            JuliaSyntaxKind::LeftBrace => "{",
199            JuliaSyntaxKind::RightBrace => "}",
200            JuliaSyntaxKind::Comma => ",",
201            JuliaSyntaxKind::Semicolon => ";",
202            JuliaSyntaxKind::IntegerLiteral => "integer",
203            JuliaSyntaxKind::FloatLiteral => "float",
204            JuliaSyntaxKind::StringLiteral => "string",
205            JuliaSyntaxKind::CharLiteral => "char",
206            JuliaSyntaxKind::BooleanLiteral => "boolean",
207            JuliaSyntaxKind::NothingLiteral => "nothing",
208            JuliaSyntaxKind::Identifier => "identifier",
209            JuliaSyntaxKind::Comment => "comment",
210            JuliaSyntaxKind::Whitespace => "whitespace",
211            JuliaSyntaxKind::Newline => "newline",
212            JuliaSyntaxKind::Eof => "eof",
213            JuliaSyntaxKind::Error => "error",
214            JuliaSyntaxKind::Invalid => "invalid",
215        }
216    }
217
218    pub fn from_str(s: &str) -> Option<Self> {
219        match s {
220            "if" => Some(Self::If),
221            "elseif" => Some(Self::ElseIf),
222            "else" => Some(Self::Else),
223            "for" => Some(Self::For),
224            "while" => Some(Self::While),
225            "break" => Some(Self::Break),
226            "continue" => Some(Self::Continue),
227            "function" => Some(Self::Function),
228            "end" => Some(Self::End),
229            "begin" => Some(Self::Begin),
230            "module" => Some(Self::Module),
231            "using" => Some(Self::Using),
232            "import" => Some(Self::Import),
233            "export" => Some(Self::Export),
234            "const" => Some(Self::Const),
235            "local" => Some(Self::Local),
236            "global" => Some(Self::Global),
237            "true" => Some(Self::True),
238            "false" => Some(Self::False),
239            "nothing" => Some(Self::Nothing),
240            "return" => Some(Self::Return),
241            _ => None,
242        }
243    }
244}
245
246impl fmt::Display for JuliaSyntaxKind {
247    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
248        write!(f, "{}", self.as_str())
249    }
250}
251
252impl TokenType for JuliaSyntaxKind {
253    const END_OF_STREAM: Self = Self::Eof;
254    type Role = UniversalTokenRole;
255
256    fn role(&self) -> Self::Role {
257        match self {
258            Self::Whitespace | Self::Newline => UniversalTokenRole::Whitespace,
259            Self::Comment => UniversalTokenRole::Comment,
260            Self::Eof => UniversalTokenRole::Eof,
261            _ => UniversalTokenRole::None,
262        }
263    }
264}
265
266impl ElementType for JuliaSyntaxKind {
267    type Role = UniversalElementRole;
268
269    fn role(&self) -> Self::Role {
270        match self {
271            Self::Root => UniversalElementRole::Root,
272            Self::Error => UniversalElementRole::Error,
273            _ => UniversalElementRole::None,
274        }
275    }
276}