From bd6bf2f4bb44eedb3868e113706721d92ddab22f Mon Sep 17 00:00:00 2001 From: greg Date: Mon, 11 Sep 2017 23:27:15 -0700 Subject: [PATCH] Parse binary literal --- src/schala_lang/parsing.rs | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) 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()