// Test lexer with context-dependent rules
%%
[a-zA-Z_][a-zA-Z0-9_]* -> Id
[0-9]+ -> Number
\+ -> Plus
\- -> Minus
[ \t]+ -> Whitespace
\n -> Newline
%Id [0-9]+ -> IdNumber
%Plus [0-9]+ -> PositiveNumber
%%
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_context_dependent_lexer() {
let input = "var 123 +456 -789";
let mut lexer = Lexer::from_str(input);
// First token: IDENTIFIER
let token = lexer.next_token().unwrap();
println!("Token 1: kind={:?}, value='{}'", token.kind, token.text);
assert_eq!(token.kind, TokenKind::Id);
assert_eq!(token.text, "var");
// Second token: WHITESPACE
let token = lexer.next_token().unwrap();
println!("Token 2: kind={:?}, value='{}'", token.kind, token.text);
assert_eq!(token.kind, TokenKind::Whitespace);
// Third token: NUMBER or IdNumber (depending on context implementation)
let token = lexer.next_token().unwrap();
println!("Token 3: kind={:?}, value='{}'", token.kind, token.text);
// Context rules may or may not be implemented yet
assert!(token.kind == TokenKind::Number || token.kind == TokenKind::IdNumber);
assert_eq!(token.text, "123");
// Fourth token: WHITESPACE
let token = lexer.next_token().unwrap();
println!("Token 4: kind={:?}, value='{}'", token.kind, token.text);
assert_eq!(token.kind, TokenKind::Whitespace);
// Fifth token: PLUS
let token = lexer.next_token().unwrap();
println!("Token 5: kind={:?}, value='{}'", token.kind, token.text);
assert_eq!(token.kind, TokenKind::Plus);
assert_eq!(token.text, "+");
// Sixth token: NUMBER or PositiveNumber (depending on context implementation)
let token = lexer.next_token().unwrap();
println!("Token 6: kind={:?}, value='{}'", token.kind, token.text);
// Context rules may or may not be implemented yet
assert!(token.kind == TokenKind::Number || token.kind == TokenKind::PositiveNumber);
assert_eq!(token.text, "456");
}
}