From 237dca4b4b7716bb0db9586e188c6340433c7f6e Mon Sep 17 00:00:00 2001 From: Eryn Wells Date: Sat, 13 May 2017 15:37:01 -0700 Subject: [PATCH] Add some character class methods to a Lexable trait for char --- lexer/src/chars.rs | 13 +++++++++++++ lexer/src/lib.rs | 9 ++++++--- 2 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 lexer/src/chars.rs diff --git a/lexer/src/chars.rs b/lexer/src/chars.rs new file mode 100644 index 0000000..0314e68 --- /dev/null +++ b/lexer/src/chars.rs @@ -0,0 +1,13 @@ +/* lexer/src/chars.rs + * Eryn Wells + */ + +pub trait Lexable { + fn is_left_paren(&self) -> bool; + fn is_right_paren(&self) -> bool; +} + +impl Lexable for char { + fn is_left_paren(&self) -> bool { *self == '(' } + fn is_right_paren(&self) -> bool { *self == ')' } +} diff --git a/lexer/src/lib.rs b/lexer/src/lib.rs index e01c242..7b7c531 100644 --- a/lexer/src/lib.rs +++ b/lexer/src/lib.rs @@ -4,10 +4,13 @@ use std::iter::Peekable; +mod chars; mod error; pub use error::Error; +use chars::Lexable; + #[derive(Debug, Eq, PartialEq)] pub enum Token { LeftParen, RightParen, Id(String), } @@ -49,8 +52,8 @@ impl Iterator for Lexer where T: Iterator { let peek = self.input.peek().map(char::clone); let result = if buffer.is_empty() { match peek { - Some('(') => self.emit(Token::LeftParen, Resume::AtNext), - Some(')') => self.emit(Token::RightParen, Resume::AtNext), + Some(c) if c.is_left_paren() => self.emit(Token::LeftParen, Resume::AtNext), + Some(c) if c.is_right_paren() => self.emit(Token::RightParen, Resume::AtNext), Some(c) if c.is_whitespace() => IterationResult::Continue, Some(c) if c.is_alphabetic() => { buffer.push(c); @@ -67,7 +70,7 @@ impl Iterator for Lexer where T: Iterator { buffer.push(c); IterationResult::Continue } - Some(c) if c == '(' || c == ')' || c.is_whitespace() => + Some(c) if c.is_left_paren() || c.is_right_paren() || c.is_whitespace() => self.emit(Token::Id(buffer.clone()), Resume::Here), Some(c) => self.fail(format!("Invalid character: {}", c)), // Found EOF. Emit what we have and finish.