Compare commits
3 Commits
fa47f96149
...
0fbdcdfec0
Author | SHA1 | Date |
---|---|---|
~karx | 0fbdcdfec0 | |
~karx | 37d0919655 | |
~karx | 5fee22016c |
|
@ -1,5 +1,40 @@
|
|||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
[[package]]
|
||||
name = "aho-corasick"
|
||||
version = "0.7.15"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7404febffaa47dac81aa44dba71523c9d069b1bdc50a77db41195149e17f68e5"
|
||||
dependencies = [
|
||||
"memchr",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "memchr"
|
||||
version = "2.3.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525"
|
||||
|
||||
[[package]]
|
||||
name = "regex"
|
||||
version = "1.4.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "957056ecddbeba1b26965114e191d2e8589ce74db242b6ea25fc4062427a5c19"
|
||||
dependencies = [
|
||||
"aho-corasick",
|
||||
"memchr",
|
||||
"regex-syntax",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "regex-syntax"
|
||||
version = "0.6.23"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "24d5f089152e60f62d28b835fbff2cd2e8dc0baf1ac13343bef92ab7eed84548"
|
||||
|
||||
[[package]]
|
||||
name = "sandwich"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"regex",
|
||||
]
|
||||
|
|
|
@ -7,3 +7,4 @@ edition = "2018"
|
|||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
regex = "1"
|
||||
|
|
48
src/main.rs
48
src/main.rs
|
@ -4,6 +4,8 @@ use std::fmt;
|
|||
use std::fs;
|
||||
use std::usize;
|
||||
|
||||
use regex::Regex;
|
||||
|
||||
mod eval;
|
||||
|
||||
struct Program {
|
||||
|
@ -198,21 +200,55 @@ impl Program {
|
|||
}
|
||||
}
|
||||
|
||||
fn handle_if_statement(&mut self, arguments: String) {
|
||||
let argument_vec: Vec<&str> = arguments.split(":").collect();
|
||||
|
||||
let condition = argument_vec[0];
|
||||
let success = argument_vec[1];
|
||||
let failure = argument_vec[2];
|
||||
|
||||
|
||||
let re = Regex::new(r"(?P<num1>\d+)(?P<operator>==|!=|>|<|>=|<=)(?P<num2>\d+)").unwrap();
|
||||
let caps = re.captures(condition).unwrap();
|
||||
let num1 = &caps["num1"];
|
||||
let operator = &caps["operator"];
|
||||
let num2 = &caps["num2"];
|
||||
|
||||
let meets_condition: bool;
|
||||
|
||||
match operator {
|
||||
"==" => meets_condition = num1 == num2,
|
||||
"!=" => meets_condition = num1 != num2,
|
||||
">" => meets_condition = num1 > num2,
|
||||
"<" => meets_condition = num1 < num2,
|
||||
">=" => meets_condition = num1 >= num2,
|
||||
"<=" => meets_condition = num1 <= num2,
|
||||
_ => panic!("SyntaxError: Unknown operator at opcode {}: {}", self.pc, operator)
|
||||
};
|
||||
|
||||
if meets_condition {
|
||||
self.parse(&(success.to_string()));
|
||||
} else {
|
||||
self.parse(&(failure.to_string()));
|
||||
}
|
||||
}
|
||||
|
||||
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 = eval::args_or_comments(&instruction[1..]);
|
||||
|
||||
if opcode != '#' {
|
||||
let arguments = self.args_or_funcs(&self.args_or_vars(&eval::args_or_comments(&instruction[1..])));
|
||||
match opcode {
|
||||
'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), '*')),
|
||||
'd' => println!("{}", eval::do_math(self.args_or_vars(&arguments), '/')),
|
||||
'p' => println!("{}", arguments),
|
||||
'a' => println!("{}", eval::do_math(arguments, '+')),
|
||||
's' => println!("{}", eval::do_math(arguments, '-')),
|
||||
'm' => println!("{}", eval::do_math(arguments, '*')),
|
||||
'd' => println!("{}", eval::do_math(arguments, '/')),
|
||||
'l' => self.add_var(&arguments),
|
||||
'f' => self.add_func(&arguments),
|
||||
'i' => self.run_external(arguments),
|
||||
'?' => self.handle_if_statement(arguments),
|
||||
_ => panic!("SyntaxError at opcode {}: Unknown opcode {}", self.pc, opcode),
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue