aboutsummaryrefslogtreecommitdiffstats
path: root/src/vm.rs
diff options
context:
space:
mode:
authorEdvard Thörnros <edvard.thornros@gmail.com>2021-01-09 18:37:08 +0100
committerEdvard Thörnros <edvard.thornros@gmail.com>2021-01-09 18:37:08 +0100
commit97e77b94646fe97a2c83ba85ba1813eb9bd0346a (patch)
tree8b8209e34700904c4e02cf623b1cb1930b52982d /src/vm.rs
parentefaab433309170e8330a7722e90c26a93dbec252 (diff)
downloadsylt-97e77b94646fe97a2c83ba85ba1813eb9bd0346a.tar.gz
Parsing simple mathematical expressions
Diffstat (limited to 'src/vm.rs')
-rw-r--r--src/vm.rs12
1 files changed, 12 insertions, 0 deletions
diff --git a/src/vm.rs b/src/vm.rs
index 6b64928..7ab2235 100644
--- a/src/vm.rs
+++ b/src/vm.rs
@@ -10,10 +10,13 @@ pub enum Value {
pub enum Op {
Pop,
Constant(Value),
+
Add,
Sub,
Mul,
Div,
+ Neg,
+
Print,
Return,
}
@@ -91,6 +94,15 @@ impl VM {
self.stack.push(value);
}
+ Op::Neg => {
+ let a = self.stack.pop().unwrap();
+ match a {
+ Value::Float(a) => self.stack.push(Value::Float(-a)),
+ Value::Int(a) => self.stack.push(Value::Int(-a)),
+ _ => unimplemented!("Cannot negate '{:?}'.", a),
+ }
+ }
+
Op::Add => {
let b = self.stack.pop().unwrap();
let a = self.stack.pop().unwrap();