Implement functions

This commit is contained in:
~karx 2021-02-08 15:30:20 +00:00
parent 1a811c650f
commit 0355142103
1 changed files with 46 additions and 1 deletions

View File

@ -90,13 +90,58 @@ impl Program {
println!("{:?}", self.funcs);
}
fn parse_funcs(&mut self, instruction: &String) -> u32 {
// Opcode is the first character, arguments are everything after the first char
let opcode = instruction.chars().collect::<Vec<char>>()[0];
let arguments = &instruction[1..];
// Only a subset of opcodes, because the others don't make sense in a function
match opcode {
'a' => eval::do_math(self.args_or_vars(arguments), '+'),
's' => eval::do_math(self.args_or_vars(arguments), '-'),
'm' => eval::do_math(self.args_or_vars(arguments), '*'),
'd' => eval::do_math(self.args_or_vars(arguments), '/'),
'l' => {self.add_var(arguments);0}
_ => panic!("SyntaxError: No such opcode: {}", self.pc),
}
}
fn args_or_funcs(&mut self, arguments: &str) -> String {
let mut builder = String::from("");
let argument_vec: Vec<char> = arguments.chars().collect();
for index in 0..argument_vec.len() {
let current_char = argument_vec[index];
let str_to_push: String;
if current_char == '*' {
let func_name = argument_vec[index+1];
let body: String;
let key = (self).funcs.get(&func_name);
match key {
Some(content) => body = content.to_owned(),
None => panic!("ValueError: function {} has not been defined yet!", func_name)
}
str_to_push = self.parse_funcs(&body).to_string();
} else {
str_to_push = current_char.to_string();
}
builder.push_str(&str_to_push);
}
builder
}
fn parse(&mut self, instruction: &String) {
// Opcode is the first character, arguments are everything after the first char
let opcode = instruction.chars().collect::<Vec<char>>()[0];
let arguments = &instruction[1..];
match opcode {
'p' => println!("{}", self.args_or_vars(arguments)),
'p' => println!("{}", self.args_or_funcs(&self.args_or_vars(arguments))),
'a' => println!("{}", eval::do_math(self.args_or_vars(arguments), '+')),
's' => println!("{}", eval::do_math(self.args_or_vars(arguments), '-')),
'm' => println!("{}", eval::do_math(self.args_or_vars(arguments), '*')),