Skip to main content

oak_dot/lexer/
token_type.rs

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