1use crate::lexer::LexerError;
4
5pub trait LexerCapability {
7 type Token;
9
10 fn next_token(&mut self) -> Option<Result<(usize, Self::Token, usize), LexerError>>;
12
13 fn peek_token(&mut self) -> Option<Result<(usize, Self::Token, usize), LexerError>>;
15
16 fn position(&self) -> std::ops::Range<usize>;
18
19 fn source(&self) -> &str;
21}
22
23pub trait TokenValidator {
25 type Token;
26
27 fn is_valid_token(&self, token: &Self::Token, position: usize) -> bool;
29
30 fn is_valid_sequence(&self, tokens: &[Self::Token]) -> bool;
32
33 fn validate_token(&self, token: &Self::Token) -> bool;
35}
36
37pub trait ErrorReporter {
39 fn report_error(&self, error: &LexerError, context: &str) -> String;
41
42 fn report_warning(&self, message: &str, position: usize) -> String;
44}
45
46pub trait TokenStream {
48 type Token;
49
50 fn token_iter(
52 &mut self,
53 ) -> Box<dyn Iterator<Item = Result<(usize, Self::Token, usize), LexerError>> + '_>;
54
55 fn reset(&mut self);
57
58 fn token_count(&self) -> Option<usize>;
60}
61
62pub trait SourceLocation {
64 fn line_column(&self, pos: usize) -> (usize, usize);
66
67 fn source_line(&self, pos: usize) -> Option<&str>;
69}