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,
10 Newline,
11 Comment,
12
13 StringLiteral,
14 NumberLiteral,
15 Identifier,
16
17 Equal, Dot, Colon, IsGlobal, IsLocal, Plus, Minus, Star, Percent, Dollar, Comma, Hash, Slash, Backslash, Pipe, Ampersand, Caret, Tilde, Less, Greater, LeftParen, RightParen, LeftBracket, RightBracket, LeftBrace, RightBrace, Eof,
54 Error,
55}
56
57impl JTokenType {
58 pub fn is_keyword(&self) -> bool {
60 false
61 }
62
63 pub fn is_punctuation(&self) -> bool {
65 matches!(self, Self::LeftParen | Self::RightParen | Self::LeftBracket | Self::RightBracket | Self::LeftBrace | Self::RightBrace)
66 }
67
68 pub fn is_ignored(&self) -> bool {
70 matches!(self, Self::Whitespace | Self::Newline | Self::Comment)
71 }
72}
73
74impl TokenType for JTokenType {
75 type Role = UniversalTokenRole;
76 const END_OF_STREAM: Self = Self::Eof;
77
78 fn role(&self) -> Self::Role {
79 match self {
80 Self::Whitespace | Self::Newline => UniversalTokenRole::Whitespace,
81 Self::Comment => UniversalTokenRole::Comment,
82 Self::StringLiteral | Self::NumberLiteral => UniversalTokenRole::Literal,
83 Self::Identifier => UniversalTokenRole::Name,
84 _ if self.is_punctuation() => UniversalTokenRole::Punctuation,
85 Self::Eof | Self::Error => UniversalTokenRole::None,
86 _ => UniversalTokenRole::Operator,
87 }
88 }
89}