ループで実行する処理文を記憶するために、”{ }”で囲まれている中身を取得してベクターで保存しておく。
fn main() { let mut stack = vec![]; let mut instructions = vec![]; let str = "1 2 + { 10 20 + }".to_string(); let mut words: Vec<_> = str.split(" ").collect(); while let Some((&word, mut rest)) = words.split_first() { if word.is_empty() { break; } if word == "{" { (instructions, rest) = parse_instruction(rest); } else if let Ok(parsed) = word.parse::<i32>() { stack.push(parsed.to_string()); } else { match word { "+" => add(&mut stack), _ => panic!("{word:?} could not be parsed"), } } words = rest.to_vec(); } println!("{:?}", stack); println!("{:?}", instructions); } fn parse_instruction<'src, 'a>(input: &'a [&'src str])-> (Vec<String>, &'a [&'src str]) { let mut tokens: Vec<String> = vec![]; let mut words = input; while let Some((&word, mut rest)) = words.split_first() { if word.is_empty() { break; } if word == "}" { return (tokens, rest); } else { tokens.push(word.to_string()) } words = rest; } (tokens, words) } fn add(stack: &mut Vec<String>) { let rhs: i32 = stack.pop().unwrap().parse::<i32>().unwrap(); let lhs: i32 = stack.pop().unwrap().parse::<i32>().unwrap(); stack.push((lhs + rhs).to_string()); }
Running `target/debug/sample`
[“3”]
[“10”, “20”, “+”]