Boolean and Character are a little more filled out, and used by the Lexer
This commit is contained in:
parent
42d191d036
commit
d6a9fc26cd
4 changed files with 29 additions and 19 deletions
|
@ -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]
|
||||||
|
|
|
@ -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 }
|
||||||
|
|
|
@ -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),
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue