use crate::token::Token;
use crate::tokenizer::Tokenizer;
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum LexerErrorType {
MalformedNumber,
UnfinishedString,
UnexpectedSymbol,
}
pub type LexerError<'a> = (LexerErrorType, &'a str);
pub struct Lexer<T: Tokenizer> {
tokenizer: T,
}
impl<T: Tokenizer> From<T> for Lexer<T> {
fn from(tokenizer: T) -> Lexer<T> {
Lexer {
tokenizer,
}
}
}
impl<T: Tokenizer> Lexer<T> {
pub fn new() -> Lexer<T> {
Lexer {
tokenizer: T::new(),
}
}
pub fn parse<'a>(&self, input: &'a str) -> Result<Vec<Token<'a>>, LexerError<'a>> {
self.tokenizer.parse(input)
}
}