diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/compiler.rs | 15 | ||||
| -rw-r--r-- | src/vm.rs | 14 |
2 files changed, 18 insertions, 11 deletions
diff --git a/src/compiler.rs b/src/compiler.rs index ca4fcd3..d3d4c2c 100644 --- a/src/compiler.rs +++ b/src/compiler.rs @@ -6,9 +6,11 @@ struct Compiler { tokens: TokenStream, } +//TODO rustify const PREC_NO: u64 = 0; -const PREC_TERM: u64 = 1; -const PREC_FACTOR: u64 = 2; +const PREC_COMP: u64 = 1; +const PREC_TERM: u64 = 2; +const PREC_FACTOR: u64 = 3; impl Compiler { pub fn new(tokens: TokenStream) -> Self { @@ -45,6 +47,8 @@ impl Compiler { Token::Star => PREC_FACTOR, Token::Slash => PREC_FACTOR, + Token::EqualEqual => PREC_COMP, + _ => PREC_NO, } } @@ -71,6 +75,8 @@ impl Compiler { Token::Slash => self.binary(block), Token::Star => self.binary(block), + Token::EqualEqual => self.binary(block), + _ => { return false; }, } return true; @@ -87,13 +93,13 @@ impl Compiler { fn grouping(&mut self, block: &mut Block) { if Token::LeftParen != self.eat() { - self.error("Expected left parentasis around expression."); + self.error("Expected left parenthesis around expression."); } self.expression(block); if Token::RightParen != self.eat() { - self.error("Expected closing parentasis after expression."); + self.error("Expected closing parenthesis after expression."); } } @@ -115,6 +121,7 @@ impl Compiler { Token::Minus => Op::Sub, Token::Star => Op::Mul, Token::Slash => Op::Div, + Token::EqualEqual => Op::CompEq, _ => { self.error("Illegal operator"); } }; block.add(op); @@ -1,5 +1,5 @@ -#[derive(Debug, Clone, Copy)] +#[derive(Debug, Clone, Copy, PartialEq)] pub enum Value { Float(f64), Int(i64), @@ -17,6 +17,8 @@ pub enum Op { Div, Neg, + CompEq, + Print, Return, } @@ -143,12 +145,10 @@ impl VM { } } - Op::Mul => { - todo!(); - } - - Op::Div => { - todo!(); + Op::CompEq => { + let b = self.stack.pop().unwrap(); + let a = self.stack.pop().unwrap(); + self.stack.push(Value::Bool(a == b)); } Op::Print => { |
