From 853312ce67703fb38c10c176ae4de42d75994930 Mon Sep 17 00:00:00 2001 From: Eryn Wells Date: Mon, 3 Sep 2018 17:17:49 -0700 Subject: [PATCH] [lexer] We can lex integers! --- lexer/src/states/begin.rs | 22 +++++++++++++++------- lexer/src/states/hash.rs | 2 +- lexer/src/states/number/digit.rs | 4 +--- lexer/src/states/number/mod.rs | 10 +++++++--- 4 files changed, 24 insertions(+), 14 deletions(-) diff --git a/lexer/src/states/begin.rs b/lexer/src/states/begin.rs index 670b0dc..d8770ee 100644 --- a/lexer/src/states/begin.rs +++ b/lexer/src/states/begin.rs @@ -8,20 +8,28 @@ use token::Token; use states::{Resume, State, StateResult}; use states::id::IdSub; use states::hash::Hash; +use states::number::{Builder, Digit}; #[derive(Debug)] pub struct Begin; impl State for Begin { fn lex(&mut self, c: char) -> StateResult { - match c { - c if c.is_left_paren() => StateResult::Emit(Token::LeftParen, Resume::AtNext), - c if c.is_right_paren() => StateResult::Emit(Token::RightParen, Resume::AtNext), + if c.is_left_paren() { + StateResult::Emit(Token::LeftParen, Resume::AtNext) + } else if c.is_right_paren() { + StateResult::Emit(Token::RightParen, Resume::AtNext) + } else if c.is_whitespace() { // TODO: Figure out some way to track newlines. - c if c.is_whitespace() => StateResult::Continue, - c if c.is_identifier_initial() => StateResult::Advance { to: Box::new(IdSub{}) }, - c if c.is_hash() => StateResult::Advance { to: Box::new(Hash::new()) }, - _ => StateResult::fail(Error::invalid_char(c)), + StateResult::Continue + } else if c.is_identifier_initial() { + StateResult::advance(Box::new(IdSub{})) + } else if c.is_hash() { + StateResult::advance(Box::new(Hash::new())) + } else if let Some(st) = Digit::with_char(Builder::new(), c) { + StateResult::advance(Box::new(st)) + } else { + StateResult::fail(Error::invalid_char(c)) } } diff --git a/lexer/src/states/hash.rs b/lexer/src/states/hash.rs index ffccbb5..80f7103 100644 --- a/lexer/src/states/hash.rs +++ b/lexer/src/states/hash.rs @@ -39,7 +39,7 @@ impl State for Hash { } fn none(&mut self) -> Result, Error> { - Ok(None) + Err(Error::unexpected_eof()) } } diff --git a/lexer/src/states/number/digit.rs b/lexer/src/states/number/digit.rs index d571cbb..fb5ccef 100644 --- a/lexer/src/states/number/digit.rs +++ b/lexer/src/states/number/digit.rs @@ -2,11 +2,9 @@ * Eryn Wells */ -use chars::Lexable; use error::Error; use states::{State, StateResult}; use states::number::{Builder, Radix, Exact}; -use states::number::sign::Sign; use token::Token; #[derive(Debug)] pub struct Digit(Builder); @@ -39,6 +37,6 @@ impl State for Digit { } fn none(&mut self) -> Result, Error> { - Err(Error::unexpected_eof()) + Ok(Some(Token::Num(self.0.resolve()))) } } diff --git a/lexer/src/states/number/mod.rs b/lexer/src/states/number/mod.rs index daeecde..c0612a7 100644 --- a/lexer/src/states/number/mod.rs +++ b/lexer/src/states/number/mod.rs @@ -9,6 +9,7 @@ mod prefix; mod sign; pub use self::prefix::Prefix; +pub use self::digit::Digit; #[derive(Copy, Clone, Debug, Eq, PartialEq)] pub enum Radix { Bin = 2, Oct = 8, Dec = 10, Hex = 16 } @@ -83,9 +84,12 @@ impl Builder { } fn resolve(&self) -> i64 { - //let sign_factor: i64 = if let Some(sign) = self.sign { sign as i64 } else { 1 }; - //self.value * sign_factor - 0 + let sign_factor: i64 = if let Some(sign) = self.sign { + sign as i64 + } else { + 1 + }; + self.value * sign_factor } fn seen_exact(&self) -> bool { self.exact.is_some() }