Skip to main content

blues_lsp/syntax/parser/
token.rs

1use std::fmt::Display;
2
3use crate::{
4    syntax::lexer::token::{Kw, NumLit, Sym, TokenKind},
5    util::data::bitset::BitSet,
6};
7
8/// "Token type"
9/// Aka.: a TokenKind, but with with data unnecessary for parsing stripped.
10#[derive(Debug, Clone, Copy, PartialEq, Eq)]
11pub enum Tt {
12    /// Keywords
13    Kw(Kw),
14    /// Identifiers
15    Ident,
16    /// System identifiers ('$foo')
17    SysIdent,
18    /// Symbols
19    Sym(Sym),
20    /// Numeric literals
21    Num(NumLit),
22    /// String literals
23    Str,
24    /// End-of-File sentinel, parser internal
25    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}