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 {
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]

View file

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

View file

@ -2,12 +2,12 @@
* Eryn Wells <eryn@erynwells.me>
*/
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),

View file

@ -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;
}