Add an error class
This commit is contained in:
		
							parent
							
								
									b5f76deb98
								
							
						
					
					
						commit
						1dfdc001b3
					
				
					 2 changed files with 24 additions and 4 deletions
				
			
		
							
								
								
									
										16
									
								
								lexer/src/error.rs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								lexer/src/error.rs
									
										
									
									
									
										Normal 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
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -4,6 +4,10 @@
 | 
			
		|||
 | 
			
		||||
use std::iter::Peekable;
 | 
			
		||||
 | 
			
		||||
mod error;
 | 
			
		||||
 | 
			
		||||
pub use error::Error;
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Eq, PartialEq)]
 | 
			
		||||
pub enum Token { LeftParen, RightParen, Id(String), }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -15,7 +19,7 @@ enum IterationResult {
 | 
			
		|||
    Finish,
 | 
			
		||||
    Continue,
 | 
			
		||||
    Emit(Token, Resume),
 | 
			
		||||
    Error(String),
 | 
			
		||||
    Error(Error),
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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 {
 | 
			
		||||
        IterationResult::Error(msg)
 | 
			
		||||
        IterationResult::Error(Error::new(msg))
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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> {
 | 
			
		||||
        let mut buffer = String::new();
 | 
			
		||||
| 
						 | 
				
			
			@ -81,7 +85,7 @@ impl<T> Iterator for Lexer<T> where T: Iterator<Item=char> {
 | 
			
		|||
                    }
 | 
			
		||||
                    return Some(Ok(token))
 | 
			
		||||
                },
 | 
			
		||||
                IterationResult::Error(msg) => return Some(Err(msg)),
 | 
			
		||||
                IterationResult::Error(err) => return Some(Err(err)),
 | 
			
		||||
            };
 | 
			
		||||
        }
 | 
			
		||||
        None
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue