Add an error class

This commit is contained in:
Eryn Wells 2017-05-13 15:26:41 -07:00
parent b5f76deb98
commit 1dfdc001b3
2 changed files with 24 additions and 4 deletions

16
lexer/src/error.rs Normal file
View file

@ -0,0 +1,16 @@
/* lexer/src/error.rs
* Eryn Wells <eryn@erynwells.me>
*/
#[derive(Debug, Eq, PartialEq)]
pub struct Error {
message: String
}
impl Error {
pub fn new(msg: String) -> Error {
Error {
message: msg
}
}
}

View file

@ -4,6 +4,10 @@
use std::iter::Peekable; use std::iter::Peekable;
mod error;
pub use error::Error;
#[derive(Debug, Eq, PartialEq)] #[derive(Debug, Eq, PartialEq)]
pub enum Token { LeftParen, RightParen, Id(String), } pub enum Token { LeftParen, RightParen, Id(String), }
@ -15,7 +19,7 @@ enum IterationResult {
Finish, Finish,
Continue, Continue,
Emit(Token, Resume), Emit(Token, Resume),
Error(String), Error(Error),
} }
pub struct Lexer<T> where T: Iterator<Item=char> { pub struct Lexer<T> where T: Iterator<Item=char> {
@ -32,12 +36,12 @@ impl<T> Lexer<T> where T: Iterator<Item=char> {
} }
fn fail(&self, msg: String) -> IterationResult { fn fail(&self, msg: String) -> IterationResult {
IterationResult::Error(msg) IterationResult::Error(Error::new(msg))
} }
} }
impl<T> Iterator for Lexer<T> where T: Iterator<Item=char> { impl<T> Iterator for Lexer<T> where T: Iterator<Item=char> {
type Item = Result<Token, String>; type Item = Result<Token, Error>;
fn next(&mut self) -> Option<Self::Item> { fn next(&mut self) -> Option<Self::Item> {
let mut buffer = String::new(); let mut buffer = String::new();
@ -81,7 +85,7 @@ impl<T> Iterator for Lexer<T> where T: Iterator<Item=char> {
} }
return Some(Ok(token)) return Some(Ok(token))
}, },
IterationResult::Error(msg) => return Some(Err(msg)), IterationResult::Error(err) => return Some(Err(err)),
}; };
} }
None None