Skip to content

Commit 2c4d9a2

Browse files
committed
refactor(lexer/token): implement custom PartialEq & Hash traits
1 parent acc1f59 commit 2c4d9a2

File tree

2 files changed

+79
-78
lines changed

2 files changed

+79
-78
lines changed

src/lexer/token.rs

Lines changed: 76 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1,140 +1,146 @@
1-
#[derive(Debug, PartialEq, Clone, Hash, Eq)]
1+
use derive_more::derive::Display;
2+
use std::{
3+
hash::{Hash, Hasher},
4+
mem::discriminant,
5+
};
6+
7+
#[derive(Debug, Clone, Eq, Display)]
28
pub enum Token {
9+
#[display("ident")]
310
Ident(String),
11+
#[display("integer literal")]
412
Integer(String),
13+
#[display("string literal")]
514
String(String),
615

16+
#[display("=")]
717
Assign,
18+
#[display("+")]
819
Plus,
20+
#[display("-")]
921
Minus,
22+
#[display("!")]
1023
Bang,
24+
#[display("*")]
1125
Asterisk,
26+
#[display("/")]
1227
Slash,
28+
#[display("->")]
1329
Arrow,
30+
#[display(".")]
1431
Period,
32+
#[display("~")]
1533
Tilde,
34+
#[display("&")]
1635
Ampersand,
36+
#[display("|")]
1737
Bar,
38+
#[display("==")]
1839
Equal,
40+
#[display("!=")]
1941
NotEqual,
42+
#[display("<")]
2043
LessThan,
44+
#[display(">")]
2145
GreaterThan,
46+
#[display("<=")]
2247
LessEqual,
48+
#[display(">=")]
2349
GreaterEqual,
50+
#[display("&&")]
2451
And,
52+
#[display("||")]
2553
Or,
54+
#[display("<<")]
2655
Shl,
56+
#[display(">>")]
2757
Shr,
58+
#[display(",")]
2859
Comma,
60+
#[display(";")]
2961
Semicolon,
62+
#[display(":")]
3063
Colon,
64+
#[display("(")]
3165
LParen,
66+
#[display(")")]
3267
RParen,
68+
#[display("{{")]
3369
LBrace,
70+
#[display("}}")]
3471
RBrace,
72+
#[display("[")]
3573
LBracket,
74+
#[display("]")]
3675
RBracket,
3776

77+
#[display("const")]
3878
Const,
79+
#[display("true")]
3980
True,
81+
#[display("false")]
4082
False,
83+
#[display("let")]
4184
Let,
85+
#[display("fn")]
4286
Fn,
87+
#[display("enum")]
4388
Enum,
89+
#[display("struct")]
4490
Struct,
91+
#[display("if")]
4592
If,
93+
#[display("while")]
4694
While,
95+
#[display("for")]
4796
For,
97+
#[display("else")]
4898
Else,
99+
#[display("return")]
49100
Return,
101+
#[display("as")]
50102
As,
103+
#[display("continue")]
51104
Continue,
105+
#[display("break")]
52106
Break,
53107

108+
#[display("u8")]
54109
U8,
110+
#[display("u16")]
55111
U16,
112+
#[display("u32")]
56113
U32,
114+
#[display("u64")]
57115
U64,
116+
#[display("i8")]
58117
I8,
118+
#[display("i16")]
59119
I16,
120+
#[display("i32")]
60121
I32,
122+
#[display("i64")]
61123
I64,
124+
#[display("usize")]
62125
Usize,
126+
#[display("isize")]
63127
Isize,
128+
#[display("bool")]
64129
Bool,
130+
#[display("void")]
65131
Void,
66-
132+
#[display("null")]
67133
Null,
68134
}
69135

