Skip to main content

oak_nginx/lexer/
token_type.rs

1use oak_core::{Token, TokenRole, TokenType, UniversalTokenRole};
2#[cfg(feature = "serde")]
3use serde::{Deserialize, Serialize};
4
5pub type NginxToken = Token<NginxTokenType>;
6
7#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
8#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
9pub enum NginxTokenType {
10    // 节点种类
11    Root,
12    Directive,
13    Block,
14    Parameter,
15    Value,
16    Comment,
17
18    // 词法种类 - 关键字
19    ServerKeyword,     // server
20    LocationKeyword,   // location
21    UpstreamKeyword,   // upstream
22    HttpKeyword,       // http
23    EventsKeyword,     // events
24    ListenKeyword,     // listen
25    ServerNameKeyword, // server_name
26    RootKeyword,       // root
27    IndexKeyword,      // index
28    ProxyPassKeyword,  // proxy_pass
29
30    // 词法种类 - 符号
31    LeftBrace,  // {
32    RightBrace, // }
33    Semicolon,  // ;
34
35    // 词法种类 - 字面量
36    Identifier,
37    String,
38    Number,
39    Path,
40    Url,
41
42    // 词法种类 - 其他
43    Whitespace,
44    Newline,
45    CommentToken,
46    Eof,
47    Error,
48}
49
50impl NginxTokenType {
51    pub fn is_element(&self) -> bool {
52        matches!(self, Self::Root | Self::Directive | Self::Block | Self::Parameter | Self::Value | Self::Comment)
53    }
54
55    pub fn is_token(&self) -> bool {
56        !self.is_element()
57    }
58}
59
60impl TokenType for NginxTokenType {
61    type Role = UniversalTokenRole;
62    const END_OF_STREAM: Self = Self::Eof;
63
64    fn role(&self) -> Self::Role {
65        match self {
66            Self::ServerKeyword | Self::LocationKeyword | Self::UpstreamKeyword | Self::HttpKeyword | Self::EventsKeyword | Self::ListenKeyword | Self::ServerNameKeyword | Self::RootKeyword | Self::IndexKeyword | Self::ProxyPassKeyword => {
67                UniversalTokenRole::Keyword
68            }
69
70            Self::LeftBrace | Self::RightBrace | Self::Semicolon => UniversalTokenRole::Punctuation,
71
72            Self::Identifier => UniversalTokenRole::Name,
73            Self::String | Self::Number | Self::Path | Self::Url => UniversalTokenRole::Literal,
74
75            Self::Whitespace | Self::Newline => UniversalTokenRole::Whitespace,
76            Self::CommentToken => UniversalTokenRole::Comment,
77            Self::Error => UniversalTokenRole::Error,
78            _ => UniversalTokenRole::None,
79        }
80    }
81}