really bad lisp made specifically for my needs
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}