really bad lisp made specifically for my needs
at main 1.1 kB view raw
1#[derive(Debug)] 2pub enum Token { 3 LParan, 4 RParan, 5 Operator(Operator), 6 Symbol(String), 7 String(String), 8 Int(i32), 9} 10 11#[derive(Debug)] 12pub enum Operator { 13 Add, 14 Subtract, 15 Multiply, 16 Divide, 17} 18 19pub fn tokenize(input: String) -> Vec<Token> { 20 input 21 .split(' ') 22 .map(|i| match i { 23 "+" => Token::Operator(Operator::Add), 24 "-" => Token::Operator(Operator::Subtract), 25 "*" => Token::Operator(Operator::Multiply), 26 "/" => Token::Operator(Operator::Divide), 27 "(" => Token::LParan, 28 ")" => Token::RParan, 29 30 s if s.starts_with('"') && s.ends_with('"') && s.len() >= 2 => { 31 Token::String(s[1..s.len() - 1].to_string()) 32 } 33 34 // unwrap will never be reached because it only executes if parsing 35 // has already worked once 36 s if s.parse::<i32>().is_ok() => Token::Int(s.parse().unwrap()), 37 38 s => Token::Symbol(s.to_string()), 39 40 _ => panic!("uhh"), 41 }) 42 .collect() 43}