diff --git a/src/schala_lang/parsing.rs b/src/schala_lang/parsing.rs index d09b5fa..72a349e 100644 --- a/src/schala_lang/parsing.rs +++ b/src/schala_lang/parsing.rs @@ -448,10 +448,11 @@ impl Parser { fn int_literal(&mut self) -> ParseResult { use self::Expression::*; - let digits = self.digits()?; match self.next() { BinNumberSigil => { - unimplemented!() + let digits = self.digits()?; + let n = parse_binary(digits)?; + Ok(IntLiteral(n)) }, HexNumberSigil => { unimplemented!() @@ -493,6 +494,20 @@ impl Parser { } } +fn parse_binary(digits: String) -> ParseResult { + let mut result: u64 = 0; + let mut multiplier = 1; + for d in digits.chars().rev() { + match d { + '1' => result += multiplier, + '0' => (), + _ => return ParseError::new("Encountered a character not '1' or '0 while parsing a binary literal"), + } + multiplier *= 2; + } + Ok(result) +} + pub fn parse(input: Vec) -> Result { let mut parser = Parser::new(input); parser.program()