Actually just three programming languages in a trenchcoat
1use super::*;
2use crate::Parser;
3use bitvec::prelude::*;
4use trilogy_scanner::{Token, TokenType};
5
6/// A bits literal expression
7///
8/// ```trilogy
9/// 0bb1010
10/// ```
11#[derive(Clone, Debug, Spanned, PrettyPrintSExpr)]
12pub struct BitsLiteral {
13 pub token: Token,
14}
15
16impl BitsLiteral {
17 pub(crate) fn parse(parser: &mut Parser) -> SyntaxResult<Self> {
18 let token = parser
19 .expect(TokenType::Bits)
20 .map_err(|token| parser.expected(token, "expected bits literal"))?;
21 Ok(Self { token })
22 }
23
24 /// The bits value of this expression.
25 pub fn value(&self) -> &BitVec<usize, Msb0> {
26 self.token.value.as_ref().unwrap().as_bits().unwrap()
27 }
28
29 /// The bits value of this expression.
30 pub fn into_value(self) -> BitVec<usize, Msb0> {
31 self.token.value.unwrap().into_bits().unwrap()
32 }
33}
34
35#[cfg(test)]
36mod test {
37 use super::*;
38
39 test_parse!(bits_bin: "0bb0101" => BitsLiteral::parse => "(BitsLiteral _)");
40 test_parse!(bits_hex: "0xb10af" => BitsLiteral::parse => "(BitsLiteral _)");
41 test_parse!(bits_oct: "0ob107" => BitsLiteral::parse => "(BitsLiteral _)");
42 test_parse_error!(not_bits: "0b101" => BitsLiteral::parse => "expected bits literal");
43}