use crate::lexer::LexerError;
pub trait LexerCapability {
type Token;
fn next_token(&mut self) -> Option<Result<(usize, Self::Token, usize), LexerError>>;
fn peek_token(&mut self) -> Option<Result<(usize, Self::Token, usize), LexerError>>;
fn position(&self) -> std::ops::Range<usize>;
fn source(&self) -> &str;
}
pub trait TokenValidator {
type Token;
fn is_valid_token(&self, token: &Self::Token, position: usize) -> bool;
fn is_valid_sequence(&self, tokens: &[Self::Token]) -> bool;
fn validate_token(&self, token: &Self::Token) -> bool;
}
pub trait ErrorReporter {
fn report_error(&self, error: &LexerError, context: &str) -> String;
fn report_warning(&self, message: &str, position: usize) -> String;
}
pub trait TokenStream {
type Token;
fn token_iter(
&mut self,
) -> Box<dyn Iterator<Item = Result<(usize, Self::Token, usize), LexerError>> + '_>;
fn reset(&mut self);
fn token_count(&self) -> Option<usize>;
}
pub trait SourceLocation {
fn line_column(&self, pos: usize) -> (usize, usize);
fn source_line(&self, pos: usize) -> Option<&str>;
}