oak_j/lexer/
token_type.rs1use oak_core::{TokenType, UniversalTokenRole};
2#[cfg(feature = "serde")]
3use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
7#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
8pub enum JTokenType {
9 Whitespace,
11 Newline,
13 Comment,
15
16 StringLiteral,
18 NumberLiteral,
20 Identifier,
22
23 Equal,
27 Dot,
29 Colon,
31
32 IsGlobal,
35 IsLocal,
37
38 Plus,
41 Minus,
43 Star,
45 Percent,
47 Dollar,
49 Comma,
51 Hash,
53 Slash,
55 Backslash,
57 Pipe,
59 Ampersand,
61 Caret,
63 Tilde,
65 Less,
67 Greater,
69
70 LeftParen,
73 RightParen,
75 LeftBracket,
77 RightBracket,
79 LeftBrace,
81 RightBrace,
83
84 Eof,
87 Error,
89}
90
91impl JTokenType {
92 pub fn is_keyword(&self) -> bool {
94 false
95 }
96
97 pub fn is_punctuation(&self) -> bool {
99 matches!(self, Self::LeftParen | Self::RightParen | Self::LeftBracket | Self::RightBracket | Self::LeftBrace | Self::RightBrace)
100 }
101
102 pub fn is_ignored(&self) -> bool {
104 matches!(self, Self::Whitespace | Self::Newline | Self::Comment)
105 }
106}
107
108impl TokenType for JTokenType {
109 type Role = UniversalTokenRole;
110 const END_OF_STREAM: Self = Self::Eof;
111
112 fn role(&self) -> Self::Role {
113 match self {
114 Self::Whitespace | Self::Newline => UniversalTokenRole::Whitespace,
115 Self::Comment => UniversalTokenRole::Comment,
116 Self::StringLiteral | Self::NumberLiteral => UniversalTokenRole::Literal,
117 Self::Identifier => UniversalTokenRole::Name,
118 _ if self.is_punctuation() => UniversalTokenRole::Punctuation,
119 Self::Eof | Self::Error => UniversalTokenRole::None,
120 _ => UniversalTokenRole::Operator,
121 }
122 }
123}