ループで実行する処理文を記憶するために、”{ }”で囲まれている中身を取得してベクターで保存しておく。
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”, “+”]