lang_interpreter/lexer/
token.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
use crate::lexer::CodePosition;
use std::fmt::{Display, Formatter};

#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)]
pub enum TokenType {
    Other,

    LiteralNull,
    LiteralText,
    LiteralNumber,

    ArgumentSeparator,

    EscapeSequence,

    ParserFunctionIdentifier,

    Identifier,

    Operator,

    Assignment,

    OpeningBracket,
    ClosingBracket,

    OpeningBlockBracket,
    ClosingBlockBracket,

    SingleLineTextQuotes,

    StartMultilineText,
    EndMultilineText,

    StartComment,
    StartDocComment,
    EndComment,

    LineContinuation,

    Whitespace,
    Eol,
    Eof,

    LexerError,
}

#[derive(Debug, Clone, Eq, PartialEq, Hash)]
pub struct Token {
    pos: CodePosition,
    value: Box<str>,
    token_type: TokenType,
}

impl Token {
    pub fn new(pos: CodePosition, value: &str, token_type: TokenType) -> Self {
        Self {
            pos,
            value: value.into(),
            token_type,
        }
    }

    pub fn to_raw_string(&self) -> &str {
        match self.token_type {
            TokenType::LexerError => "",
            _ => &self.value,
        }
    }

    pub fn pos(&self) -> CodePosition {
        self.pos
    }

    pub fn value(&self) -> &str {
        &self.value
    }

    pub fn token_type(&self) -> TokenType {
        self.token_type
    }
}

impl Display for Token {
    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
        write!(
            f, "Token ({:>30} at {}): \"{}\"",
            format!("{:?}", self.token_type), self.pos, self.value
        )
    }
}