|
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)] |
2 | 8 | pub enum Token {
|
| 9 | + #[display("ident")] |
3 | 10 | Ident(String),
|
| 11 | + #[display("integer literal")] |
4 | 12 | Integer(String),
|
| 13 | + #[display("string literal")] |
5 | 14 | String(String),
|
6 | 15 |
|
| 16 | + #[display("=")] |
7 | 17 | Assign,
|
| 18 | + #[display("+")] |
8 | 19 | Plus,
|
| 20 | + #[display("-")] |
9 | 21 | Minus,
|
| 22 | + #[display("!")] |
10 | 23 | Bang,
|
| 24 | + #[display("*")] |
11 | 25 | Asterisk,
|
| 26 | + #[display("/")] |
12 | 27 | Slash,
|
| 28 | + #[display("->")] |
13 | 29 | Arrow,
|
| 30 | + #[display(".")] |
14 | 31 | Period,
|
| 32 | + #[display("~")] |
15 | 33 | Tilde,
|
| 34 | + #[display("&")] |
16 | 35 | Ampersand,
|
| 36 | + #[display("|")] |
17 | 37 | Bar,
|
| 38 | + #[display("==")] |
18 | 39 | Equal,
|
| 40 | + #[display("!=")] |
19 | 41 | NotEqual,
|
| 42 | + #[display("<")] |
20 | 43 | LessThan,
|
| 44 | + #[display(">")] |
21 | 45 | GreaterThan,
|
| 46 | + #[display("<=")] |
22 | 47 | LessEqual,
|
| 48 | + #[display(">=")] |
23 | 49 | GreaterEqual,
|
| 50 | + #[display("&&")] |
24 | 51 | And,
|
| 52 | + #[display("||")] |
25 | 53 | Or,
|
| 54 | + #[display("<<")] |
26 | 55 | Shl,
|
| 56 | + #[display(">>")] |
27 | 57 | Shr,
|
| 58 | + #[display(",")] |
28 | 59 | Comma,
|
| 60 | + #[display(";")] |
29 | 61 | Semicolon,
|
| 62 | + #[display(":")] |
30 | 63 | Colon,
|
| 64 | + #[display("(")] |
31 | 65 | LParen,
|
| 66 | + #[display(")")] |
32 | 67 | RParen,
|
| 68 | + #[display("{{")] |
33 | 69 | LBrace,
|
| 70 | + #[display("}}")] |
34 | 71 | RBrace,
|
| 72 | + #[display("[")] |
35 | 73 | LBracket,
|
| 74 | + #[display("]")] |
36 | 75 | RBracket,
|
37 | 76 |
|
| 77 | + #[display("const")] |
38 | 78 | Const,
|
| 79 | + #[display("true")] |
39 | 80 | True,
|
| 81 | + #[display("false")] |
40 | 82 | False,
|
| 83 | + #[display("let")] |
41 | 84 | Let,
|
| 85 | + #[display("fn")] |
42 | 86 | Fn,
|
| 87 | + #[display("enum")] |
43 | 88 | Enum,
|
| 89 | + #[display("struct")] |
44 | 90 | Struct,
|
| 91 | + #[display("if")] |
45 | 92 | If,
|
| 93 | + #[display("while")] |
46 | 94 | While,
|
| 95 | + #[display("for")] |
47 | 96 | For,
|
| 97 | + #[display("else")] |
48 | 98 | Else,
|
| 99 | + #[display("return")] |
49 | 100 | Return,
|
| 101 | + #[display("as")] |
50 | 102 | As,
|
| 103 | + #[display("continue")] |
51 | 104 | Continue,
|
| 105 | + #[display("break")] |
52 | 106 | Break,
|
53 | 107 |
|
| 108 | + #[display("u8")] |
54 | 109 | U8,
|
| 110 | + #[display("u16")] |
55 | 111 | U16,
|
| 112 | + #[display("u32")] |
56 | 113 | U32,
|
| 114 | + #[display("u64")] |
57 | 115 | U64,
|
| 116 | + #[display("i8")] |
58 | 117 | I8,
|
| 118 | + #[display("i16")] |
59 | 119 | I16,
|
| 120 | + #[display("i32")] |
60 | 121 | I32,
|
| 122 | + #[display("i64")] |
61 | 123 | I64,
|
| 124 | + #[display("usize")] |
62 | 125 | Usize,
|
| 126 | + #[display("isize")] |
63 | 127 | Isize,
|
| 128 | + #[display("bool")] |
64 | 129 | Bool,
|
| 130 | + #[display("void")] |
65 | 131 | Void,
|
66 |
| - |
| 132 | + #[display("null")] |
67 | 133 | Null,
|
68 | 134 | }
|
69 | 135 |
|
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 | +} |
73 | 141 |
|
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) |
139 | 145 | }
|
140 | 146 | }
|
0 commit comments