1use 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 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}