70-
impl std::fmt::Display for Token {
71-
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
72-
use Token::*;
136+
impl PartialEq<Token> for Token {
137+
fn eq(&self, other: &Token) -> bool {
138+
discriminant(self) == discriminant(other)
139+
}
140+
}
73141

74-
match self {
75-
Ident(ident) => {
76-
write!(f, "{}", if ident.is_empty() { "ident" } else { ident })
77-
}
78-
Integer(int) => write!(f, "{int}"),
79-
String(string) => write!(f, "\"{string}\""),
80-
Assign => write!(f, "="),
81-
Plus => write!(f, "+"),
82-
Minus => write!(f, "-"),
83-
Bang => write!(f, "!"),
84-
Asterisk => write!(f, "*"),
85-
Slash => write!(f, "/"),
86-
Arrow => write!(f, "->"),
87-
Period => write!(f, "."),
88-
Tilde => write!(f, "~"),
89-
Ampersand => write!(f, "&"),
90-
Bar => write!(f, "|"),
91-
Equal => write!(f, "=="),
92-
NotEqual => write!(f, "!="),
93-
LessThan => write!(f, "<"),
94-
GreaterThan => write!(f, ">"),
95-
LessEqual => write!(f, "<="),
96-
GreaterEqual => write!(f, "=>"),
97-
And => write!(f, "&&"),
98-
Or => write!(f, "||"),
99-
Shl => write!(f, "<<"),
100-
Shr => write!(f, ">>"),
101-
Comma => write!(f, ","),
102-
Semicolon => write!(f, ";"),
103-
Colon => write!(f, ":"),
104-
LParen => write!(f, "("),
105-
RParen => write!(f, ")"),
106-
LBrace => write!(f, "{{"),
107-
RBrace => write!(f, "}}"),
108-
LBracket => write!(f, "["),
109-
RBracket => write!(f, "]"),
110-
Const => write!(f, "const"),
111-
True => write!(f, "true"),
112-
False => write!(f, "false"),
113-
Let => write!(f, "let"),
114-
Fn => write!(f, "fn"),
115-
Enum => write!(f, "enum"),
116-
Struct => write!(f, "struct"),
117-
If => write!(f, "if"),
118-
While => write!(f, "while"),
119-
For => write!(f, "for"),
120-
Else => write!(f, "else"),
121-
Return => write!(f, "return"),
122-
As => write!(f, "as"),
123-
Continue => write!(f, "continue"),
124-
Break => write!(f, "break"),
125-
U8 => write!(f, "u8"),
126-
U16 => write!(f, "u16"),
127-
U32 => write!(f, "u32"),
128-
U64 => write!(f, "u64"),
129-
I8 => write!(f, "i8"),
130-
I16 => write!(f, "i16"),
131-
I32 => write!(f, "i32"),
132-
I64 => write!(f, "i64"),
133-
Usize => write!(f, "usize"),
134-
Isize => write!(f, "isize"),
135-
Bool => write!(f, "bool"),
136-
Void => write!(f, "void"),
137-
Null => write!(f, "NULL"),
138-
}
142+
impl Hash for Token {
143+
fn hash<H: Hasher>(&self, state: &mut H) {
144+
discriminant(self).hash(state)
139145
}
140146
}

src/parser/mod.rs

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ pub mod expr;
99

1010
use crate::{
1111
diagnostics::{Diagnostic, Diagnostics},
12-
lexer::{self, span::Span, Token},
12+
lexer::{span::Span, Token},
1313
};
1414
pub use error::{Error, TyError};
1515
pub use expr::*;
@@ -43,7 +43,7 @@ pub struct Parser<'a, 'src, T: Iterator<Item = Result<Token, Span>>> {
4343
}
4444

4545
impl<'a, 'src, T: Iterator<Item = Result<Token, Span>>> Parser<'a, 'src, T> {
46-
pub fn new(mut lexer: T, diag: &'a mut Diagnostics<'src>) -> Result<Self, Error> {
46+
pub fn new(lexer: T, diag: &'a mut Diagnostics<'src>) -> Result<Self, Error> {
4747
let mut parser = Self {
4848
cur_token: None,
4949
peek_token: None,
@@ -147,12 +147,7 @@ impl<'a, 'src, T: Iterator<Item = Result<Token, Span>>> Parser<'a, 'src, T> {
147147
}
148148

149149
pub fn expr(&mut self, precedence: Precedence) -> Result<Expr, Error> {
150-
let token = match self.cur_token.as_ref().unwrap() {
151-
Token::Ident(_) => Token::Ident(Default::default()),
152-
Token::Integer(_) => Token::Integer(Default::default()),
153-
Token::String(_) => Token::String(Default::default()),
154-
token => token.clone(),
155-
};
150+
let token = self.cur_token.clone().unwrap();
156151

157152
let mut left = match self.prefix_fns.get(&token) {
158153
Some(func) => func(self),

0 commit comments

Comments
 (0)