Implement functions
This commit is contained in:
parent
1a811c650f
commit
0355142103
47
src/main.rs
47
src/main.rs
|
@ -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), '*')),
|
||||
|
|
Loading…
Reference in New Issue