use std::iter::Peekable;
use std::str::Chars;
mod tokens;
pub use tokens::Token;
mod scan;
#[derive(Debug, Clone)]
pub struct TokenInfo {
pub token: Token,
pub line: usize,
pub column: usize,
}
pub struct Lexer<'a> {
input: Peekable<Chars<'a>>,
line: usize,
column: usize,
}
impl<'a> Lexer<'a> {
pub fn new(input: &'a str) -> Self {
Lexer {
input: input.chars().peekable(),
line: 1,
column: 1,
}
}
fn advance(&mut self) -> Option<char> {
let ch = self.input.next();
if let Some(c) = ch {
if c == '\n' {
self.line += 1;
self.column = 1;
} else {
self.column += 1;
}
}
ch
}
fn peek(&mut self) -> Option<&char> {
self.input.peek()
}
}
#[cfg(test)]
mod tests;