blues_lsp/syntax/parser/
token.rs1use std::fmt::Display;
2
3use crate::{
4 syntax::lexer::token::{Kw, NumLit, Sym, TokenKind},
5 util::data::bitset::BitSet,
6};
7
8#[derive(Debug, Clone, Copy, PartialEq, Eq)]
11pub enum Tt {
12 Kw(Kw),
14 Ident,
16 SysIdent,
18 Sym(Sym),
20 Num(NumLit),
22 Str,
24 Eof,
26}
27
28impl Tt {
29 pub fn from_kind(kind: &TokenKind) -> Option<Tt> {
30 match kind {
31 TokenKind::Kw(kw) => Some(Tt::Kw(*kw)),
32 TokenKind::Ident(_) => Some(Tt::Ident),
33 TokenKind::SysIdent(_) => Some(Tt::SysIdent),
34 TokenKind::Sym(sym) => Some(Tt::Sym(*sym)),
35 TokenKind::Num(num_lit) => Some(Tt::Num(*num_lit)),
36 TokenKind::Str(_) => Some(Tt::Str),
37 TokenKind::Comment => None,
38 TokenKind::Error => None,
39 }
40 }
41}
42
43impl Display for Tt {
44 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
45 match self {
46 Tt::Kw(kw) => write!(f, "keyword '{kw}'"),
47 Tt::Ident => write!(f, "identifier"),
48 Tt::SysIdent => write!(f, "system identifier"),
49 Tt::Sym(sym) => write!(f, "symbol '{sym}'"),
50 Tt::Num(_) => write!(f, "number"),
51 Tt::Str => write!(f, "string"),
52 Tt::Eof => write!(f, "end-of-file"),
53 }
54 }
55}
56
57impl From<Kw> for Tt {
58 fn from(value: Kw) -> Self {
59 Tt::Kw(value)
60 }
61}
62
63impl From<Sym> for Tt {
64 fn from(value: Sym) -> Self {
65 Tt::Sym(value)
66 }
67}
68
69impl From<NumLit> for Tt {
70 fn from(value: NumLit) -> Self {
71 Tt::Num(value)
72 }
73}
74
75#[derive(Debug, Clone, Copy)]
76pub struct TtSet {
77 set: BitSet<3>,
78}
79
80impl Default for TtSet {
81 fn default() -> Self {
82 Self::new()
83 }
84}
85
86impl TtSet {
87 pub const fn new() -> Self {
88 Self { set: BitSet::new() }
89 }
90
91 pub const fn inherit(mut self, other: TtSet) -> Self {
92 self.set.union(other.set);
93 self
94 }
95
96 pub const fn ty_idx(ty: Tt) -> usize {
97 match ty {
98 Tt::Ident => 0,
99 Tt::SysIdent => 1,
100 Tt::Str => 2,
101 Tt::Eof => 3,
102 Tt::Num(NumLit::Int) => 4,
103 Tt::Num(NumLit::Real) => 5,
104 Tt::Num(NumLit::Repeated) => 6,
105 Tt::Num(NumLit::Mixed) => 7,
106 Tt::Kw(kw) => 8 + kw as usize,
107 Tt::Sym(sym) => 8 + Kw::__Last as usize + sym as usize,
108 }
109 }
110
111 pub const fn add(&mut self, ty: Tt) {
112 self.set.add(Self::ty_idx(ty));
113 }
114
115 pub const fn contains(&self, ty: Tt) -> bool {
116 self.set.contains(Self::ty_idx(ty))
117 }
118
119 pub const fn tys(mut self, tys: &[Tt]) -> Self {
120 let mut i = 0;
121 while i < tys.len() {
122 self.add(tys[i]);
123 i += 1;
124 }
125 self
126 }
127
128 pub const fn kws(mut self, kws: &[Kw]) -> Self {
129 let mut i = 0;
130 while i < kws.len() {
131 self.add(Tt::Kw(kws[i]));
132 i += 1;
133 }
134 self
135 }
136
137 pub const fn syms(mut self, syms: &[Sym]) -> Self {
138 let mut i = 0;
139 while i < syms.len() {
140 self.add(Tt::Sym(syms[i]));
141 i += 1;
142 }
143 self
144 }
145}