Skip to main content

oak_dot/lexer/
token_type.rs

1//! Token types for the DOT language.
2use oak_core::{Token, TokenType, UniversalTokenRole};
3
4/// A token in the DOT language.
5pub type DotToken = Token<DotTokenType>;
6
7/// Token types for the DOT language.
8#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
9#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
10#[repr(u8)]
11pub enum DotTokenType {
12    // Basic kind
13    /// An identifier.
14    Identifier,
15    /// A string literal.
16    String,
17    /// A number literal.
18    Number,
19    /// Whitespace.
20    Whitespace,
21    /// A newline.
22    Newline,
23
24    // DOT keywords
25    /// The `graph` keyword.
26    Graph,
27    /// The `digraph` keyword.
28    Digraph,
29    /// The `subgraph` keyword.
30    Subgraph,
31    /// The `node` keyword.
32    Node,
33    /// The `edge` keyword.
34    Edge,
35    /// The `strict` keyword.
36    Strict,
37
38    // Operators
39    /// The `->` arrow operator.
40    Arrow, // ->
41    /// The `--` line operator.
42    Line, // --
43    /// The `=` equal operator.
44    Equal, // =
45    /// The `;` semicolon.
46    Semicolon, // ;
47    /// The `,` comma.
48    Comma, // ,
49
50    // Delimiters
51    /// The `{` left brace.
52    LeftBrace, // {
53    /// The `}` right brace.
54    RightBrace, // }
55    /// The `[` left bracket.
56    LeftBracket, // [
57    /// The `]` right bracket.
58    RightBracket, // ]
59    /// The `(` left paren.
60    LeftParen, // (
61    /// The `)` right paren.
62    RightParen, // )
63
64    // Comments
65    /// A comment.
66    Comment,
67
68    // Special
69    /// The root token.
70    Root,
71    /// An error token.
72    Error,
73    /// End of stream marker.
74    Eof,
75}
76
77impl TokenType for DotTokenType {
78    type Role = UniversalTokenRole;
79    const END_OF_STREAM: Self = Self::Eof;
80
81    fn is_ignored(&self) -> bool {
82        matches!(self, Self::Whitespace | Self::Newline | Self::Comment)
83    }
84
85    fn role(&self) -> Self::Role {
86        match self {
87            Self::Identifier => UniversalTokenRole::Name,
88            Self::String | Self::Number => UniversalTokenRole::Literal,
89            Self::Graph | Self::Digraph | Self::Subgraph | Self::Node | Self::Edge | Self::Strict => UniversalTokenRole::Keyword,
90            Self::Arrow | Self::Line | Self::Equal | Self::Semicolon | Self::Comma => UniversalTokenRole::Operator,
91            Self::LeftBrace | Self::RightBrace | Self::LeftBracket | Self::RightBracket | Self::LeftParen | Self::RightParen => UniversalTokenRole::Punctuation,
92            Self::Comment => UniversalTokenRole::Comment,
93            _ => UniversalTokenRole::None,
94        }
95    }
96}