Skip to main content

pascal/traits/
lexer.rs

1//! Lexer trait definitions
2
3use crate::lexer::LexerError;
4
5/// Core lexer capability trait
6pub trait LexerCapability {
7    /// Token type produced by this lexer
8    type Token;
9
10    /// Get the next token from the input
11    fn next_token(&mut self) -> Option<Result<(usize, Self::Token, usize), LexerError>>;
12
13    /// Peek at the next token without consuming it
14    fn peek_token(&mut self) -> Option<Result<(usize, Self::Token, usize), LexerError>>;
15
16    /// Get the current position in the input
17    fn position(&self) -> std::ops::Range<usize>;
18
19    /// Get source code reference
20    fn source(&self) -> &str;
21}
22
23/// Token validation trait
24pub trait TokenValidator {
25    type Token;
26
27    /// Validate a single token
28    fn is_valid_token(&self, token: &Self::Token, position: usize) -> bool;
29
30    /// Validate a sequence of tokens
31    fn is_valid_sequence(&self, tokens: &[Self::Token]) -> bool;
32
33    /// Validate token with context
34    fn validate_token(&self, token: &Self::Token) -> bool;
35}
36
37/// Error reporting trait for lexers
38pub trait ErrorReporter {
39    /// Report a lexing error
40    fn report_error(&self, error: &LexerError, context: &str) -> String;
41
42    /// Report a warning
43    fn report_warning(&self, message: &str, position: usize) -> String;
44}
45
46/// Token stream iteration trait
47pub trait TokenStream {
48    type Token;
49
50    /// Get iterator over tokens
51    fn token_iter(
52        &mut self,
53    ) -> Box<dyn Iterator<Item = Result<(usize, Self::Token, usize), LexerError>> + '_>;
54
55    /// Reset the stream to beginning
56    fn reset(&mut self);
57
58    /// Get total token count (if available)
59    fn token_count(&self) -> Option<usize>;
60}
61
62/// Source location tracking
63pub trait SourceLocation {
64    /// Get line and column for a position
65    fn line_column(&self, pos: usize) -> (usize, usize);
66
67    /// Get source line for a position
68    fn source_line(&self, pos: usize) -> Option<&str>;
69}