fn main() {
let source = "
var A as Integer
print A
A = 10
print A
A += 5
print A
A += -3
print A
";
let code_block = parse(source);
run(code_block);
}
fn parse(source: Str) -> CodeBlock {
let mut code_block = CodeBlock::new();
for line in source.lines() {
let tokens: Vec<_> = line.split_whitespace().collect();
match tokens.first() {
Some(&"var") => code_block.push(Code::Var(tokens[1], tokens[3])),
Some(&"print") => code_block.push(Code::Print(tokens[1])),
Some(v) => {
if tokens[1] == "=" {
code_block.push(Code::Copy(v, tokens[2]))
} else {
code_block.push(Code::AddInto(v, tokens[2]))
}
}
_ => {}
}
}
code_block
}
fn run(code_block: CodeBlock) {
let mut integer_vars = std::collections::HashMap::new();
for code in &code_block {
match code {
Code::Var(var_name, var_type) => {
if *var_type == "Integer" {
integer_vars.insert(var_name, 0i32);
}
}
Code::Copy(var_name, new_value) => {
if let Some(var_value) = integer_vars.get_mut(var_name) {
if let Ok(new_value) = new_value.parse::<i32>() {
*var_value = new_value;
}
}
}
Code::AddInto(var_name, add_value) => {
if let Some(var_value) = integer_vars.get_mut(var_name) {
if let Ok(add_value) = add_value.parse::<i32>() {
*var_value += add_value;
}
}
}
Code::Print(var_name) => {
if let Some(var_value) = integer_vars.get(var_name) {
println!("{}", *var_value);
}
}
}
}
}
type CodeBlock = Vec<Code>;
type Str = &'static str;
enum Code {
Var(Str, Str),
Copy(Str, Str),
AddInto(Str, Str),
Print(Str),
}
Zm4gbWFpbigpIHsKICAgIGxldCBzb3VyY2UgPSAiCiAgICB2YXIgQSBhcyBJbnRlZ2VyCiAgICBwcmludCBBCiAgICBBID0gMTAKICAgIHByaW50IEEKICAgIEEgKz0gNQogICAgcHJpbnQgQQogICAgQSArPSAtMwogICAgcHJpbnQgQQogICAgIjsKCiAgICBsZXQgY29kZV9ibG9jayA9IHBhcnNlKHNvdXJjZSk7CgogICAgcnVuKGNvZGVfYmxvY2spOwp9CgpmbiBwYXJzZShzb3VyY2U6IFN0cikgLT4gQ29kZUJsb2NrIHsKICAgIGxldCBtdXQgY29kZV9ibG9jayA9IENvZGVCbG9jazo6bmV3KCk7CgogICAgZm9yIGxpbmUgaW4gc291cmNlLmxpbmVzKCkgewogICAgICAgIGxldCB0b2tlbnM6IFZlYzxfPiA9IGxpbmUuc3BsaXRfd2hpdGVzcGFjZSgpLmNvbGxlY3QoKTsKICAgICAgICBtYXRjaCB0b2tlbnMuZmlyc3QoKSB7CiAgICAgICAgICAgIFNvbWUoJiJ2YXIiKSA9PiBjb2RlX2Jsb2NrLnB1c2goQ29kZTo6VmFyKHRva2Vuc1sxXSwgdG9rZW5zWzNdKSksCiAgICAgICAgICAgIFNvbWUoJiJwcmludCIpID0+IGNvZGVfYmxvY2sucHVzaChDb2RlOjpQcmludCh0b2tlbnNbMV0pKSwKICAgICAgICAgICAgU29tZSh2KSA9PiB7CiAgICAgICAgICAgICAgICBpZiB0b2tlbnNbMV0gPT0gIj0iIHsKICAgICAgICAgICAgICAgICAgICBjb2RlX2Jsb2NrLnB1c2goQ29kZTo6Q29weSh2LCB0b2tlbnNbMl0pKQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb2RlX2Jsb2NrLnB1c2goQ29kZTo6QWRkSW50byh2LCB0b2tlbnNbMl0pKQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIF8gPT4ge30KICAgICAgICB9CiAgICB9CiAgICBjb2RlX2Jsb2NrCn0KCmZuIHJ1bihjb2RlX2Jsb2NrOiBDb2RlQmxvY2spIHsKICAgIGxldCBtdXQgaW50ZWdlcl92YXJzID0gc3RkOjpjb2xsZWN0aW9uczo6SGFzaE1hcDo6bmV3KCk7CiAgICBmb3IgY29kZSBpbiAmY29kZV9ibG9jayB7CiAgICAgICAgbWF0Y2ggY29kZSB7CiAgICAgICAgICAgIENvZGU6OlZhcih2YXJfbmFtZSwgdmFyX3R5cGUpID0+IHsKICAgICAgICAgICAgICAgIGlmICp2YXJfdHlwZSA9PSAiSW50ZWdlciIgewogICAgICAgICAgICAgICAgICAgIGludGVnZXJfdmFycy5pbnNlcnQodmFyX25hbWUsIDBpMzIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIENvZGU6OkNvcHkodmFyX25hbWUsIG5ld192YWx1ZSkgPT4gewogICAgICAgICAgICAgICAgaWYgbGV0IFNvbWUodmFyX3ZhbHVlKSA9IGludGVnZXJfdmFycy5nZXRfbXV0KHZhcl9uYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgbGV0IE9rKG5ld192YWx1ZSkgPSBuZXdfdmFsdWUucGFyc2U6OjxpMzI+KCkgewogICAgICAgICAgICAgICAgICAgICAgICAqdmFyX3ZhbHVlID0gbmV3X3ZhbHVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBDb2RlOjpBZGRJbnRvKHZhcl9uYW1lLCBhZGRfdmFsdWUpID0+IHsKICAgICAgICAgICAgICAgIGlmIGxldCBTb21lKHZhcl92YWx1ZSkgPSBpbnRlZ2VyX3ZhcnMuZ2V0X211dCh2YXJfbmFtZSkgewogICAgICAgICAgICAgICAgICAgIGlmIGxldCBPayhhZGRfdmFsdWUpID0gYWRkX3ZhbHVlLnBhcnNlOjo8aTMyPigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgKnZhcl92YWx1ZSArPSBhZGRfdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIENvZGU6OlByaW50KHZhcl9uYW1lKSA9PiB7CiAgICAgICAgICAgICAgICBpZiBsZXQgU29tZSh2YXJfdmFsdWUpID0gaW50ZWdlcl92YXJzLmdldCh2YXJfbmFtZSkgewogICAgICAgICAgICAgICAgICAgIHByaW50bG4hKCJ7fSIsICp2YXJfdmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9Cgp0eXBlIENvZGVCbG9jayA9IFZlYzxDb2RlPjsKCnR5cGUgU3RyID0gJidzdGF0aWMgc3RyOwoKZW51bSBDb2RlIHsKICAgIFZhcihTdHIsIFN0ciksCiAgICBDb3B5KFN0ciwgU3RyKSwKICAgIEFkZEludG8oU3RyLCBTdHIpLAogICAgUHJpbnQoU3RyKSwKfQo=