1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
use std::fmt; #[derive(Debug, PartialEq)] pub enum Token { Division, Addition, Multiply, Subtraction, WhiteSpace, DigitLiteral(f64), OpeningBracket, ClosingBracket, } impl fmt::Display for Token { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { Token::Division => write!(f, "/"), Token::Addition => write!(f, "+"), Token::Multiply => write!(f, "*"), Token::Subtraction => write!(f, "-"), Token::WhiteSpace => write!(f, "Whitespace"), Token::DigitLiteral(literal) => write!(f, "Literal {}", literal), Token::OpeningBracket => write!(f, "("), Token::ClosingBracket => write!(f, ")"), } } } pub type Lexeme = String; #[derive(Debug)] pub struct TokenWithContext { pub token: Token, pub lexeme: Lexeme, pub position: Position, } #[derive(Copy, Clone, Debug)] pub struct Position { pub column: usize, } impl Position { pub fn initial() -> Position { Position { column: 1 } } pub fn increment_column(&mut self) { self.column += 1; } } pub fn is_digit(c: char) -> bool { ('0'..='9').contains(&c) || c == '.' } pub fn is_whitespace(c: char) -> bool { matches!(c, ' ' | '\r' | '\t') }