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);
|
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) {
|
fn parse(&mut self, instruction: &String) {
|
||||||
// Opcode is the first character, arguments are everything after the first char
|
// Opcode is the first character, arguments are everything after the first char
|
||||||
let opcode = instruction.chars().collect::<Vec<char>>()[0];
|
let opcode = instruction.chars().collect::<Vec<char>>()[0];
|
||||||
let arguments = &instruction[1..];
|
let arguments = &instruction[1..];
|
||||||
|
|
||||||
match opcode {
|
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), '+')),
|
'a' => println!("{}", eval::do_math(self.args_or_vars(arguments), '+')),
|
||||||
's' => 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), '*')),
|
'm' => println!("{}", eval::do_math(self.args_or_vars(arguments), '*')),
|
||||||
|
|
Loading…
Reference in New Issue