use crate::{Token};
use crate::util::{ResetChars};
use crate::scanner::Scanner;
pub struct Lexer<'a,S:Scanner> {
iter: ResetChars<'a>,
rules: S
}
impl<'a,S:Scanner> Lexer<'a,S> {
pub fn new(input: &'a str, rules: S) -> Self {
let iter = ResetChars::new(input.chars());
Self{iter,rules}
}
}
impl<'a,S:Scanner<Item=char>> Iterator for Lexer<'a,S>
{
type Item = Token<S::Token>;
fn next(&mut self) -> Option<Self::Item> {
let start = self.iter.byte_offset();
match self.rules.scan(&mut self.iter) {
Some(t) => {
let end = self.iter.byte_offset();
self.iter.reset();
Some(Token::new(t,start..end))
}
None => None
}
}
}