Actually just three programming languages in a trenchcoat
at string-repr-callable 43 lines 1.2 kB view raw
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}