diff --git a/src/lexer/mod.rs b/src/lexer/mod.rs index dcb7784..760911b 100644 --- a/src/lexer/mod.rs +++ b/src/lexer/mod.rs @@ -13,6 +13,7 @@ mod str; mod named_char { use std::collections::HashSet; + use types::Character; const ALARM: &'static str = "alarm"; const BACKSPACE: &'static str = "backspace"; @@ -38,8 +39,8 @@ mod named_char { set } - pub fn char_named_by(named: &str) -> char { - match named { + pub fn char_named_by(named: &str) -> Character { + Character::new(match named { ALARM => '\x07', BACKSPACE => '\x08', DELETE => '\x7F', @@ -50,12 +51,13 @@ mod named_char { SPACE => ' ', TAB => '\t', _ => panic!("char_named_by called with invalid named char string") - } + }) } } use std::collections::HashSet; +use types::{Boolean, Character, Number}; use self::char::Lexable; use self::number::Exactness; use self::number::NumberBuilder; @@ -263,7 +265,7 @@ impl Lexer { if candidates.len() > 0 { self.state = State::NamedChar(candidates, lower_c); } else { - return self.token_result(Token::Character(c)); + return self.token_result(Token::Character(Character::new(c))); } Ok(None) } @@ -278,7 +280,7 @@ impl Lexer { if c.is_identifier_delimiter() || c.is_eof() { if progress.len() == 1 { self.retract(); - return self.token_result(Token::Character(progress.chars().next().unwrap())); + return self.token_result(Token::Character(Character::new(progress.chars().next().unwrap()))); } else { return self.generic_error(c); @@ -335,7 +337,7 @@ impl Lexer { fn state_hash(&mut self, c: char) -> StateResult { if c.is_boolean_true() || c.is_boolean_false() { self.advance(); - return self.token_result(Token::Boolean(c.is_boolean_true())); + return self.token_result(Token::Boolean(Boolean::new(c.is_boolean_true()))); } else if c.is_left_paren() { self.advance(); @@ -586,7 +588,7 @@ impl HasResult for StateResult { #[cfg(test)] mod tests { - use types::Number; + use types::{Boolean, Character, Number}; use std::iter::Iterator; use super::*; @@ -599,16 +601,16 @@ mod tests { #[test] fn finds_characters() { - check_single_token("#\\a", Token::Character('a')); - check_single_token("#\\n", Token::Character('n')); - check_single_token("#\\s", Token::Character('s')); + check_single_token("#\\a", Token::Character(Character::new('a'))); + check_single_token("#\\n", Token::Character(Character::new('n'))); + check_single_token("#\\s", Token::Character(Character::new('s'))); } #[test] fn finds_named_characters() { - check_single_token("#\\newline", Token::Character('\n')); - check_single_token("#\\null", Token::Character('\0')); - check_single_token("#\\space", Token::Character(' ')); + check_single_token("#\\newline", Token::Character(Character::new('\n'))); + check_single_token("#\\null", Token::Character(Character::new('\0'))); + check_single_token("#\\space", Token::Character(Character::new(' '))); } #[test] @@ -632,8 +634,8 @@ mod tests { #[test] fn finds_booleans() { - check_single_token("#t", Token::Boolean(true)); - check_single_token("#f", Token::Boolean(false)); + check_single_token("#t", Token::Boolean(Boolean::new(true))); + check_single_token("#f", Token::Boolean(Boolean::new(false))); } #[test] diff --git a/src/lexer/number.rs b/src/lexer/number.rs index 2c31722..5c2c8ec 100644 --- a/src/lexer/number.rs +++ b/src/lexer/number.rs @@ -2,7 +2,7 @@ * Eryn Wells */ -use types::number::Number; +use types::Number; #[derive(Debug)] pub enum Radix { Bin, Oct, Dec, Hex } diff --git a/src/lexer/token.rs b/src/lexer/token.rs index 413167c..818b0ba 100644 --- a/src/lexer/token.rs +++ b/src/lexer/token.rs @@ -2,12 +2,12 @@ * Eryn Wells */ -use types::number::Number; +use types::*; #[derive(Debug, PartialEq)] pub enum Token { - Boolean(bool), - Character(char), + Boolean(Boolean), + Character(Character), Comment(String), Dot, Identifier(String), diff --git a/src/types/mod.rs b/src/types/mod.rs index 188cc3f..8ff2160 100644 --- a/src/types/mod.rs +++ b/src/types/mod.rs @@ -12,9 +12,17 @@ pub mod number; #[derive(Clone, Copy, Debug, PartialEq)] pub struct Boolean(bool); +impl Boolean { + pub fn new(v: bool) -> Boolean { Boolean(v) } +} + #[derive(Clone, Copy, Debug, PartialEq)] pub struct Character(char); +impl Character { + pub fn new(v: char) -> Character { Character(v) } +} + pub trait Value: Debug + ValueEq { fn as_value(&self) -> &Value; }