Boolean and Character are a little more filled out, and used by the Lexer

This commit is contained in:
Eryn Wells 2017-01-16 10:29:44 -08:00
parent 42d191d036
commit d6a9fc26cd
4 changed files with 29 additions and 19 deletions

View file

@ -13,6 +13,7 @@ mod str;
mod named_char { mod named_char {
use std::collections::HashSet; use std::collections::HashSet;
use types::Character;
const ALARM: &'static str = "alarm"; const ALARM: &'static str = "alarm";
const BACKSPACE: &'static str = "backspace"; const BACKSPACE: &'static str = "backspace";
@ -38,8 +39,8 @@ mod named_char {
set set
} }
pub fn char_named_by(named: &str) -> char { pub fn char_named_by(named: &str) -> Character {
match named { Character::new(match named {
ALARM => '\x07', ALARM => '\x07',
BACKSPACE => '\x08', BACKSPACE => '\x08',
DELETE => '\x7F', DELETE => '\x7F',
@ -50,12 +51,13 @@ mod named_char {
SPACE => ' ', SPACE => ' ',
TAB => '\t', TAB => '\t',
_ => panic!("char_named_by called with invalid named char string") _ => panic!("char_named_by called with invalid named char string")
} })
} }
} }
use std::collections::HashSet; use std::collections::HashSet;
use types::{Boolean, Character, Number};
use self::char::Lexable; use self::char::Lexable;
use self::number::Exactness; use self::number::Exactness;
use self::number::NumberBuilder; use self::number::NumberBuilder;
@ -263,7 +265,7 @@ impl Lexer {
if candidates.len() > 0 { if candidates.len() > 0 {
self.state = State::NamedChar(candidates, lower_c); self.state = State::NamedChar(candidates, lower_c);
} else { } else {
return self.token_result(Token::Character(c)); return self.token_result(Token::Character(Character::new(c)));
} }
Ok(None) Ok(None)
} }
@ -278,7 +280,7 @@ impl Lexer {
if c.is_identifier_delimiter() || c.is_eof() { if c.is_identifier_delimiter() || c.is_eof() {
if progress.len() == 1 { if progress.len() == 1 {
self.retract(); 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 { else {
return self.generic_error(c); return self.generic_error(c);
@ -335,7 +337,7 @@ impl Lexer {
fn state_hash(&mut self, c: char) -> StateResult { fn state_hash(&mut self, c: char) -> StateResult {
if c.is_boolean_true() || c.is_boolean_false() { if c.is_boolean_true() || c.is_boolean_false() {
self.advance(); 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() { else if c.is_left_paren() {
self.advance(); self.advance();
@ -586,7 +588,7 @@ impl HasResult for StateResult {
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use types::Number; use types::{Boolean, Character, Number};
use std::iter::Iterator; use std::iter::Iterator;
use super::*; use super::*;
@ -599,16 +601,16 @@ mod tests {
#[test] #[test]
fn finds_characters() { fn finds_characters() {
check_single_token("#\\a", Token::Character('a')); check_single_token("#\\a", Token::Character(Character::new('a')));
check_single_token("#\\n", Token::Character('n')); check_single_token("#\\n", Token::Character(Character::new('n')));
check_single_token("#\\s", Token::Character('s')); check_single_token("#\\s", Token::Character(Character::new('s')));
} }
#[test] #[test]
fn finds_named_characters() { fn finds_named_characters() {
check_single_token("#\\newline", Token::Character('\n')); check_single_token("#\\newline", Token::Character(Character::new('\n')));
check_single_token("#\\null", Token::Character('\0')); check_single_token("#\\null", Token::Character(Character::new('\0')));
check_single_token("#\\space", Token::Character(' ')); check_single_token("#\\space", Token::Character(Character::new(' ')));
} }
#[test] #[test]
@ -632,8 +634,8 @@ mod tests {
#[test] #[test]
fn finds_booleans() { fn finds_booleans() {
check_single_token("#t", Token::Boolean(true)); check_single_token("#t", Token::Boolean(Boolean::new(true)));
check_single_token("#f", Token::Boolean(false)); check_single_token("#f", Token::Boolean(Boolean::new(false)));
} }
#[test] #[test]

View file

@ -2,7 +2,7 @@
* Eryn Wells <eryn@erynwells.me> * Eryn Wells <eryn@erynwells.me>
*/ */
use types::number::Number; use types::Number;
#[derive(Debug)] #[derive(Debug)]
pub enum Radix { Bin, Oct, Dec, Hex } pub enum Radix { Bin, Oct, Dec, Hex }

View file

@ -2,12 +2,12 @@
* Eryn Wells <eryn@erynwells.me> * Eryn Wells <eryn@erynwells.me>
*/ */
use types::number::Number; use types::*;
#[derive(Debug, PartialEq)] #[derive(Debug, PartialEq)]
pub enum Token { pub enum Token {
Boolean(bool), Boolean(Boolean),
Character(char), Character(Character),
Comment(String), Comment(String),
Dot, Dot,
Identifier(String), Identifier(String),

View file

@ -12,9 +12,17 @@ pub mod number;
#[derive(Clone, Copy, Debug, PartialEq)] #[derive(Clone, Copy, Debug, PartialEq)]
pub struct Boolean(bool); pub struct Boolean(bool);
impl Boolean {
pub fn new(v: bool) -> Boolean { Boolean(v) }
}
#[derive(Clone, Copy, Debug, PartialEq)] #[derive(Clone, Copy, Debug, PartialEq)]
pub struct Character(char); pub struct Character(char);
impl Character {
pub fn new(v: char) -> Character { Character(v) }
}
pub trait Value: Debug + ValueEq { pub trait Value: Debug + ValueEq {
fn as_value(&self) -> &Value; fn as_value(&self) -> &Value;
} }