Make variable notation explicit

This commit is contained in:
~karx 2021-02-07 17:18:15 +00:00
parent 088741aba4
commit 026466efac
1 changed files with 28 additions and 9 deletions

View File

@ -28,19 +28,38 @@ impl Program {
return Program{ data: op_list, pc: 0, vars: HashMap::new() };
}
fn args_or_vars<'a>(&self, arguments: &'a str) -> String {
let mut deconstructed: Vec<char> = arguments.chars().collect();
fn args_or_vars(&self, arguments: &str) -> String {
let mut builder = String::from("");
let argument_vec: Vec<char> = arguments.chars().collect();
for (index, char) in arguments.chars().enumerate() {
let value = self.vars.get(&char);
for index in 0..argument_vec.len() {
let current_char = argument_vec[index];
let str_to_push: String;
match value {
Some(content) => deconstructed[index] = *content,
None => {}
if index > 0 {
if argument_vec[index-1] == '$' {
continue;
}
}
if current_char == '$' {
let variable = argument_vec[index+1];
let key = self.vars.get(&variable);
match key {
Some(value) => str_to_push = value.to_string(),
None => panic!("NotFoundError: Variable {} has not been defined", variable)
}
} else {
str_to_push = current_char.to_string();
}
builder.push_str(&str_to_push);
}
deconstructed.into_iter().collect()
builder
}
fn add_var(&mut self, arguments: &str) {
@ -60,7 +79,7 @@ impl Program {
'm' => println!("{}", eval::do_math(self.args_or_vars(arguments), '*')),
'd' => println!("{}", eval::do_math(self.args_or_vars(arguments), '/')),
'l' => self.add_var(arguments),
_ => panic!("SyntaxError at opcode {}!", self.pc)
_ => panic!("SyntaxError: No such opcode: {}", self.pc)
}
}