commit 0355142103f573d22b1796f048958f06c3af70a0
parent 1a811c650f8943ee1df22b40308f6891f14ce6a5
Author: ~karx <karx@tilde.team>
Date: Mon, 8 Feb 2021 15:30:20 +0000
Implement functions
Diffstat:
M | src/main.rs | | | 47 | ++++++++++++++++++++++++++++++++++++++++++++++- |
1 file changed, 46 insertions(+), 1 deletion(-)
diff --git a/src/main.rs b/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), '*')),