#[derive(Debug)] pub enum Token { LParan, RParan, Operator(Operator), Symbol(String), String(String), Int(i32), } #[derive(Debug)] pub enum Operator { Add, Subtract, Multiply, Divide, } pub fn tokenize(input: String) -> Vec { input .split(' ') .map(|i| match i { "+" => Token::Operator(Operator::Add), "-" => Token::Operator(Operator::Subtract), "*" => Token::Operator(Operator::Multiply), "/" => Token::Operator(Operator::Divide), "(" => Token::LParan, ")" => Token::RParan, s if s.starts_with('"') && s.ends_with('"') && s.len() >= 2 => { Token::String(s[1..s.len() - 1].to_string()) } // unwrap will never be reached because it only executes if parsing // has already worked once s if s.parse::().is_ok() => Token::Int(s.parse().unwrap()), s => Token::Symbol(s.to_string()), _ => panic!("uhh"), }) .collect() }