pulsar_frontend/
token.rs

1// Copyright (C) 2024 Ethan Uppal. All rights reserved.
2use core::{fmt, fmt::Debug};
3use pulsar_utils::loc::{Loc, RegionProvider};
4
5#[derive(Clone, Copy, PartialEq, Eq)]
6pub enum TokenType {
7    Identifier,
8    Integer,
9    Float,
10    Bool,
11    Char,
12    String,
13    Func,
14    Let,
15    Return,
16    HardwareMap,
17    Plus,
18    Minus,
19    Times,
20    Assign,
21    LeftPar,
22    RightPar,
23    LeftBrace,
24    RightBrace,
25    LeftBracket,
26    RightBracket,
27    LeftAngle,
28    RightAngle,
29    Dot,
30    Dots,
31    Colon,
32    Comma,
33    Arrow,
34    Directive,
35    Pure,
36    Newline
37}
38
39impl Debug for TokenType {
40    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
41        write!(
42            f,
43            "{}",
44            match self {
45                Self::Identifier => "identifier",
46                Self::Integer => "integer",
47                Self::Float => "float",
48                Self::Bool => "bool",
49                Self::Char => "char",
50                Self::String => "string",
51                Self::Func => "func",
52                Self::Let => "let",
53                Self::Return => "return",
54                Self::HardwareMap => "map",
55                Self::Plus => "plus",
56                Self::Minus => "minus",
57                Self::Times => "times",
58                Self::Assign => "assign",
59                Self::LeftPar => "left-par",
60                Self::RightPar => "right-par",
61                Self::LeftBrace => "left-brace",
62                Self::RightBrace => "right-brace",
63                Self::LeftBracket => "left-bracket",
64                Self::RightBracket => "right-bracket",
65                Self::LeftAngle => "left-angle",
66                Self::RightAngle => "right-angle",
67                Self::Colon => "colon",
68                Self::Dot => "dot",
69                Self::Dots => "dots",
70                Self::Comma => "comma",
71                Self::Arrow => "arrow",
72                Self::Directive => "directive",
73                Self::Pure => "pure",
74                Self::Newline => "newline"
75            }
76        )
77    }
78}
79
80impl fmt::Display for TokenType {
81    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
82        let default = format!("{:?}", self);
83        write!(
84            f,
85            "{}",
86            match self {
87                Self::Plus => "+",
88                Self::Minus => "-",
89                Self::Times => "*",
90                Self::LeftPar => "(",
91                Self::RightPar => ")",
92                Self::LeftBrace => "{",
93                Self::RightBrace => "}",
94                Self::LeftBracket => "[",
95                Self::RightBracket => "]",
96                Self::LeftAngle => "<",
97                Self::RightAngle => ">",
98                Self::Colon => ":",
99                Self::Assign => "=",
100                Self::Dot => ".",
101                Self::Dots => "...",
102                Self::Comma => ",",
103                Self::Arrow => "->",
104                _ => default.as_str()
105            }
106        )
107    }
108}
109
110#[derive(Clone)]
111pub struct Token {
112    pub ty: TokenType,
113    pub value: String,
114    pub loc: Loc
115}
116
117impl Token {
118    /// ```
119    /// let token = Token {
120    ///     ty: TokenType::Identifier,
121    ///     value: "main".to_string(),
122    ///     loc: Loc::default()
123    /// };
124    /// assert_eq(token.value.len(), token.length());
125    /// ```
126    pub fn length(&self) -> usize {
127        self.value.len()
128    }
129}
130
131impl Debug for Token {
132    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
133        write!(
134            f,
135            "({}, ty = {:?}, loc = {})",
136            if self.value == "\n" {
137                "\\n"
138            } else {
139                self.value.as_str()
140            },
141            self.ty,
142            self.loc
143        )
144    }
145}
146
147impl RegionProvider for Token {
148    fn start(&self) -> Loc {
149        self.loc.clone()
150    }
151
152    fn end(&self) -> Loc {
153        let mut end = self.loc.clone();
154        end.pos += self.length() as isize;
155        end.col += self.length() as isize;
156        end
157    }
158}